Jak rozumiem, zapory ogniowe (zakładając ustawienia domyślne) odrzucają cały ruch przychodzący, który nie ma wcześniejszego ruchu wychodzącego.
Bazując na odwróceniu połączenia ssh i łatwym tunelowaniu SSH, odwrotnego tunelowania SSH można użyć do ominięcia przykrych ograniczeń zapory.
Chciałbym wykonywać polecenia powłoki na zdalnym komputerze. Zdalna maszyna ma własną zaporę i znajduje się za dodatkową zaporą (routerem). Ma adres IP jak 192.168.1.126 (lub coś podobnego). Nie jestem za zaporą ogniową i znam adres IP zdalnego komputera widziany z Internetu (nie adres 192.168.1.126). Dodatkowo mogę ssh (something)
najpierw poprosić kogoś o wykonanie jako root na zdalnym komputerze.
Czy ktoś mógłby mi wyjaśnić, krok po kroku, jak działa tunelowanie zwrotne SSH, aby ominąć zapory ogniowe (zapory lokalne i zdalne komputerów oraz dodatkowa zapora między nimi)?
Jaka jest rola przełączników ( -R
, -f
, -L
, -N
)?
Odpowiedzi:
Uwielbiam wyjaśniać tego rodzaju rzeczy poprzez wizualizację. :-)
Pomyśl o swoich połączeniach SSH jak o lampach. Duże rurki. Zwykle sięgasz przez te rurki, aby uruchomić powłokę na zdalnym komputerze. Powłoka działa w terminalu wirtualnym (tty). Ale znasz już tę część.
Pomyśl o swoim tunelu jak o rurze w rurze. Nadal masz duże połączenie SSH, ale opcja -L lub -R pozwala ustawić w nim mniejszą rurkę.
Każda rura ma początek i koniec. Duża rura, twoje połączenie SSH, zaczęło się od klienta SSH i kończy na serwerze SSH, z którym się połączyłeś. Wszystkie mniejsze rurki mają te same punkty końcowe, z tym wyjątkiem, że rola „początku” lub „końca” zależy od tego, czy je utworzyłeś (
-L
lub-R
).(Nie powiedziałeś, ale założę, że „zdalna” maszyna, o której wspomniałeś, ta za zaporą, może uzyskać dostęp do Internetu za pomocą translacji adresów sieciowych (NAT). Jest to trochę ważne, więc popraw to założenie, jeśli jest fałszywe).
Podczas tworzenia tunelu podajesz adres i port, na który będzie on odpowiadał, oraz adres i port, na który zostanie dostarczony. Ta
-L
opcja informuje tunel, aby odpowiedział po lokalnej stronie tunelu (host, na którym działa klient). Ta-R
opcja informuje tunel, aby odpowiedział po stronie zdalnej (serwer SSH).Więc ... Aby móc połączyć się z Internetem przez SSH na maszynie za zaporą ogniową, potrzebujesz tego komputera, aby otworzyć połączenie SSH ze światem zewnętrznym i dołączyć
-R
tunel, którego punktem wejścia jest „zdalna” strona jego połączenie.Z dwóch modeli pokazanych powyżej chcesz ten po prawej.
Z hosta zaporowego:
To mówi Twojemu klientowi, aby założył tunel z
-R
punktem wejścia emotki. Wszystko, co zostanie dołączone do portu 22222 na drugim końcu tunelu, faktycznie osiągnie „port localhost 22”, gdzie „localhost” jest z punktu widzenia punktu wyjścia tunelu (tj. Klienta ssh).Inne opcje to:
-f
mówi ssh, aby sam się w tle po uwierzytelnieniu, więc nie musisz siedzieć i uruchamiać czegoś na zdalnym serwerze, aby tunel pozostał przy życiu.-N
mówi, że chcesz mieć połączenie SSH, ale tak naprawdę nie chcesz uruchamiać żadnych zdalnych poleceń. Jeśli wszystko, co tworzysz, to tunel, to włączenie tej opcji oszczędza zasoby.-T
wyłącza alokację pseudo-tty, co jest odpowiednie, ponieważ nie próbujesz utworzyć interaktywnej powłoki.Nie będzie hasła, chyba że skonfigurujesz klucze DSA lub RSA do logowania bez hasła.
Pamiętaj, że jest zdecydowanie zalecane, abyś używał konta „wyrzucanego” (nie własnego loginu), które skonfigurowałeś tylko dla tego tunelu / klienta / serwera.
Teraz z poziomu swojej powłoki na swoim serwerze publicznym nawiąż połączenie z hostem zaporowym przez tunel:
Dostaniesz główne wyzwanie hosta, ponieważ prawdopodobnie nigdy wcześniej nie trafiłeś na tego hosta. Następnie otrzymasz wyzwanie dla hasła do
username
konta (chyba że skonfigurowałeś klucze do logowania bez hasła).Jeśli zamierzasz regularnie uzyskiwać dostęp do tego hosta, możesz również uprościć dostęp, dodając kilka wierszy do
~/.ssh/config
pliku:Dostosuj
remotehostname
i dopasujremoteusername
.remoteusername
Pole musi dopasować swoją nazwę użytkownika na zdalnym serwerze, aleremotehostname
może być dowolna nazwa hosta, który ci odpowiada, że nie ma nic, aby dopasować rozpoznawana.(Aby ujawnić odwrotny punkt końcowy na nielokalnym adresie IP hosta , sprawdź ten post )
źródło
Narysowałem kilka szkiców
Maszyna, na której wpisano polecenie tunelu ssh, nosi nazwę »twój host« .
Wprowadzenie
lokalny:
-L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.
ssh -L sourcePort:forwardToHost:onPort connectToHost
oznacza: połącz się z ssh doconnectToHost
i przekieruj wszystkie próby połączenia do lokalnegosourcePort
na portonPort
na wywoływanej maszynieforwardToHost
, do którego można dotrzeć zconnectToHost
maszyny.zdalny:
-R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.
ssh -R sourcePort:forwardToHost:onPort connectToHost
oznacza: połącz się z ssh doconnectToHost
i przekaż wszystkie próby połączenia do pilotasourcePort
do portuonPort
na wywoływanym komputerzeforwardToHost
, do którego można dotrzeć z twojego komputera lokalnego.Dodatkowe opcje
-f
mówi ssh, aby sam się w tle po uwierzytelnieniu, więc nie musisz siedzieć i uruchamiać czegoś na zdalnym serwerze, aby tunel pozostał przy życiu.-N
mówi, że chcesz mieć połączenie SSH, ale tak naprawdę nie chcesz uruchamiać żadnych zdalnych poleceń. Jeśli wszystko, co tworzysz, to tunel, to włączenie tej opcji oszczędza zasoby.-T
wyłącza alokację pseudo-tty, co jest odpowiednie, ponieważ nie próbujesz utworzyć interaktywnej powłoki.Twój przykład
Trzeci obraz przedstawia ten tunel. Ale niebieski komputer o nazwie „twój host” reprezentuje komputer, na którym ktoś rozpoczyna tunel ssh, w tym przypadku zaporę maszynową.
Poproś kogoś, aby rozpoczął połączenie tunelowe ssh z twoim komputerem. Polecenie powinno w zasadzie wyglądać
Teraz tunel jest otwarty. Możesz teraz połączyć się przez ssh z zaporą ogniową przez tunel za pomocą polecenia
który połączy się z twoim
localhost
(twoim komputerem) na porcie12345
, ale port12345
jest przekierowywany przez tunel do portu 22 lokalnego hosta zapory ogniowej (tj. samego zapory ogniowej).źródło
Tunelowanie ssh działa przy użyciu już ustanowionego połączenia ssh do wysyłania dodatkowego ruchu.
Kiedy łączysz się ze zdalnym serwerem, zwykle masz tylko 1 kanał do normalnej interakcji użytkownika (lub 3 kanały, jeśli uważasz, że STDIN / STDOUT / STDERR są osobne). W dowolnym momencie lokalny lub zdalny proces ssh może otworzyć dodatkowe kanały dla istniejącego połączenia. Kanały te następnie wysyłają / odbierają ruch tunelowy. Podczas wysyłania lub odbierania jakiegokolwiek ruchu, proces ssh po prostu mówi „ten ruch jest dla foobar kanału”.
Zasadniczo działa tak:
127.0.0.1
, ale można go zmienić).Ten proces jest dokładnie taki sam dla tunelowania do przodu i do tyłu (wystarczy zamienić słowa „lokalny” i „zdalny” w powyższej procedurze). Każda ze stron może rozpocząć tunel. Nie musi tak być nawet przy pierwszym uruchomieniu ssh. Możesz otwierać tunele, gdy ssh jest już uruchomiony (patrz
ESCAPE CHARACTERS
w szczególności~C
).Do roli
-R
,-f
,-L
, i-N
, naprawdę powinni po prostu skonsultować stronę man, to daje najlepsze możliwe wyjaśnienie. Ale wspomnę-R
i-L
.-R
mówi zdalnemu ssh, aby nasłuchiwał połączeń, a lokalny ssh powinien połączyć się z rzeczywistym miejscem docelowym.-L
mówi lokalnemu ssh, aby nasłuchiwał połączeń, a ten zdalny ssh powinien połączyć się z rzeczywistym miejscem docelowym.Uwaga: jest to bardzo przybliżony opis, ale powinien dostarczyć wystarczającej ilości informacji, aby wiedzieć, co się dzieje
źródło
Jest to wyjaśnione w instrukcji SSH, zwłaszcza różnice między
-L
(lokalnymi) a-R
(zdalnymi).-L
Poniższy przykład tuneluje sesję IRC z komputera klienta
127.0.0.1
(localhost
) przy użyciu portu 1234 do zdalnego serweraserver.example.com
:Uwaga: Określono
-f
opcję tła ssh i komendę zdalną,sleep 10
aby dać czas na uruchomienie usługi, która ma być tunelowana.Przykład:
-N
Po podłączeniu po prostu poczekaj (nie pojawi się monit powłoki)-L 22000
Połączenie będzie pochodzić na porcie 22000 swojego osobistego, L maszynie OCALlocalhost:11000
-remote.server.com
upewni się, że drugim końcem tunelu jestlocalhost
port11000
Źródło: Ilustrowany przewodnik, samouczek, porady dotyczące tunelowania ssh .
-R
Przykład:
-N
Po podłączeniu po prostu poczekaj (nie pojawi się monit powłoki)-R
22000 Połączenie powstanie na porcie 22000 komputera zdalnego R (w tym przypadku remote.server.com)localhost:11000
Twój osobisty komputer lokalny upewni się, że drugim końcem tunelu jestlocalhost
port11000
Źródło: Ilustrowany przewodnik, samouczek, porady dotyczące tunelowania ssh .
źródło