Zależny od sieci ~ / .ssh / config?

15

W biurze mogę łączyć się z komputerami wewnętrznymi bez serwera proxy, ale potrzebuję serwera proxy do połączeń zewnętrznych. Poza biurem mogę połączyć się z innymi urządzeniami zewnętrznymi bez serwera proxy, ale muszę użyć jednego z 2 serwerów proxy, aby połączyć się z komputerami wewnętrznymi.

Jeśli mogę znaleźć sposób na automatyczne wykrycie sieci, w której jestem, czy mogę poinstruować ssh, aby załadował odpowiedni plik konfiguracyjny?

Jeśli nie, to czy istnieje bardziej eleganckie rozwiązanie niż pisanie skryptu powłoki w celu dowiązania odpowiedniego pliku konfiguracyjnego do ~ / .ssh / config (mój najlepszy pomysł do tej pory)?

Edycja: Myślę, że @pcm i JonnyRo zrozumieli moje pytanie i wypróbuję ich sugestie, ale dla jasności chcę

|--------\    Dest   | abc.example.com | xyz.external.org |
| Source  \---------\|                 |                  |
|--------------------+-----------------+------------------|
| example.com office | No Proxy        | Proxy            |
| outside            | Proxy           | No Proxy         |
Nate Parsons
źródło

Odpowiedzi:

11

W zależności od konfiguracji serwera proxy możesz po prostu zbudować wpis konfiguracji SSH, który działa w dowolnej sytuacji. Na przykład w jednej sieci, z której regularnie korzystam, muszę ssh do hosta pośredniego, zanim będę mógł nawiązać połączenie wychodzące. Zasadniczo konfiguruję więc taką konfigurację.

# proxy ssh 
Host *%sshproxy
    ProxyCommand ssh [email protected] /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22

Host myhost.example.org
    HostName 172.16.24.1

Host otherhost.example.com
    HostName 192.168.57.12

Więc kiedy nie potrzebuję używać proxy, mogę po prostu uruchomić polecenie jak ssh myhost.example.orgi połączyć się, ale kiedy potrzebuję proxy, uruchamiam polecenie ssh myhost.example.org%sshproxy.

Podejrzewam, że prawdopodobnie możesz ustawić jakiś alias lub ustawienie autouzupełniania, które automatycznie dołączałoby %proxybit.

Zoredache
źródło
9

Stare pytanie, ale kilka pomysłów w tym wątku pomogło mi i oto rozwiązanie, które wymyśliłem:

Po pierwsze, konfiguracja ssh serwera proxy .

Match Originalhost proxy Exec "ifconfig | grep 10.0.1"
     Hostname 10.0.1.2
Host proxy 
     Hostname external.hostname.com

Następnie konfiguracja serwera B :

Match Originalhost server-b Exec "ifconfig | grep 10.0.1"
     ProxyCommand none
Host server-b
     Hostname 10.0.1.3
     ProxyCommand ssh -W %h:%p server-a

Chodzi o to, że domyślnym przypadkiem jest połączenie z zewnętrznej strony, a ProxyCommand inicjuje najpierw połączenie ssh z proxy, a następnie łączy się z serwerem-b . Jeśli z drugiej strony znajdujemy się już w lokalnej podsieci, ProxyCommand jest wyłączony i nie ma połączenia proxy z serwerem-a .

Niezależnie od tego, gdzie jesteś, zawsze możesz uzyskać dostęp do server-abc przez ten wpis, a ta konfiguracja określa, gdzie jesteś i odpowiednio konfiguruje połączenie. W przypadku server-xyz użyj tego samego pomysłu.

Dokładniej wyjaśniłem tutaj: http://blog.kihltech.com/2017/04/ssh-conditional-host-address-based-on-network-or-location/

Robert Kihlberg
źródło
7

Możesz użyć opcji -F, aby wybrać z różnych plików konfiguracyjnych. dla dwóch przypadków sieciowych. Następnie możesz albo utworzyć aliasy, które wykorzystują różne pliki konfiguracyjne, w zależności od sieci, w której się znajdujesz, albo w skrypcie logowania skonfigurować pojedynczy alias, na podstawie twojego adresu IP.

pcm
źródło
Dzięki! Aliasy z -F z pewnością będą moją rezerwą, jeśli nie będę mógł uruchomić skryptu działającego w oparciu o IP.
Nate Parsons,
To jest niesamowite, miałem właśnie zadać to samo pytanie. Skryptuję już kilka innych opcji, aby ustawić zmienne środowiskowe, kiedy uruchamiam nowy terminal, mogę łatwo utworzyć alias lub dowiązać symbolicznie odpowiedni plik .ssh / config w zależności od środowiska.
newz2000
1

Napisz skrypt powłoki, który sprawdza adres IP względem wzorca, a następnie dowiązuje symbolicznie odpowiedni skrypt powłoki.

Jeśli z jakiegoś powodu twój zakres adresów IP jest taki sam dla domu i pracy, spróbuj przełączyć się na /etc/resolv.conf, który zawiera serwery DNS skonfigurowane przez DHCP.

JonnyRo
źródło
0

Opcja „Host” w .ssh / config pozwala zmienić konfigurację w zależności od miejsca docelowego. Używam tego, aby dostosować przekierowanie portów i takie w zależności od tego, dokąd zmierzam.

JOTN
źródło
0

Analizowałem to pytanie w przeszłości i jednym z możliwych rozwiązań jest posiadanie takiego wpisu w pliku konfiguracyjnym:

Host ENTRY_POINT
Hostname ENTRY_POINT_FQDN
User USERNAME

Host *.INSIDE_DOMAIN
ProxyCommand ssh ENTRY_POINT nc %h %p

W ten sposób, jeśli jesteś na zewnątrz, możesz $ ssh machine.inside_domain. Jeśli jesteś w środku i masz rozwiązanie dns, możesz $ ssh machine. To działa dobrze dla mnie.

Może ktoś może ulepszyć ten pomysł, może zmienić konfigurację DNS, aby automatycznie rozstrzygał maszynę na maszynę. Wewnątrz_domena, jeśli jesteś na zewnątrz i używasz punktu wejścia SSH.

Fernando
źródło