Те, що ви шукаєте, називається зворотним тунелем. ssh
забезпечує через -R
комутатор:
-R [bind_address:]port:host:hostport
Specifies that the given port on the remote (server) host is to
be forwarded to the given host and port on the local side. This
works by allocating a socket to listen to port on the remote side,
and whenever a connection is made to this port, the connection is
forwarded over the secure channel, and a connection is made to host
port hostport from the local machine.
Як виявив ОП з їхньою відповіддю, синтаксис такий:
$ ssh -f -N -R vvv:localhost:22 w.x.y.z
Приклад
У мене є 2 комп’ютери в мережі, lappy
і remotey
. Тому я запускаю таку команду на lappy
:
$ ssh -f -N -R 12345:localhost:22 remotey
Я можу підтвердити, що це працює:
$ ps -eaf|grep "[l]ocalhost:22"
saml 27685 1 0 11:10 ? 00:00:00 ssh -f -N -R 12345:localhost:22 remotey
Тепер, якщо я ssh
окремо перейшов до віддаленої системи remotey
і запустив цю команду, я можу побачити, що він тепер приймає з'єднання на порту 12345 в локальному інтерфейсі віддаленої системи:
$ netstat -an|grep :12345
tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN
tcp 0 0 ::1:12345 :::* LISTEN
Тестування з'єднання
Видно, що зворотний ssh-тунель працює наступним чином.
увійти в remotey
[user@lappy ~]$ ssh remotey
випробувати зворотний порт тунелю
[user@remotey ~]$ ssh -p 12345 localhost
тепер слід повернутися до лаппі
user@localhost's password:
Last login: Thu Aug 1 17:53:54 2013
/usr/bin/xauth: creating new authority file /home/user/.Xauthority
[user@lappy ~]$
Порти на інших інтерфейсах, крім localhost ( lo
)?
Можливо, вам залишиться чухати голову, якщо ви спробуєте таку команду, яка, здається, не працює, або вона завжди прив'язується до порту lo
інтерфейсу localhost ( ).
Наприклад:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
ПРИМІТКА. Ця команда говорить про відкриття порту 12345 @ remotey та тунель будь-яких з'єднань з портом 22 @ lappy.
Потім на дистанційному:
remotey$ netstat -an|grep 12345
tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN
Те, що відбувається, - це те sshd
, що конфігурації не дозволяють вам цього робити. Насправді без цієї функції ( GatewayPorts
) ви не зможете прив’язати жодні ssh
порти тунелю до будь-якого, крім localhost.
Увімкнення шлюзів
remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no
Щоб увімкнути це, відредагуйте цей файл /etc/ssh/sshd_config
:
GatewayPorts clientspecified
І перезапустіть sshd
:
remotey$ sudo service sshd restart
Тепер спробуйте ще раз, і ми повинні побачити ефект, який ми шукаємо:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
І ще раз перевірте це на дистанційному:
remotey$ netstat -anp | grep 12345
tcp 0 0 192.168.1.3:12345 0.0.0.0:* LISTEN 9333/sshd
ПРИМІТКА: У вищесказаному ми бачимо, що sshd
процес тепер прослуховується в інтерфейсі, який має IP-адресу 192.168.1.3, для з'єднань порту 12345.
Тестування з'єднання (частина декс)
Тепер з нашими зміненими налаштуваннями, коли ми цього разу тестуємо. Основна відмінність полягає в тому, що нам більше не доводиться підключатися до localhost!
увійти в remotey
[user@lappy ~]$ ssh remotey
перевірити зворотне з'єднання
[user@remotey ~]$ ssh -p 12345 remotey
тепер слід повернутися до лаппі
root@remotey's password:
Last login: Wed Aug 21 01:49:10 2013 from remotey
[user@lappy ~]$
Список літератури