Mam serwer o nazwie gamma
, stale działający i działający w pracy. Czasami łączę się z nim z domu, w którym to przypadku korzystam z publicznego adresu IP 55.22.33.99
. Zdarza się, że mogę podłączyć do niego, kiedy jestem w pracy, a zamiast odbić moje pakiety wokół niepotrzebnie podłączyć poprzez lokalny adres IP 192.168.1.100
.
W tej chwili mam je podzielone na dwa różne wpisy w ~/.ssh/conf
Host gamma-local
HostName 192.168.1.100
Port 22
User andreas
Host gamma-remote
HostName 55.22.33.99
Port 12345
User andreas
Więc jeśli jestem w pracy, wszystko co muszę wpisać to ssh gamma-local
i jestem w; jeśli jestem w domu (lub gdziekolwiek indziej na świecie), biegam ssh gamma-remote
.
Podczas łączenia się z serwerem wolałbym nie wpisywać innej nazwy w zależności od tego, gdzie jestem, wolałbym, aby ta część była wykonywana automatycznie; na przykład w niektórych przypadkach mam zautomatyzowane skrypty, które łączą się, którzy nie wiedzą, gdzie jestem.
Istnieje pytanie, które rozwiązuje ten problem za pomocą skryptu Bash, aby „spróbować” najpierw połączyć się z lokalnym, a jeśli się nie łączy, spróbuj połączyć się ze zdalnym adresem IP. Jest to miłe, ale (1) wydaje się nieefektywne (szczególnie, że czasami trzeba „poczekać” na przekroczenie limitu czasu połączeń, ponieważ nie zawsze natychmiast wysyłają błąd z powrotem) i (2) wymaga Basha i ciągnięcia się za skryptem.
Czy istnieje alternatywny sposób osiągnięcia tego celu, który nie polega na użyciu skryptów Bash ani „testowaniu”, aby sprawdzić, czy połączenie działa najpierw?
/etc/hosts
pomocy pliku konfiguracyjnego SSH? A może jakiś sposób na „wykrycie”, do której sieci LAN jesteś aktualnie podłączony?Odpowiedzi:
Jeśli potrafisz rozpoznać, w której sieci jesteś, możesz użyć
Match
słowa kluczowego w,~/.ssh/config
aby zrobić to, co chcesz. Wymaga to OpenSSH ≥6,5.Używam czegoś podobnego do
Używam więc identyfikatora używanej sieci Wi-Fi, aby zdecydować, czy jestem w domu na potrzeby połączenia SSH, ale można również użyć adresu IP przypisanego do komputera lub czegokolwiek innego, co odróżnia obie sieci. .
źródło
Match
, dzięki! Dobrym pomysłem może być umieszczenie wykrycia w skrypcie wychodzącym z zerowym lub niezerowym statusem wyjścia, ponieważ dzięki temu będzie można go ponownie wykorzystać.ProxyCommand nc $address ssh
, ale potem np. czy wszystkie urządzenia mają ten sam klucz hosta? Reklama, jeśli i tak musisz ustawić zmienną środowiskową, czy nie będzie łatwiej po prostu podać adres, z którym chcesz się bezpośrednio połączyć jako argumentssh
?Jeśli zdarzy ci się mieć prywatne serwery nazw w pracy i jeśli używasz tego samego laptopa w biurze i domu, możesz to wykorzystać, aby to osiągnąć:
nsswitch.conf
komputer, aby najpierw sprawdzić DNSgamma
aby rozwiązać do 192.168.1.100 w prywatnym DNS w biurze.gamma
do 55.22.33.99.W ten sposób, gdy będziesz w
ssh gamma
biurze, zostanie rozpoznane z biurowego DNS na 192.168.1.100, a kiedy połączysz się z domu, rozwiąże się do 55.22.33.99 z pliku hosts.PS : Ta odpowiedź zakłada, że nie chcesz, aby gamma miała publiczny wpis DNS. Ponadto, jeśli korzystasz z SSH do serwera z komputera z systemem Windows, myślę, że powinno być miejsce równoważne plikowi nssswitch.conf, aby zastąpić wpisy pliku hosts.
źródło
Nie wiem, czy jest to możliwe,
~/.ssh/config
ale innym podejściem byłoby połączenie się z jednym lub drugim w oparciu o twój zewnętrzny adres IP. Ponieważ, prawdopodobnie, kiedy jesteś w pracy, twoje IP będzie55.22.33.NNN
, możesz uruchomić coś takiego:Jeszcze prostszym rozwiązaniem jest użycie wewnętrznego adresu IP. Nie wiem, jak skonfigurowane są dwie sieci, ale jeśli łatwo jest ustalić, czy jesteś w pracy, czy nie poprzez swój adres IP (na przykład, jeśli masz konkretny adres IP w pracy, np.
192.168.1.12
), Możesz to zrobić ( zmieńeth0
na dowolną nazwę twojej karty sieciowej):Cokolwiek zdecydujesz się użyć, możesz dodać go jako alias do powłoki (dodaj ten wiersz do pliku inicjalizacji powłoki,
~/.bashrc
jeśli używaszbash
):Możesz także zrobić to ze skryptu, jeśli chcesz, aby inne skrypty miały do niego dostęp (aliasy z
.bashrc
nie są odczytywane podczas uruchamiania skryptu).źródło
Nie można tego osiągnąć,~/.ssh/config
używając adresów IP jako nazw hostów. Dodatkową komplikację wprowadza fakt, że łączysz się nie tylko z różnymi adresami IP, ale także z różnymi portami, ponieważ w zasadzie wyklucza to jakiekolwiek modyfikacje twojego resolvera DNS.Stoję poprawiony - możesz użyć
Match originalhost ... exec ...
kombinacji w~/.ssh/config
- patrz odpowiedź @ MichałPolitowski . Jednak chociaż będzie działać idealnie w przypadku OpenSSH, niekoniecznie możesz znaleźć podobną funkcjonalność w innych klientach SSH.Możesz obejść ten problem za pomocą prostego opakowania (funkcji powłoki lub skryptu, jeśli musisz użyć go z różnych powłok)
ssh
, który sprawdzi, w której sieci jesteś, i użyje odpowiedniegoHost
wpisu. Najważniejsze pytanie brzmi: jak niezawodnie wykryć sieć, w której się znajdujesz. Lokalny adres IP przychodzi mi na myśl, ale nie jest niezawodny, ponieważ równie dobrze możesz łączyć się z sieci LAN korzystającej z tej samej podsieci co sieć robocza.Jeśli możesz mieć ten sam port zarówno dla sieci lokalnych, jak i zdalnych, możesz edytować swój w
/etc/resolv.conf
zależności od sieci, w której się znajdujesz - oczywiście musiałoby to być zrobione automatycznie (najprawdopodobniej ze skryptu przechwytującego klienta DHCP). Lub - lepiej - uruchomić lokalny serwer nazw (jak na przykładdnsmasq
) i dostarczyć mu odpowiednią konfigurację. Wykracza to jednak poza zakres tego pytania.Inną opcją - jeśli potrzebujesz się tylko połączyć interaktywnie - jest użycie uzupełniania poleceń, które by skanowało
~/.ssh/config
. Pozwoliłoby to zaoszczędzić trochę pisania (szczególnie, jeśli masz wystarczająco różnychHost
wpisów). Coś w tym stylu (dobash
inicjalizacji):Pierwsza funkcja tworzy listę, z której hosty są ukończone (zwykle wystarczy uruchomić to raz w każdej powłoce), druga wykonuje rzeczywiste zakończenie, choć w nieco niezdarny sposób - uzupełnia nazwę hosta tylko wtedy, gdy jest ostatni token w linii poleceń.
To powiedziawszy, właściwym sposobem na rozwiązanie tego problemu jest połączenie się z siecią roboczą przez VPN, a tym samym dostęp do lokalnego roboczego adresu IP, tak jakbyś był w biurze. Następnie można twardego drutu adres do cokolwiek cokolwiek warstwa wolisz:
~/.ssh/config
,/etc/resolv.conf
lub (imho najlepszym rozwiązaniem) Serwer nazw biurowych.źródło
gamma
aby pasował do portu zdalnego, gdyby to ułatwiło.Kilka lat temu napisałem program do podobnego celu. Może pasować do twoich potrzeb. Za pomocą tego programu konfiguracja ssh może wyglądać następująco:
źródło
Jeszcze innym rozwiązaniem jest użycie dwóch różnych plików konfiguracyjnych dla SSH. Możesz uznać to za nieco mniej eleganckie niż posiadanie wszystkiego w jednym pliku konfiguracyjnym, ale łatwiej go utrzymać.
Wybierz plik konfiguracyjny, którego chcesz użyć
-F <configfile>
.źródło
-F
opcja.Częściowa odpowiedź:
Wiele odpowiedzi powyżej zaczyna się od „jeśli możesz wykryć, w której sieci jesteś”. W tym celu używam skryptu, który jest uruchamiany, gdy interfejsy są połączone, aby uruchamiać różne rzeczy (zwykle VPN), gdy łączę się z jedną ze swoich zwykłych sieci. Technika polega na użyciu ARP w celu uzyskania adresu MAC bramy:
A potem mam tabelę odnośników do powiązania sieci z bramą MAC. Oczywiście ta tabela może pomieścić kilka adresów MAC dla tej samej sieci (typowym przypadkiem są różne hotspoty Wi-Fi na dużej stronie korporacyjnej). Inna tabela odnośników służy do określenia skryptu, który ma zostać uruchomiony dla tej sieci.
W moim przypadku skrypt jest uruchamiany za pomocą powiadomień na pulpicie Plazmy, więc wszystko jest w obszarze użytkownika.
źródło