Niech ssh rozpoznaje nazwy hostów z konfiguracji, gdy używasz ProxyCommand i trybu netcat


16

Próbuję ustawić uniwersalne opcje dla odbijających połączeń ssh. Oto mój ~/.ssh/configplik, w skrócie:

Host *%via
  ProxyCommand ssh gateway -W $(echo %h | cut -d%% -f1) %p

Host gateway
  HostName gateway.example.com
  User username
  ForwardAgent yes
  IdentityFile keypathg

Host target
  User username
  HostName target.example.com
  IdentityFile keypatht

Kiedy korzystam *%viaz Hostaliasów, otrzymuję:

% ssh -vvv target%via
OpenSSH_5.9p1, OpenSSL 0.9.8y 5 Feb 2013
debug1: Reading configuration data /Users/myuser/.ssh/config
debug1: /Users/myuser/.ssh/config line 5: Applying options for *
debug1: /Users/myuser/.ssh/config line 12: Applying options for *%via
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: auto-mux: Trying existing master
debug1: Control socket "/Users/myuser/.ssh/tmp/target%via_22_myuser" does not exist
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh -A gateway -W $(echo target%via | cut -d% -f1):22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/myuser/.ssh/id_rsa type -1
debug1: identity file /Users/myuser/.ssh/id_rsa-cert type -1
debug1: identity file /Users/myuser/.ssh/id_dsa type -1
debug1: identity file /Users/myuser/.ssh/id_dsa-cert type -1
ssh_exchange_identification: Connection closed by remote host

Jeśli jednak wykorzystam

% ssh target.example.com%via

Uderzyłem w serwer docelowy, ale jako niewłaściwy użytkownik i bez uwierzytelnienia klucza publicznego.

Myślę, że moim pytaniem w tym momencie jest to, czy ta metoda podskakiwania podczas używania ForwardAgentprzechodzi przez moją konfigurację / środowisko ssh w całości, czy tylko klucze. Jeśli tylko klucze, to czy można użyć tego pierwszego w jakiś sposób?

Moja wersja ssh to 5.9v1, brama to 5.9v1, a cel to 5.3p1. Wydaje mi się, że -Wzostał wprowadzony w 5.4, ale to nie powinno mieć znaczenia dla końcowego pola w linii? korzystanie ze starszej szkoły ncnie wydaje się niczym innym.

Sprawdziłem, że mogę ręcznie ssh do każdego pola w linii. Oznacza to, że informacje o aliasie nazwy hosta nie są przekazywane, tak jak w bramie nie mogę, ssh targetale mogę ssh target.example.com. Działa z auth pubkey. Brama i cel nawiasem mówiąc mają tę samą nazwę użytkownika, dlatego działa to, jeśli nie zostanie przekazana żadna konfiguracja.

Jeśli ForwardAgentlub podobna konfiguracja nie może wypchnąć tych informacji, jaki jest najbezpieczniejszy sposób na obejście ich, utrzymywanie .ssh / config w bramie z tymi informacjami?

Odpowiedzi:


14

Wow, dzięki za pytanie. Rzadko zdarza mi się, aby ktoś w pełni wykorzystywał SSH, a to pytanie dotyczy kilku obszarów.

To nie jest ProxyCommandproblem. Po ProxyCommandprostu instruuje lokalnego klienta ssh, aby zrobił coś w przygotowaniu przed próbą rozmowy ze zdalnym klientem. Tak, w naszym przypadku rozmawiamy z inną sesją ssh, ale ta sesja po -Wprostu bierze nasz wkład i przesyła go na inną maszynę. Można pomyśleć, że przygotowawcza sesja ssh jest całkowicie niezależna. Nieunikniona analogia samochodu: Twój samochód jest tym samym samochodem, niezależnie od tego, czy musiałeś jechać promem, aby dostać się z punktu A do punktu B.

To nie jest ForwardAgentproblem. ForwardAgentlokalny klient udostępnia narzędzie, które udostępnia klucze lokalne w środowisku sesji zdalnej. Nie minęło ustanowienie sesji zdalnej.

Jest to .ssh/configproblem z formatem. Zwróć uwagę na drugą i trzecią linię debug1. Wykazują, jakie sekcje Host są stosowane od Ciebie .ssh/config. Zauważ, że to $ ssh target.example.com%viadziała, ale jako zła nazwa użytkownika i klucz. Cóż, zwrotka dla Host targetnie jest odczytywana (co zapewniłoby poprawną nazwę użytkownika i plik klucza). Które zwrotki są używane? *a *%via.

Jak zdobyć te opcje do przejścia? Co ciekawe, symbol wieloznaczny pasuje do ciągów o długości 0. Host target*będzie pasował target, target%via, target.example.comi target.example.com%via.

I tak zadajesz pytanie, ustawiłbym pomoc .ssh/configna gatewaymaszynie. Nie zrobiłby tego. Nigdy nie zostanie przeczytane. Wszystko dzieje się z naszej lokalnej maszyny.

Wszystko, co wyjaśniłem, tylko odpowiedzi, dlaczego $ ssh target.example.com%vianie działa.

Wolisz $ ssh target%via. Słusznie jest to wygodniejsze. Krótki formularz nie działa, ponieważ targetnie można znaleźć nazwy hosta ; to nie rozwiązuje. Dlaczego nie jest ssh nie wypływa: ssh: Could not resolve hostname target: Name or service not known? Ponieważ ProxyCommandzostał już pomyślnie ustanowiony. Elementy połączenia ssh zostały zbudowane, ale awaria nazwy hosta ma miejsce tam, gdzie się nie spodziewa, więc bombarduje bardziej ogólnym komunikatem. Złożyłbym raport o błędzie na ten temat, aby pomóc określić, gdzie można poprawić informacje debugowania.

Komentarz końcowy:

Podoba mi się Host *%viaskładnia. Jest czysty, ale elastyczny. Wcześniej widziałem Host *+*i używa zarówno pierwszej, jak i ostatniej części, %h(ost)aby określić, gdzie iść. Ale potrzeba trochę więcej wysiłku, aby się tym zająć. link: http://wiki.gentoo.org/wiki/SSH_jump_host

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.