То, что вы ищете, называется обратным туннелем. 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.
Включение GatewayPorts
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.
Тестирование соединения (часть deux)
Теперь с нашей измененной настройкой, когда мы проверяем это время. Основное отличие состоит в том, что нам больше не нужно подключаться к 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 ~]$
Ссылки
Поскольку компьютер B не может получить доступ к компьютеру A, вам сначала нужно открыть удаленный туннель с компьютера A.
источник
не важно, я нашел ответ:
с компьютера А
РЕДАКТИРОВАТЬ: TL; DR, правильное решение:
источник