Как переадресовать порт с одной машины на другую?

19

Рассмотрим следующую ситуацию:

У меня дома есть маршрутизатор (который подключен к интернету), сервер (S) и мой основной компьютер (M). S доступен из Интернета (у него статический IP), и он работает 24/7, а M нет.

Иногда я хочу сделать какое-то приложение (которое слушает какой-то порт на M, например 8888) доступным из внешнего интернета.

Для этого я хотел настроить некоторый порт на S (2222) для переадресации на порт М 8888, чтобы любой, кто обращается к S: 2222, чувствовал, что он обращается к М: 8888.

Я попытался использовать переадресацию порта ssh, моя лучшая попытка была следующей:

ssh -L 2222:M:8888 -N M

Но это только позволяет мне получить доступ к порту 2222 с самого сервера, а не с других машин.

Есть ли способ сделать это правильно? Желательно, чтобы это была простая команда, которую я мог бы запускать и завершать с помощью ^ C, когда мне больше не нужна такая пересылка.

Рогач
источник
Попробуйте localhost.run, который является веб-сайтом, на который вы можете перейти по адресу localhost.run. Я думаю, что есть способ получить ваш продукт там
Ангелена Нилсомт

Ответы:

16

Да, это называется GatewayPortsв SSH. Выдержка из ssh_config(5):

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

И вы можете использовать localhostвместо Mпереадресации, так как вы пересылаете на тот же компьютер, на котором вы используете SSH - если я правильно понимаю ваш вопрос.

Итак, команда станет такой:

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

и будет выглядеть так netstat -nltp:

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

Теперь любой, кто получает доступ к этой машине через порт 2222, TCP будет на самом деле общаться с localhost: 8888, как видно на машине M. Обратите внимание, что это не то же самое, что обычная переадресация на порт 8888 M.

gertvdijk
источник
1
Благодарность! Это работает! Но есть некоторая странность - по какой-то причине вывод содержит строку «bind: Address уже используется». Что бы это могло значить?
Рогач
1
На этом порту уже запущен какой-то процесс. Используйте ту же netstatкоманду, чтобы узнать, что именно. Вероятно, другой подобный SSH все еще работает в фоновом режиме и уничтожает его с помощью netstat PID.
gertvdijk
Забавно то, что я уже сделал это - никаких процессов на этих портах, как на S, так и на M. Если бы они были, то вся конструкция, вероятно, не работала бы.
Рогач
10

Есть другой способ. Вы можете настроить переадресацию портов с S: 2222 на W: 8888 с помощью iptables. Одиночная команда:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

где 1.2.3.4 - IP-адрес М. Это называется NAT (трансляция сетевых адресов).

Gevial
источник
1
Так как здесь вы делаете только NAT назначения (в отличие от исходного NAT), это будет надежно работать только в определенных ситуациях и может потребовать изменения таблиц маршрутизации. Для пересылки на виртуальные машины (M), работающие на хосте (S), это может работать хорошо.
gertvdijk
Эта команда должна быть выдана на шлюзе. Я предполагаю, что S и M находятся в одной локальной сети. Исходный NAT будет выполняться автоматически через трекер соединений в современных ядрах Linux. У меня есть такой конфиг в моей офисной сети, и он отлично работает. Однако можно сделать команду более конкретной (например, сказать iptables -i eth0, где eth0 - внешний интерфейс).
Гевиал
Если S и M находятся в одной и той же локальной сети, вам не нужно перенаправлять порты туда, так как никакой трафик между ними не проходит через шлюз.
gertvdijk
1
Да, но подключение к M: 8888 сделано из Интернета, я полагаю. Кто-нибудь из Интернета -> S: 2222 -> M и S LAN маршрутизатор с iptables -> M: 8888
Gevial