SSH przez wiele hostów za pomocą ProxyCommand?

11

Mam wpis w ~ / .ssh / config na moim komputerze w domu, który wygląda następująco:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

gdzie gateway.example.comjest serwer w pracy, który jest podłączony zarówno do publicznego Internetu, jak i sieci wewnętrznej. Pole bramki rozwiązuje problem foo i bar przy użyciu wpisów w / etc / hosts.

Mój problem polega na tym, że muszę dotrzeć do pudełka po drugiej stronie foo. Nazwijmy to „baz”. Host „baz” znajduje się w innej sieci prywatnej, z którą połączony jest Foo, ale nie w tej, do której podłączona jest „brama”.

Próbowałem użyć tego:

host baz
    ProxyCommand ssh -x -a -q gateway/example.com ssh foo nc %h 22

Ale to nie działa i jestem trochę z głębi. Jak mam to zrobic?

Nie sądzę, że to powinno mieć znaczenie, ale robię to w Ubuntu 10.

Graham
źródło

Odpowiedzi:

13

Łatwo.

Załóżmy następującą konfigurację sieci:

przykładowa konfiguracja sieci

Powinieneś być w stanie użyć pliku ~ / .ssh / config, który wygląda mniej więcej tak:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

host baz
    ProxyCommand ssh -x -a -q foo nc %h 22

Chodzi o to, że SSH nie wiem jak dostać się do „foo”, więc ssh nie uda. I stamtąd możesz „nc” do baz. A jeśli w wewnętrznej sieci prywatnej są inne hosty obok „baz”, możesz po prostu dodać je do linii „host baz”.

To w zasadzie traktuje hosta „foo” jako bramę do „baz”, podobnie jak „brama” jest bramą do „foo”.

Jasny?

ghoti
źródło
13

Jeśli chodzi o odpowiedź Ghoti męska: zamiast używać netcata ( "ssh ... nc %h 22"), wychodząc z OpenSSH 5.4, można to zrobić bezpośrednio z: "ssh -W %h:22 ...". W ten sposób nie musisz się martwić, czy netcat zostanie zainstalowany we właściwym miejscu.

Richard E. Silverman
źródło
1
Świetna uwaga, dzięki. To stare pytanie, ale równie dobrze mogę wyjaśnić, że kiedy działałem Ubuntu na mojej stacji roboczej, „brama” serwera była starym Busybox Linux z OpenSSH 5.3, a serwery „foo” i „baz” były FreeBSD (OpenSSH 5.4). Tak czy inaczej potrzebowałbym przynajmniej jednego netcata.
Graham,
@Graham Nie. To tylko klient musi mieć 5,4 lub więcej, aby -Wmóc pracować. Opiera się on na kodzie przekierowania portów po stronie serwera, który jest znacznie starszy.
kasperd
1

Używając kluczy prywatnych przechowywanych na komputerze lokalnym, wprowadź to polecenie, zmieniając prywatne klucze, nazwy użytkownika powłoki i nazwy hostów / adresy IP zgodnie z lokalnymi> bramami> docelowymi ssh.

Zauważ, że ProxyCommand jest lepszy niż przekazywanie agentów, aby zmniejszyć ryzyko naruszenia uwierzytelnienia klucza prywatnego (użycie bramy i lokalnego połączenia agenta ssh w celu przejęcia kontroli nad innymi hostami, tak jakby porywacz posiadał klucz prywatny), gdy brama / skoczek są przechwytywane przez root.

Jedno polecenie do serwera proxy SSH do serwera (zachowaj oba klucze prywatne na komputerze lokalnym):

sudo ssh -i dest_private_key.pem -o "ProxyCommand ssh -W %h:%p -i gate_private_key.pem gate_user@gate_IP" dest_user@dest_IP 
openyk
źródło
0

To właśnie robię, aby wskoczyć z chronionej sieci do Internetu.

Używam laptopa do pracy z kodem podczas kompilacji . Ponieważ kompilacja jest ograniczona od dostępu do Internetu, aby sklonować repozytorium z github.com, najpierw muszę przejść do zestawu narzędzi , który również nie ma dostępu do Internetu. Ale może uzyskać dostęp do gw , który ma Internet.

Lubię to:

Schemat skoków SSH

Mój .ssh/configna kompilacji :

Host gw
  ProxyCommand ssh -A -W %h:%p toolbox

Host github.com
  ProxyCommand ssh -A -W %h:%p gw

Wyjaśnienie.

  1. Punkt widzenia pochodzi z kompilacji . Brak konfiguracji na innych serwerach.
  2. Po pierwsze, oświadczam, że aby dostać się do gw , musisz to zrobić za pomocą przybornika .
  3. Po drugie, oświadczam, że aby dostać się na github.com , musisz to zrobić za pośrednictwem gw . Wewnętrznie SSH korzysta z poprzedniej reguły.
  4. Ostatecznie git clone [email protected]:aRepo/Therepo prostu działa!

Jasny?

Jari Turkia
źródło