To, czego szukasz, nazywa się tunelem zwrotnym. ssh
zapewnia to przez -R
przełącznik:
-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.
Gdy OP odkrył swoją odpowiedź, składnia wygląda następująco:
$ ssh -f -N -R vvv:localhost:22 w.x.y.z
Przykład
Mam 2 komputery w sieci lappy
i remotey
. Więc uruchamiam następujące polecenie lappy
:
$ ssh -f -N -R 12345:localhost:22 remotey
Mogę potwierdzić, że działa:
$ ps -eaf|grep "[l]ocalhost:22"
saml 27685 1 0 11:10 ? 00:00:00 ssh -f -N -R 12345:localhost:22 remotey
Teraz, jeśli ssh
osobno przejdę do systemu zdalnego remotey
i uruchomię to polecenie, widzę, że teraz akceptuje połączenia na porcie 12345 na lokalnym interfejsie systemu zdalnego:
$ netstat -an|grep :12345
tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN
tcp 0 0 ::1:12345 :::* LISTEN
Testowanie połączenia
Możesz zobaczyć, że tunel zwrotny ssh działa w następujący sposób.
Zaloguj się do remotey
[user@lappy ~]$ ssh remotey
przetestuj port tunelu zwrotnego
[user@remotey ~]$ ssh -p 12345 localhost
powinien teraz wrócić do lappy
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 ~]$
Porty na interfejsach innych niż localhost ( lo
)?
Być może będziesz drapał się po głowie, jeśli spróbujesz wykonać takie polecenie i nie wydaje się ono działać lub zawsze wiąże się z portem lo
interfejsu localhost ( ).
Na przykład:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
UWAGA: To polecenie mówi, aby otworzyć port 12345 @ remotey i tunelować wszelkie połączenia z portem 22 @ lappy.
Następnie na pilocie:
remotey$ netstat -an|grep 12345
tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN
To, co się dzieje, to sshd
konfiguracje, które na to nie pozwalają. W rzeczywistości bez włączonej tej funkcji ( GatewayPorts
) nie będziesz w stanie powiązać żadnych ssh
portów tunelu z niczym innym niż localhost.
Włączanie GatewayPorts
remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no
Aby go włączyć, edytuj ten plik /etc/ssh/sshd_config
:
GatewayPorts clientspecified
I uruchom ponownie sshd
:
remotey$ sudo service sshd restart
Teraz spróbuj ponownie i powinniśmy zobaczyć efekt, którego szukamy:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
I dwukrotnie sprawdź to tym razem w pilocie:
remotey$ netstat -anp | grep 12345
tcp 0 0 192.168.1.3:12345 0.0.0.0:* LISTEN 9333/sshd
UWAGA: Powyżej widać, że sshd
proces nasłuchuje teraz na interfejsie, który ma adres IP 192.168.1.3, dla połączeń na porcie 12345.
Testowanie połączenia (część deux)
Teraz z naszą zmienioną konfiguracją, kiedy tym razem go testujemy. Podstawowa różnica polega na tym, że nie musimy już łączyć się z hostem lokalnym!
Zaloguj się do remotey
[user@lappy ~]$ ssh remotey
przetestuj odwrotne połączenie
[user@remotey ~]$ ssh -p 12345 remotey
powinien teraz wrócić do lappy
root@remotey's password:
Last login: Wed Aug 21 01:49:10 2013 from remotey
[user@lappy ~]$
Bibliografia
Ponieważ komputer B nie ma dostępu do komputera A, musisz najpierw otworzyć zdalny tunel z komputera A.
źródło
nieważne, znalazłem odpowiedź:
z komputera A
EDYCJA: TL; DR, prawidłowe rozwiązanie:
źródło