Serwery produkcyjne mojej firmy (FOO, BAR ...) znajdują się za dwoma serwerami bram (A, B). Aby połączyć się z serwerem FOO, muszę otworzyć połączenie ssh z serwerem A lub B z moją nazwą użytkownika JOHNDOE, a następnie z A (lub B) mogę uzyskać dostęp do dowolnego serwera produkcyjnego otwierającego połączenie SSH ze standardową nazwą użytkownika (nazwijmy to WEBBY).
Więc za każdym razem muszę zrobić coś takiego:
ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server
Jak możesz sobie wyobrazić, jest to kłopotliwe, gdy muszę użyć scp
lub szybko otworzyć wiele połączeń.
Skonfigurowałem klucz ssh, a także używam .ssh / config dla niektórych skrótów.
Zastanawiałem się, czy mogę stworzyć jakąś konfigurację ssh w celu pisania
ssh foo
i pozwól SSH otworzyć / przekazać wszystkie połączenia dla mnie. Czy to możliwe?
Edytować
Odpowiedź womble jest dokładnie tym, czego szukałam, ale wydaje się, że w tej chwili nie mogę użyć netcata, ponieważ nie jest zainstalowany na serwerze bramy.
weppos:~ weppos$ ssh foo -vv
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data /Users/xyz/.ssh/config
debug1: Applying options for foo
debug1: Reading configuration data /etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh a nc -w 3 foo 22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/xyz/.ssh/identity type -1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_rsa type 1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_dsa type 2
bash: nc: command not found
ssh_exchange_identification: Connection closed by remote host
źródło
Możesz użyć dyrektywy ProxyCommand w pliku ~ / .ssh / config, na przykład aby użyć netcat jako przekaźnika:
Po prostu użyłbyś „ssh server2”. Informacje o stronie podręcznika dla tej dyrektywy znajdują się w 'man ssh_config'
źródło
Wolę inne podejście, które utrzymuje wstępnie uwierzytelniony tunel do serwera bramy. W
~/.ssh/config
:Następnie w
.bashrc
:Aby połączyć się z foo:
Przy pierwszym podłączeniu uwierzytelni cię przed „a” i otworzy trwały tunel ssh w tle. Kolejne wywołania „s” otworzą się niemal natychmiast przez wstępnie autostabilny tunel.
Działa świetnie.
źródło
Ten typ funkcjonalności istnieje w nowszych wersjach OpenSSH i można z niego korzystać poprzez wykonanie
Gdzie
server2
jest zamierzonym miejscem docelowym iserver1
hostem proxy. Możesz to ułatwić, korzystając zProxyCommand
opcji w konfiguracji ssh, na przykład:źródło
Jeśli
netcat
nie jest dostępny w proxy, wypróbuj tę sztuczkę:Więc powinieneś być w stanie
ssh foo
.Ponadto, jeśli masz najnowszą wersję ssh na a (tj. Z
-W
komendą do przekazywania standardowych danych wejściowych i wyjściowych), możesz użyć:Wreszcie, tylko dlatego, że uznałem to za fajne (a nie dlatego, że będzie działać w twoim konkretnym przypadku, z powodu różnic w nazwach użytkowników), post na blogu znajomego wskazuje, jak zrobić tego rodzaju dynamikę i rekurencyjnie łączyć łańcuchy proxy SSH (wraz z niektórymi rzeczami które nie działają dobrze):
A potem
ssh machine1/machine2
powinien dać ci pocisk namachine2
tunelumachine1
.Zastanawiam się, czy używanie niestandardowych
sed
poleceń zamiastdirname
ibasename
może nie rozwiązać problemu z różnymi nazwami użytkowników?źródło
Można to osiągnąć przez wykonanie
ssh -At johndoe@a ssh webby@foo
.-A
Komenda do przodu agent ssh (dzięki czemu można uniknąć konieczności ponownego uwierzytelnienia na serwerze proxy), natomiast-t
zapewnia zacisk istnieje na pełnomocnika. Przydatna może być następująca funkcja bash:źródło
Netcat nie jest zainstalowany
a
. Po uruchomieniussh host "command arg"
,command
wykonywany jest nahost
, a nie na komputerze lokalnym.źródło
Od OpenSSH 7.3 (2016-08-01)
ProxyJump
dostępna jest opcja i odpowiednia-J
flaga wiersza poleceń, aby umożliwić prostszą pośrednią transmisję przez jeden lub więcej bastionów SSH lub „hostów skokowych”.To usuwa zależność od zewnętrznego
nc
polecenia, jak znaleziono w rozwiązaniu Womble .ustanowi połączenie SSH ze stacji roboczej do serwera bramy
a
jako użytkownik johndoe i tuneluje sesję SSH, aby hostować foo dla użytkownika Webby.Aby to uprościć, utwórz definicje hosta zarówno dla siebie, jak
~/.ssh/config
i dla tego, które możesz wykonaćssh foo
źródło