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 user2@final.com'
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 user2@final.com
można wyświetlić w następujący sposób
local# ssh inter
inter# ssh user2@final.com
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 user2@final.com
.
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 user2@final.com
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
.