it-swarm-ru.tech

Простой способ создать туннель от одного локального порта к другому?

У меня есть сервер разработки, который доступен только с 127.0.0.1:8000, а не с 192.168.1.x: 8000. Как быстрый взлом, есть ли способ настроить что-то для прослушивания на другом порту (скажем, 8001), чтобы из локальной сети я мог подключить 192.168.1.x: 8001, и это туннелирует трафик между клиентом и 127.0 .0.1: 8000?

83
waitinforatrain

Использование ssh - самое простое решение.

ssh -g -L 8001: локальный хост: 8000 -f -N [email protected]

Это перенаправляет локальный порт 8001 на вашей рабочей станции на адрес localhost на порту 8000 remote-server.com.
-g означает, что разрешить другим клиентам в моей сети подключаться к порту 8001 на моей рабочей станции. В противном случае только локальные клиенты на вашей рабочей станции могут подключаться к перенаправленному порту.
-N означает, что все, что я делаю, это переадресация портов, не запускаю Shell.
-f означает переход в фоновый режим после успешного подключения SSH и входа в систему.
Порт 8001 будет оставаться открытым для многих соединений, пока ssh не умрет или не будет убит. Если вы оказались в Windows, превосходный SSH-клиент PuTTY также может это сделать. Используйте 8001 в качестве локального порта и localhost: 8000 и пункт назначения и добавьте переадресацию локального порта в настройках. Вы можете добавить его после успешного соединения с PuTTY.

48
penguin359

С socat на сервере:

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000

По умолчанию socat будет прослушивать TCP порт 8001 на любом IPv4 или IPv6-адресе (если поддерживается) на машине. Вы можете ограничить его IPv4/6, заменив tcp-listen с tcp4-listen или tcp6-listen или по определенному локальному адресу, добавив ,bind=that-address.

То же самое для соединительного сокета, к которому вы подключаетесь, вы можете использовать любой адрес вместо localhost и ​​заменить tcp на tcp4 или tcp6, если вы хотите ограничить разрешение адресов адресами IPv4 или IPv6.

Обратите внимание, что для сервера, прослушивающего порт 8000, соединение будет выглядеть как исходящее от прокси-сервера (в случае localhost, это будет localhost), а не от исходного клиента. Вам нужно было бы использовать подход DNAT (но для этого требуются привилегии суперпользователя), чтобы сервер мог определить, кто является клиентом.

105
Stéphane Chazelas

Использование традиционного nc является самым простым решением:

nc -l -p 8001 -c "nc 127.0.0.1 8000"

Эта версия nc находится в netcat-traditional пакет в Ubuntu. (Вы должны update-alternatives или назовите это nc.traditional.)

Обратите внимание, что в отличие от ssh это не зашифровано. Имейте это в виду, если вы используете его за пределами одного хоста.

50
not-a-user

NetBSD Netcat доступен по умолчанию в Linux, а также в OS X.

OSX:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

Linux:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

Альтернатива, которая работает в OS X bash, - это использовать двунаправленный канал . Это может работать на других Unixes:

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0
27
Mark A.

Цитировать Дэвид Спиллетт 's ответ на ServerFault

rinetd должен выполнить эту работу, и бинарный файл Windows для него можно получить по адресу http://www.boutell.com/rinetd/ (для тех, кто ищет то же самое в Linux, rinetd находится в стандартные репозитории практически для каждого дистрибутива, поэтому их можно установить с помощью "apt-get install rinetd" или "yum install rinetd" или аналогичных)

Это простой двоичный файл, который принимает файл конфигурации в формате

bindaddress bindport connectaddress connectport

Например:

192.168.1.1 8001 127.0.0.1 8000

или

0.0.0.0 8001 127.0.0.1 8000

если вы хотите привязать входящий порт ко всем интерфейсам.

4
psychowood
iptables -t nat -A PREROUTING -p tcp --dport <Origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart
3
Santanu Dey

Это новый способ туннелирования двух портов udp на сервере: https://github.com/9crk/udpeer

udpeer 8001 8002

Тестировать:

nc -u xxxx.com 8001
nc -u xxxx.com 8002
0
9crk

Основываясь на ответе Mark A. , мне пришлось сделать небольшой твик, чтобы он работал на моем Mac (по крайней мере, на MacOS Mojave версии 10.14.4)

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &
printf "" > a

Это заявление printf кажется решающим. В противном случае команда netcat для подключения к порту 8000 фактически никогда не попытается подключиться, а команда netcat для прослушивания порта 8001 никогда не будет прослушивать порт 8001. Без printf каждый раз, когда я пытаюсь подключиться к порту 8001, я получаю В соединении отказано.

Я предполагаю, что netcat должен каким-то образом блокировать стандартный ввод (может быть, он пытается прочитать его по какой-то причине) перед выполнением каких-либо операций с сокетом. Таким образом, без записи оператора printf в fifo a команда netcat никогда не начнет прослушивать порт 8001.

Примечание: я бы оставил ответ на пост Марка, но у меня пока нет репутации.

0
Daniel K