Tunelowanie danych przez SSH jest dość proste:
ssh -D9999 [email protected]
ustawia port 9999 na twoim localhost
tunelu do example.com
, ale mam bardziej konkretną potrzebę:
- Pracuję lokalnie
localhost
host1
jest dostępny dlalocalhost
host2
akceptuje tylko połączenia zhost1
- Muszę stworzyć tunel od
localhost
dohost2
Skutecznie chcę utworzyć tunel SSH „multi-hop”. Jak mogę to zrobić? Idealnie, chciałbym to zrobić bez konieczności bycia superużytkownikiem na żadnej z maszyn.
host2
odmówi przekazaniaOdpowiedzi:
Zasadniczo masz trzy możliwości:
Tunel od
localhost
dohost1
:Jak wspomniano powyżej, połączenie od
host1
dohost2
nie będzie zabezpieczone.Tunel od
localhost
dohost1
i odhost1
dohost2
:Spowoduje to otwarcie tunelu od
localhost
dohost1
i kolejnego tunelu odhost1
dohost2
. Jednak z portu,9999
z któregohost2:1234
może korzystać każdyhost1
. To może, ale nie musi stanowić problemu.Tunel od
localhost
dohost1
i odlocalhost
dohost2
:Spowoduje to otwarcie tunelu od
localhost
celuhost1
, przez którą na usługi SSHhost2
może być używany. Następnie otwierany jest drugi tunel odlocalhost
dohost2
pierwszego tunelu.Zwykle wybrałbym opcję 1. Jeśli połączenie z
host1
dohost2
musi być zabezpieczone, przejdź do opcji 2. Opcja 3 jest głównie przydatna, aby uzyskać dostęp do usługi,host2
która jest dostępna tylko od niejhost2
.źródło
-A
opcji ssh.-f
, natychmiast rozpocznie się lokalnie w tle, a zatemssh -f -L 9999:localhost:9999 host1
połączy się ponownie, jeśli w pierwszym przypadku naciśniesz ctrl-c. Lub dodaj-f
do oryginalnej podwójnej komendy ssh przy pierwszym uruchomieniu, aby natychmiast wszystko było w tle.Istnieje doskonała odpowiedź wyjaśniająca zastosowanie
ProxyCommand
dyrektywy konfiguracyjnej dla SSH :Dodaj to do
~/.ssh/config
(man 5 ssh_config
szczegóły):Następnie
ssh host2
automatycznie tunelujehost1
(działa również z przekazywaniem X11 itp.).Działa to również dla całej klasy hostów, np. Identyfikowanych według domeny:
Aktualizacja
OpenSSH 7.3 wprowadza się
ProxyJump
dyrektywę, upraszczając pierwszy przykład doźródło
ssh
, włączającgit
,sftp
itp AFAIK.ssh -F /path/to/altconfig
. Uwaga, spowoduje to zignorowanie całego systemu/etc/ssh/ssh_config
.OpenSSH w wersji 7.3 i nowszej obsługuje
-J
przełącznik iProxyJump
opcję, które pozwalają jednemu lub większej liczbie hostów skoku oddzielonych przecinkami, więc możesz po prostu zrobić to teraz:źródło
Mamy jedną bramę ssh do naszej prywatnej sieci. Jeśli jestem na zewnątrz i chcę zdalnej powłoki na maszynie w sieci prywatnej, musiałbym ssh w bramie, a stamtąd na maszynie prywatnej.
Aby zautomatyzować tę procedurę, używam następującego skryptu:
Co się dzieje:
źródło
Po przeczytaniu powyższego i sklejeniu wszystkiego razem, stworzyłem następujący skrypt Perla (zapisz go jako mssh w / usr / bin i spraw, aby był wykonywalny):
Stosowanie:
Aby uzyskać dostęp do HOSTC przez HOSTA i HOSTB (ten sam użytkownik):
Aby uzyskać dostęp do HOSTC za pośrednictwem HOSTA i HOSTB i używać innych niż domyślne numerów portów SSH i różnych użytkowników:
Aby uzyskać dostęp do HOSTC przez HOSTA i HOSTB i użyć przekazywania X:
Aby uzyskać dostęp do portu 8080 na HOSTC przez HOSTA i HOSTB:
źródło
mssh HOSTA HOSTD
skończyć w HOSTB (i być może nie zdasz sobie sprawy ...)Ta odpowiedź jest podobna do kynan, ponieważ wymaga użycia ProxyCommand. Ale wygodniej jest korzystać z IMO.
Jeśli masz NetCata zainstalowanego na swoich komputerach chmielowych, możesz dodać ten fragment do ~ / .ssh / config:
Następnie
zrobi to, o co prosiłeś.
Przybyłem tutaj, szukając oryginalnego miejsca, w którym czytałem tę sztuczkę. Kiedy go znajdę, opublikuję link.
źródło
Zrobiłem to, co moim zdaniem chcesz zrobić
Zostanie wyświetlony monit o podanie obu haseł, a następnie mogę użyć localhost: 9999 dla serwera proxy SOCKS do host2. To najbliższy mi przykład do pokazanego przez ciebie przykładu.
źródło
Środki wiążą się z hostem lokalnym: 9999, a każdy pakiet wysłany do hosta lokalnego: 9999 przekazuje go do hosta2: 80
Oznacza, że każdy pakiet otrzymany przez host1: 9999 przekazuje go z powrotem do localhost: 9999
źródło
channel 3: open failed: administratively prohibited: open failed
komunikat o błędzie.powinieneś móc skorzystać z przekierowania portów, aby uzyskać dostęp do usługi
host2
zlocalhost
. Dobry przewodnik znajduje się tutaj . Fragment:W swojej obsadzie, wymienić
localhost
na przykładhost2
ihost
zhost1
.źródło
W tej odpowiedzi przedstawię konkretny przykład. Musisz tylko zastąpić nazwy hostów komputerów, nazwy użytkowników i hasła.
Opis problemu
Załóżmy, że mamy następującą topologię sieci:
Ze względu na konkretność załóżmy, że mamy następujące nazwy hostów, nazwy użytkowników i hasła komputerów:
Cel: chcemy, aby skonfigurować serwer proxy SOCKS, który nasłuchuje na porcie
9991
oLocalPC
tak, że za każdym razem gra naLocalPC
inicjowane jest z portu9991
to przechodzimit.edu
potemhec.edu
.Przykład zastosowania:
hec.edu
ma serwer HTTP, który jest dostępny tylko ze strony http://127.0.0.1:8001 ze względów bezpieczeństwa. Chcielibyśmy móc odwiedzić stronę http://127.0.0.1:8001 , otwierając przeglądarkę internetowąLocalPC
.Konfiguracja
W
LocalPC
dodaj~/.ssh/config
:Następnie w terminalu
LocalPC
uruchom:Poprosi Cię o hasło
bob
onmit.edu
(tj.dylan123
), A następnie poprosi o hasłojohn
onhec.edu
(tjdoe456
.).W tym momencie, proxy SOCKS jest teraz uruchomiony na porcie
9991
oLocalPC
.Na przykład, jeśli chcesz odwiedzić stronę internetową za
LocalPC
pomocą proxy SOCKS, możesz to zrobić w przeglądarce Firefox:Kilka uwag:
~/.ssh/config
,HEC
to nazwa połączenia: możesz zmienić ją na dowolną.-D9991
Mówissh
założyć SOCKS4 proxy na porcie9991
.źródło
Jeśli możesz SSH na obu komputerach, spójrz na dyrektywę ProxyCommand ssh. To pozwoli ci przejść bezpośrednio z localhost do host2 (jednym prostym poleceniem, jeśli używasz kluczy publicznych !!). Następnie możesz zrobić, co chcesz z host2.
http://www.statusq.org/archives/2008/07/03/1916/
źródło
Opcja 2 najlepszej odpowiedzi może być używana z innymi użytkownikami ssh niż obecna aka: użytkownik @ host
źródło
W moim przypadku tak zrobiłem
gdzie
host2:8890
działa na notatniku Jupyter.Następnie skonfigurowałem Firefoksa
localhost:9999
jako host SOCKS.Więc teraz mam notebooka
host2
dostępnego na Firefoxielocalhost:8890
na moim komputerze.źródło
Trzy opcje wymienione w zaakceptowanej odpowiedzi w ogóle mi nie działały. Ponieważ nie mam dużego pozwolenia na oba hosty i wydaje się, że nasz zespół DevOps ma dość surowe zasady dotyczące uwierzytelniania i przeprowadzania uwierzytelniania makrofinansowego. Jakoś powyższe polecenia nie działają dobrze z naszym uwierzytelnieniem.
Kontekst jest jednak bardzo podobny do powyższych odpowiedzi: nie mogę ssh bezpośrednio do serwera produkcyjnego i muszę wykonać 1 przeskok przy użyciu serwera skoku.
Jeszcze inne rozwiązanie - naiwne
Skończyło się to na bardzo naiwny sposób: zamiast próbować uruchamiać wszystkie polecenia na moim laptopie, uruchamiam polecenia na każdym komputerze , jak poniżej:
ssh -v -L 6969:localhost:2222 -N your-protected.dest.server
. Jeśli pojawi się monit o podanie hasła, wpisz je.ssh -v -L 6969:localhost:6969 -N your-jump-server.host.name
. Spowoduje to przekazanie dowolnego żądania dotyczącego portu 6969 na laptopie do serwera skoku. Następnie, ponieważ skonfigurowaliśmy w poprzednim kroku, serwer skoku ponownie przekaże żądania z portu 6969 do portu 2222 na chronionym serwerze docelowym.Powinieneś zobaczyć polecenie „zawiesza się” po wydrukowaniu wiadomości - oznacza to, że działają! Jeden wyjątek - nie powinieneś widzieć komunikatu o błędzie
Could not request local forwarding.
, jeśli to zobaczysz, to nadal nie działa :(. Możesz teraz spróbować uruchomić żądanie na porcie 6969 z laptopa i sprawdzić, czy działa.Mam nadzieję, że jeśli jesteś kimś, kto zawiódł wszystkie powyższe metody, być może możesz spróbować.
źródło