Як переслати порт з однієї машини на іншу?


19

Розглянемо таку ситуацію:

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

Іноді я хочу зробити якийсь додаток (який слухає на якомусь порту в М, наприклад 8888), доступним із зовнішнього Інтернету.

Для цього я хотів встановити якийсь порт на S (2222) для переадресації на порт 8888 М, щоб кожен, хто звертався до S: 2222, відчував, що він звертається до M: 8888.

Я намагався використовувати переадресацію порту ssh, найкраща моя спроба:

ssh -L 2222:M:8888 -N M

Але це дозволяє мені отримати доступ до порту 2222 з самого сервера, а не з інших машин.

Чи є спосіб зробити це правильно? Переважно, я хотів би, щоб це була проста команда, яку я міг би запускати і закривати з ^ C, коли мені вже не потрібно це переадресація.


Спробуйте localhost.run - це веб-сайт, на який ви можете зайти на localhost.run Я думаю, що є спосіб вивести свій товар там ..
Angelena Neilsomt

Відповіді:


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-ing, - якщо я правильно розумію ваше запитання.

Отже, команда стане такою:

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.


1
Спасибі! Це працює! Але є деякі дивацтва - чомусь висновок містить рядок "прив’язати: Адреса вже використовується". Що це може означати?
Рогач

1
У вас уже є якийсь процес, запущений на цьому порту. Використовуйте ту ж netstatкоманду, щоб дізнатися, що саме. Можливо, інший подібний SSH все ще працює у фоновому режимі і вбиває його за допомогою PID netstat.
gertvdijk

Приємно, що я вже це зробив - жодних процесів у цих портах, як на S, так і на М. Якби їх було, то вся конструкція, ймовірно, не спрацювала б.
Рогач

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 (Network Address Translation).


1
Оскільки ви тут робите лише NAT, на відміну від джерела NAT, це надійно працюватиме лише в конкретних ситуаціях і може вимагати зміни таблиць маршрутизації. Для переадресації до віртуальних машин (M), що працюють на хості (S), це може бути добре.
gertvdijk

Ця команда повинна бути видана на шлюзі. Я припускаю, що S і M знаходяться в одній локальній мережі. Джерело NAT здійснюватиметься автоматично трекером з'єднань у сучасних Linux ядрах. У мене в офісній мережі є така конфігурація, і вона працює чудово. Однак можна зробити команду більш конкретною (наприклад, розповісти iptables -i eth0, де eth0 - зовнішній інтерфейс).
Гевіал

Якщо S і M знаходяться в одній локальній мережі, вам не потрібно переадресація портів, оскільки трафік між ними не проходить шлюз.
gertvdijk

1
Так, але підключення до М: 8888 зроблено з Інтернету. Хтось формує Інтернет -> S: 2222 -> Маршрутизатор M і S LAN з iptables -> M: 8888
Gevial

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.