Skąd mam wiedzieć, czy mój tunel ssh został pomyślnie utworzony?

21

Opieram się na następującym skrypcie tunnel.shnapisanym przez innych, aby utrzymać tunel ssh przy życiu:

#!/bin/bash
export SSH_HOST=tim@server 

if [ ! -f /tmp/.tunnel ] 
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" & 
touch /tmp/.tunnel 
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel" 
rm /tmp/.tunnel 
fi
exit

Aby stworzyć trwały tunel ssh, po prostu wydaje tunnel.sh. Tunel nie zostanie zamknięty, dopóki nie wydam tunnel.shponownie.

Zastanawiałem się, jak mogę sprawdzić, czy tunel ssh rzeczywiście został pomyślnie utworzony?

Moim głównym zastosowaniem tunelu jest drukowanie dokumentów na niektórych drukarkach w tej samej sieci LAN co serwer, a do drukarek można uzyskać dostęp tylko z sieci LAN. Po utworzeniu tunelu drukowanie teraz nie zgłasza żadnego problemu, ale ponieważ nie ma go fizycznie, nie mogę sprawdzić, czy dokumenty rzeczywiście zostały wydrukowane.

Pomyślałem, że skoro jestem teraz w sieci LAN dzięki tunelowi, moje zewnętrzne IP powinno być takie samo jak serwera. Ale tak naprawdę nie są takie same (dowiedziałem się o nich wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'). Zastanawiam się dlaczego? Kiedy łączę się z jakąś witryną w Internecie z tunelem żywym, czy serwer nie jest punktem środkowym między mną a witryną internetową w związku z powodu tunelu między mną a serwerem?

Tim
źródło

Odpowiedzi:

25

To o wiele bardziej skomplikowane, niż trzeba :-)

Rozpocznij tunel:

ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"

Zatrzymaj tunel:

ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST

.

To wszystko, co musisz zrobić. Jeśli chcesz poznać szczegóły, pomiń poniżej.

W przypadku drugiego pytania - IP. Nie, twoje IP się nie zmienia. Wystarczyło utworzyć proxy SOCKS za pośrednictwem zdalnego hosta. Twój system nie korzysta automatycznie z tego serwera proxy, chyba że o to poprosisz.

Wyjaśnienie SSH
Argumenty za uruchomieniem tunelu
-f:: Powiedz ssh, aby sam uruchomił się w tle. Będzie działał w tle tylko wtedy, gdy uruchomi się pomyślnie (współpracuje z -oargumentem poniżej).
-o ExitOnForwardFailure=yes: Mówi ssh, aby zakończył pracę, jeśli nie może skonfigurować proxy SOCKS.
-N: Nie wykonuj polecenia. Chcemy tylko tunelować, nie robić nic na zdalnym hoście.
-D 9999: Twój serwer proxy SOCKS.
-M: Jest to wymagane do działania argumentu -S.
-S /tmp/ssh_tunnel_%h.sock: Mówi to, aby używał /tmp/ssh_tunnel_HOSTNAME.sock jako gniazda kontrolnego. Ta -Mopcja mówi, że ssh musi ustawić to gniazdo i nie wydawać poleceń innemu ssh, który już nasłuchuje na gnieździe. Możesz użyć tego gniazda do skonfigurowania dodatkowych tuneli po uruchomieniu ssh. The%h używa nazwy hosta zdalnego hosta jako części nazwy pliku.

Argumenty za zatrzymaniem tunelu
-S /tmp/ssh_tunnel_%h.sock:: To powinno być oczywiste. Ponieważ jednak nie wydaliśmy -M, oznacza to, że ssh powinien podłączyć się do gniazda, które już tam jest i powiedzieć mu, co ma robić, zamiast robić cokolwiek samodzielnie.
-O exit: To część -S. Mówimy ssh nasłuchując na gnieździe, aby wyjść.
Jest $SSH_HOSTto nadal wymagane tutaj. Nawet jeśli podasz bezwzględną ścieżkę gniazda, bez użycia %hnazwy pliku, ssh nadal będzie chciał określić zdalny host. Dlatego włożyłem %hargumenty. Równie dobrze można go użyć, jeśli ssh ma zamiar poprosić o hosta i utrzymuje porządek.

Patrick
źródło
5

Ten typ tunelu nie zmienia informacji o adresie IP. Wystarczy, że powiesz komputerowi, aby otworzył port 9999 i przekierował połączenia do tego portu do komputera zdalnego (tim @ server) za pośrednictwem połączenia ssh. Najłatwiejszym sposobem sprawdzenia, czy połączenie jest aktywne, jest telnet do portu, na którym zostało utworzone przekazanie (w twoim przykładzie 9999):

$ telnet localhost 9999
Próbowanie serwera ...
Połączono z serwerem.
Znakiem ucieczki jest „^]”.

Jeśli pojawi się komunikat „Połączono z serwerem”. wiadomość oznacza, że ​​twój tunel jest włączony. Jeśli zamiast tego pojawi się komunikat: „Nie można połączyć się ze zdalnym hostem: odmowa połączenia”, twój tunel nie działa.

Jeśli chodzi o twoje drugie pytanie, w twojej przeglądarce przeglądarka nie będzie korzystała z tunelu, chyba że o to poprosisz. W ustawieniach sieciowych przeglądarek możesz skonfigurować ustawienia proxy i określić localhost: 9999 jako proxy socks5, a następnie twoje połączenia internetowe powinny korzystać z tunelu ssh i wyglądać, jakby pochodziły z adresu IP serwera.

Gabe.
źródło
+1 dzięki! (1) Kiedy drukuję na drukarce w sieci LAN, skąd wiadomo, aby przejść do portu 9999, tj. Skorzystać z tunelu? Nic więcej? (2) Czy istnieją typy tuneli, które zmieniają informacje o moim adresie IP?
Tim
@ Czasowo ta konkretna drukarka została skonfigurowana do drukowania na określonym adresie IP i porcie. Zależy to od konfiguracji drukarki. Zazwyczaj można określić oba te parametry podczas definiowania drukarki. Tak, istnieją typy tuneli, które będą powiązane z własnymi informacjami IP. Generalnie dla nich tworzysz osobny interfejs tun / tap en.wikipedia.org/wiki/TUN/TAP , który będzie miał dołączony własny adres IP, a cały ruch wychodzący z tego adresu będzie wyglądał na pochodzący z innej sieci .
Gabe.
Dzięki! W preferencjach Firefoksa, w zaawansowanych -> połączenie -> ustawienia, wybieram ręczną konfigurację proxy i wpisuję „localhost” dla HTTP Proxy i „9999” dla jego portu. Po tym nie mogę połączyć się z żadną witryną w przeglądarce Firefox. Zastanawiam się dlaczego?
Tim
@Tim to trochę mylące ... właściwą rzeczą jest ustawienie: SOCKS Host, a nie HTTP Proxy. Ten sam problem miałem po raz pierwszy.
Gabe.
1

W moim przypadku (Google Chrome na Ubuntu 14.10) mój adres zewnętrzny się zmienia, przynajmniej w przeglądarce. Wystarczy google „Jaki jest mój adres IP?” z połączeniem proxy i bez niego.

Ponadto po skonfigurowaniu serwera proxy spróbuj zniszczyć tunel i sprawdź, czy nadal można uzyskać ruch. Kiedy to robię, chrome zwraca błąd „Nie można połączyć się z serwerem proxy”.

Inny sposób: po tunelowaniu do zdalnego hosta utwórz nową sesję ssh i uruchom tcpdump -A dst port 80. Następnie przejdź do jakiejś strony i powinieneś zobaczyć powiązany ruch w terminalu.

onlyanegg
źródło