METODA 1 (użyj klawisza ssh na inter)
Jeśli chcesz zachować przepływ uwierzytelniania
local -- authenticate --> inter -- authenticate (ask password) --> final
Nie można tego zrobić za pomocą .ssh / config proxyhost.
Potrzebujesz aliasu powłoki bash (mam nadzieję, że używasz bash).
W ~/.bashrc
dodaj następujący wiersz
alias ssh-final='ssh -t inter ssh [email protected]'
W wierszu polecenia wpisz następujące
ssh-final
final
sekcja w ~/.ssh/config
nie jest używany.
Szczegóły połączenia (1)
ssh -t inter ssh [email protected]
można wyświetlić w następujący sposób
local# ssh inter
inter# ssh [email protected]
local
tylko „rozmawia” z inter
. Nie ma bezpośredniego ani pośredniego połączenia ssh pomiędzy local
i final
. local
wyświetla tylko wynik działania ssh [email protected]
.
METODA 2 (użyj klucza ssh na komputerze lokalnym)
Uwierzytelnianie za pomocą tego samego klucza SSH
Host inter
User user1
HostName inter.example.com
Host final
User user2
Hostname <final.com / final IP Address>
Port 22
ForwardAgent yes
ProxyCommand ssh inter nc %h %p
Skopiuj lokalnie ~/.ssh/id_ras.pub
do
/home/user1/.ssh/authorized_keys in `inter`
/home/user2/.ssh/authorized_keys in `final`
Szczegóły połączenia (2)
tunelowanie ssh
Zanim przejdziemy do szczegółów ProxyCommand
, spójrzmy na następujący przykład
Krok 1, w oknie terminala 1
local# ssh inter -L 2000:final.com:22
Krok 2, w oknie terminala 2
local# ssh localhost -p 2000
W terminalu 1 tunel jest ustawiony między portem lokalnym 2000 a portem final.com 22. Wszystko, co zostanie wysłane do portu lokalnego 2000, zostanie przekierowane do portu final.com 22 i odwrotnie.
W terminalu 2 ssh łączy się z lokalnym portem 2000, ale w rzeczywistości komunikuje się z portem final.com 22, którym jest sshd.
Dzięki tunelowaniu lokalny klient ssh w kroku 2 jest bezpośrednio połączony z final.com sshd.
„Wyjście” lokalnego portu 2000 to „surowy” ruch demona ssh.
Częstym zastosowaniem takiego tunelu jest dostęp do wewnętrznego serwera WWW lub serwera e-mail. Poniżej znajduje się przykład serwera WWW
local# ssh inter -L 2000:final.com:80
W przeglądarce użyj następującego adresu URL
http://localhost:2000
Dwa punkty końcowe tunelu to lokalny port 2000 i final.com port 80.
Ruch przychodzący i wychodzący z punktu końcowego tunelu „AS IS”. Nazwijmy ten „surowy” ruch.
ProxyCommand
Host final
User user2
Hostname <final.com / final IP Address>
Port 22
ForwardAgent yes
ProxyCommand ssh inter nc %h %p
ProxyCommand
Wziąć to krok dalej. Pomija etap tworzenia portu lokalnego i łączy się z nim.
Klient ssh wykona dowolną komendę ProxyCommand
i potraktuje wynik tej komendy jako „nieprzetworzony” ruch. Trzyma lokalny punkt końcowy, a następnie nawiązuje z nim połączenie ssh.
Dlaczego jedna praca nie działa?
Następujące polecenie
ssh inter nc final.com 22
w zasadzie oznacza (1) połączenie z inter
, a następnie (2) włączenie inter
polecenia uruchomienia nc final.com 22
.
nc - arbitrary TCP and UDP connections and listens
Więc nc final.com 22
będzie łączyć się final.com portu 22, wydrukować cały ruch przychodzący do stdout, stdin i wysłać wszystko na drugą stronę. Jest to „tunel” między nc stdin / out a portem final.com 22.
Ponieważ nc
jest uruchamiany w ramach sesji ssh, cały jego stdout jest przekazywany z powrotem do klienta ssh jako „surowy” ruch. A klient ssh może przekazywać ruch do nc stdin, który skończy na porcie final.com 22.
Przez powyższy „tunel” lokalny klient ssh rozpocznie sesję ssh final.com
bezpośrednio.
Następujące polecenie
ssh -t inter ssh [email protected]
nie działa, ProxyCommand
ponieważ wyjście z niego nie jest „surowym” ruchem z demona ssh. Jest to standardowe wyjście klienta ssh . Rozmowa z klientem oznacza brak działalności.
Uwierzytelnianie za pomocą innego klucza SSH (oryginalna konfiguracja OP)
Host inter
User user1
HostName inter.com
IdentityFile ~/.ssh/id_rsa
Host final
User user2
HostName final.com
IdentityFile ~/.ssh/id_rsa_2
ProxyCommand ssh inter nc %h %p
Skopiuj lokalnie ~/.ssh/id_ras.pub
do
/home/user1/.ssh/authorized_keys in `inter`
Skopiuj lokalnie ~/.ssh/id_ras_2.pub
do
/home/user2/.ssh/authorized_keys in `final`
Oba powyższe umożliwią następujące użycie
local# ssh final
Dodatkowe sprawdzanie
Używaj pełnych słów
local# ssh -v final
To powinno pomóc w identyfikacji problemu ssh.
Sprawdź nc
ProxcyCommand
wykonuje nc
się inter
. Sprawdź, czy nc
jest faktycznie dostępny w dniuinter
.
local# ssh inter
inter# nc final.com 22
Sprawdź, czy klucz RSA jest poprawnie skonfigurowany
Jeśli mają być używane różne klucze inter
i final
, na komputerze lokalnym powinny istnieć następujące pliki
local# ls ~/.ssh
id_rsa id_rsa_2 id_rsa.pub id_rsa_2.pub
Ponieważ możesz inter
już ssh , sprawdź konfigurację klucza na final
. Z lokalnego komputera
local# ssh -t inter ssh user2@final
final# cat .ssh/authorized_keys
Powinieneś zobaczyć id_rsa_2.pub
tam zawartość .
ssh -t
, ale chciałbym dokładnie symulować zachowanie, które mam przyssh -t
użyciu tylko konfiguracji w.ssh/config
.checking
krok. Coś musi brakować / źle.ssh -t
, twoja ssh tofinal
jest inicjowana zinter
, co jest „prawie” takie samo jaklocal# ssh inter
wtedyinter# ssh final
. Uwierzytelnianie jest pomiędzyinter
ifinal
. Z proxy / nc, twój ssh do final jest inicjowany z twojego komputera lokalnego, przez tunel, dofinal
. Uwierzytelnianie jest pomiędzylocal
ifinal
.inter
klucza ssh do uwierzytelnieniafinal
. Spróbuj skopiowaćid_rsa_2
dolocal
~ / .ssh / id_rsa_2 (NIE NALEŻY PISAĆ lokalnego id_rsa), a twój problem może zniknąć.nc
wbudowany. Więc zamiastProxyCommand ssh gateway nc %h %p
pisaćProxyCommand ssh inter -W %h:%p
.Nie widziałem na liście żadnych błędów ani instrukcji ssh -v, które pomogłyby zobaczyć, gdzie się rozłącza.
Hej, masz prawie rację - najlepszym i najbezpieczniejszym sposobem jest posiadanie obu kluczy na komputerze lokalnym. Następnie użyłbyś przekierowania agenta ssh do połączenia, zamiast zostawiać klucze na pośrednich etapach. Zaletą jest także to, że hasło należy wpisywać tylko raz podczas logowania.
Jeśli masz nowoczesny / przyjazny dla użytkownika system operacyjny, taki jak ubuntu (na komputerze lokalnym), nie powinno to działać bez żadnego * masowania *. Celowo zostawiłem plik tożsamości, nie będziesz go potrzebować.
Twój plik konfiguracyjny wyglądałby tak:
Jeśli nie, wykonaj następujące kroki, aby upewnić się, że ssh-agent działa:
Tutaj jest ładny przewodnik wyjaśniający, jak to działa .
źródło