Jak podłączyć się do maszyny linux, która regularnie zmienia IP?

12

Moim problemem jest znalezienie sposobu SSH na serwer Linux (Ubuntu 18.04), którego adres IP zmienia się codziennie.

Mam klienta, któremu czasami pomagam w zadaniach administracyjnych. Potrzebuję ssh do komputera, kiedy potrzebują pomocy, ale nie mają statycznego adresu IP, więc publiczny adres IP serwera ciągle się zmienia. Stworzyłem mały skrypt do zgłaszania adresu IP maszyny z systemem Linux i stwierdzam, że zmienia się on raz dziennie około południa.

Jestem w stanie skonfigurować SSH i działa zarówno lokalnie, jak i zdalnie ... aż do zmiany adresu IP. Gdy to się stanie, nie będę już mógł połączyć się zdalnie, nawet przy użyciu nowego adresu IP.

  • Czy muszę ponownie uruchamiać usługę SSH przy każdej zmianie adresu IP?
  • Jeśli tak, to dlaczego?
  • Czy muszę podjąć jakieś inne działania, gdy zmieni się adres IP, aby umożliwić dostęp do SSH?

AKTUALIZACJA

Dla jasności moim problemem NIE jest znalezienie nowego adresu IP. Mam już skrypt, aby to zrobić. Problem polega na tym, że serwer przestaje odpowiadać po zmianie adresu IP, mimo że próbuję połączyć się przy użyciu nowego adresu IP.

Jeśli zrestartuję usługę SSH na komputerze docelowym, mam ponownie dostęp zdalny. Ale nie rozumiem, dlaczego powinienem to zrobić. Chciałbym poznać przyczynę w nadziei na znalezienie lepszego rozwiązania.

Wydaje się, że większość ludzi uważa, że ​​SSH powinno działać tak długo, jak znamy nowe IP, więc czy jest to coś wyjątkowego do 18.04? Niedawno zainstalowałem ten serwer dla klienta, więc wszystkie ustawienia konfiguracji są nadal domyślne. (Nie wiedziałby, jak to zmienić.)

Richard
źródło
8
Użyj dynamicznych dns .
Ipor Sircer,
12
Krzycz na ich usługodawcę internetowego. Zmiana adresu IP raz dziennie jest absurdalna w przypadku połączenia biznesowego, a nawet stosunkowo niespotykana w przypadku połączenia mieszkaniowego.
Michael Hampton,
2
Mówisz, że dostęp ssh przestaje działać po zmianie adresu IP. Ale nie powiedziałeś, kiedy znów zacznie działać. Zakładam, że musi jakoś znowu zacząć działać, inaczej nie widziałbyś, żeby przestał działać każdego dnia. I nie trzeba nic robić, gdy zmienia się adres IP. Serwer ssh będzie natychmiast dostępny pod nowym adresem IP.
kasperd
1
Może się zdarzyć trochę dziwności, na przykład działającego DDNS, i czegoś takiego jak ListenAddress <dynamic host name>w pliku konfiguracyjnym sshd, być może dlatego, że ktoś nie chciał, aby użytkownicy wewnętrzni mogli ssh na serwerze. Wymagałoby to zrestartowania serwera ssh przy każdej zmianie adresu IP.
Guntram Blohm obsługuje Monikę
1
@MichaelHampton: Wrzask prawdopodobnie nie pomoże, płacenie będzie. Przy obecnym niedoborze adresów IPv4 większość dostawców pobiera dodatkową opłatę za statyczny adres IPv4 (niektórzy nawet pobierają dodatkową opłatę za niestatyczny publiczny adres IP, w przeciwnym razie otrzymasz Dual Stack Lite ). Oczywiście, jeśli OP działa na IPv6, wszystko się zmienia ...
sleske,

Odpowiedzi:

21

Inne odpowiedzi wydają się przeoczyć jedną rzecz w twoim pytaniu:

Gdy to się stanie, nie będę już mógł połączyć się zdalnie, nawet przy użyciu nowego adresu IP

DDNS pomoże ci znaleźć nowy adres IP, ale wydaje się, że nie stanowi to problemu.

Niestety, serwer otrzymujący nowy adres IP nie powinien stanowić problemu w standardowej konfiguracji, w której dostawca usług internetowych zapewnia router, serwer ma wewnętrzny adres za routerem, a router wykonuje przekierowanie portów. Konieczne może być podanie dodatkowych informacji na temat topologii sieci, aby uzyskać dobrą odpowiedź.

Mogę sobie wyobrazić, że serwer nie znajduje się za routerem i nie wykonuje własnego połączenia PPPoE, a a) serwer ssh wiąże się z określonym adresem interfejsu w punkcie restartu serwera, b) zapora sieciowa na komputerze, która pozwala przychodzącym ssh na tylko adres IP serwera z zaporą ogniową nie aktualizuje się, gdy zmienia się adres IP.

Aby sprawdzić pierwszy przypadek, zrobić netstat -nta | grep -w 22 | grep LISTEN. Jeśli mówi 0.0.0.0:22, to w porządku; jeśli wyświetla konkretny adres IP, sprawdź plik konfiguracyjny sshd ( /etc/sshd.conf) dla ListenAddress.

Aby sprawdzić drugi przypadek, zrób iptables -L -ni sprawdź, czy jedna z reguł w INCOMINGłańcuchu odpowiada adresowi IP twojego serwera i portowi 22.

Jeśli jeden z nich ma bieżący adres serwera, musisz go zmienić na 0.0.0.0 (upewnij się, że wiesz o implikacjach bezpieczeństwa) lub zaktualizować regułę / konfigurację za każdym razem, gdy zmienia się adres IP.

Edytować

Ponieważ serwer znajduje się za routerem, powyższe pomysły prawdopodobnie nie mają zastosowania (*). W tej konfiguracji router ma zewnętrzny adres IP (który zmienia się codziennie), a urządzenia wewnętrzne powinny mieć adresy 10.xyz lub 192.168.xy, które nie powinny się zmieniać. Łączysz się z adresem zewnętrznym, a router powinien przekierować port na adres wewnętrzny.

Przekazywanie portów nie powinno się przerywać, gdy zmienia się zewnętrzny adres IP (istniejące połączenia ssh zostaną jednak zerwane), ale być może jest to reguła, która nie została skonfigurowana przez Ciebie, ale przez jakąś magię UPNP, gdy router upuszcza UPNP do przodu, gdy się dostanie nowy adres, a sshd wywołuje regułę tylko po ponownym uruchomieniu. Czy sam skonfigurowałeś port forwardera w routerze?

Lub zmienia się wewnętrzny adres IP serwera - w takim przypadku coś jest poważnie zepsute z twoim DHCP. Nadaj swojemu serwerowi stały adres wewnętrzny.

A może używasz IPV6? Istnieją pewne konfiguracje, w których urządzenie ciągle zmienia swój adres IP, aby utrudnić jego śledzenie. Zobacz na przykład https://www.internetsociety.org/blog/2014/12/ipv6-privacy-addresses-provide-protection-against-surveillance-and-tracking/ - ale w takim przypadku wstydź się, że nie wspominając o tym w swoim oryginalnym poście. Może to oznaczać, że router w ogóle nie wykonuje translacji NAT, a moje oryginalne pomysły są nadal aktualne nawet za routerem.

Guntram Blohm wspiera Monikę
źródło
2
+1 za to, że jest pierwszą odpowiedzią na to, o co pytano w pytaniu.
kasperd
@Guntram Blohm Dzięki za odpowiedź! Serwer znajduje się za routerem. Czy te dwie możliwości byłyby nadal aktualne w tym scenariuszu? Jeśli tak, sprawdzę je oba następnego dnia, kiedy będę mógł uzyskać lokalny dostęp do docelowej maszyny.
Richard
11

Dynamiczny DNS jest jedną z opcji, inną jest poczta serwera lub w inny sposób wysyłanie ci adresu IP. Wystarczy proste wywołanie HTTP (do punktu końcowego, który kontrolujesz i logujesz żądania).

Możliwe jest również rozwiązanie całej sieci publicznej na odwrót; serwer może skonfigurować tunel zwrotny lub połączenie VPN, na które zmiana IP nie będzie miała wpływu.

Jeśli chodzi o usługi, które nie odpowiadają na nowy adres: zależy to całkowicie od konfiguracji sieci. Na przykład: WAN IP na wewnętrznym interfejsie przez DHCP i serwer SSH ustawiony tak, aby nasłuchiwał tylko IP na twoim interfejsie znanym podczas uruchamiania, oznaczałoby to, że sshd musi zostać zrestartowany po zmianie interfejsu.

John Keates
źródło
1
Jak opisano w pytaniu, istnieje już rozwiązanie pozwalające znaleźć nowy adres IP. Zatem dodanie dynamicznego DNS tak naprawdę nie rozwiązałoby żadnych problemów. Opisany problem polega na tym, że serwer ssh przestaje odpowiadać, gdy zmienia się adres IP. Nie rozwiązałeś tego problemu. Oczekuje się, że połączenia VPN i tunele zwrotne przestaną działać po zmianie adresu IP, więc potrzebujesz czegoś, aby je automatycznie uruchomić ponownie.
kasperd
7

Naprawdę powinieneś zajrzeć do usług ddns. O ile zdalnie można połączyć się z pewną maszyną z dynamicznym adresem IP; ddns jest najczęściej stosowanym rozwiązaniem.

udaj się na https://noip.com i załóż konto (to, errr ... podobno..coff..cof .. Bezpłatnie dla 1-3 komputerów działających w tej samej sieci (jeśli się nie mylę, nie cytuj ja tutaj: minęło trochę czasu, odkąd zaufałem żadnej z tych „darmowych” usług ...) Istnieją również inne alternatywy, takie jak Afraid DNS ( https://freedns.afraid.org/ A nawet, Cisco, Open DNS: może być również wykorzystane (pod warunkiem, że nie jest to tylko klient, sugerowałbym, aby zapisać się na próbną próbę konta, wypróbować go, a później zarejestrować się na prawdziwą Okazja >>> otrzymali nawet jedno z nich, przypominające GUI, do pobrania rozszerzenia, które automatycznie odnawiają nazwę hosta ddns, ilekroć zmieni się adres IP twojego klienta. To naprawdę jest najłatwiejszy, bez wiedzy technicznej sposób, o którym wiem [tylko w jeśli musisz zadzwonić do jednego ze swoich klientów i poprosić o pobranie GUI zamiast ...])

dotbiggie
źródło
3
Chociaż jest to z pewnością pomocne w uzyskiwaniu dostępu do hosta przy zmianie adresów IP, nie o to pyta pytanie. Pytanie brzmi, dlaczego serwer ssh przestaje odpowiadać, gdy zmienia się adres IP i jak to naprawić. Dynamiczna usługa DNS tego nie rozwiązuje.
kasperd
4

Jestem w stanie skonfigurować SSH i działa zarówno lokalnie, jak i zdalnie ... aż do zmiany adresu IP. Gdy to się stanie, nie będę już mógł połączyć się zdalnie, nawet przy użyciu nowego adresu IP.

Czasami zmiany DHCP zaczynają obowiązywać. Spróbuj ponownie uruchomić klienta DHCP na komputerze docelowym

$> sudo dhclient -r
$> sudo dhclient
Do I need to restart the service every time the IP address changes?
If so, why?

Nie. Ponowne uruchomienie usługi ssh wymaga jedynie zmiany konfiguracji ( /etc/ssh/sshd_conf).

Czy muszę podjąć jakieś inne działania, gdy zmieni się adres IP, aby umożliwić dostęp do SSH?

Nie.

Mam rozwiązanie, które zakłada, że ​​masz skonfigurowane sendmail na komputerze docelowym.

Ten skrypt wysyła wiadomość e-mail, która pokazuje adres IP, który świat uważa, że ​​mamy (Dzięki ipify.org). E-mail zawsze będzie miał najbardziej aktualny adres IP.

  1. Utwórz skrypt bash dhcp-powiadomienie (bez rozszerzenia .sh)
  2. Włóż skrypt /etc/dhcp/dhclient-exit-hooks.d

    #!/bin/sh
    case "$reason" in (BOUND|RENEW|REBIND|REBOOT)
    (
       echo To: [email protected]
       echo From: [email protected]
       echo "Content-Type: text/html; "
       echo Subject: DHCP reason: $reason
       echo
       echo Your IP address is: `curl -s https://api.ipify.org`
    ) | sendmail -t
    ;;
    esac
    

Jeśli to nie zadziała, zawsze możesz skonfigurować crona tak, aby wysyłał ci aktualny adres IP (stracił instrukcję case).

#!/bin/sh
(
   echo To: [email protected]
   echo From: [email protected]
   echo "Content-Type: text/html; "
   echo Subject: IP address change
   echo
   echo Your IP address is: `curl -s https://api.ipify.org`
) | sendmail -t
karlchilders
źródło
Właśnie miałem to zasugerować, to świetny pomysł i pierwsza rzecz, jaka przyszła mi do głowy, gdy czytam pytanie. Ponadto, jeśli masz problemy z api.ipify.org ( z jakiegoś powodu jest zablokowany w mojej sieci szkolnej), możesz skorzystać z tej innej witryny, którą utworzyłem kilka miesięcy wcześniej i która robi to samo: findip.win
cofnij
@karlchilders Dzięki za odpowiedź! Mam już skrypt cron zgłaszający mi adres IP, ale nie miałem pojęcia o hakach dhclient. To jest niesamowite! Wolałbym, aby adres IP był zgłaszany tylko wtedy, gdy faktycznie się zmienia. Pytanie: Jeśli ten skrypt jest w stanie działać i raportować adres IP, dlaczego recykling dhclient miałby wpływać na dostęp do SSH?
Richard
@karlchilders Czy ten skrypt działa tylko podczas ręcznego recyklingu dhclient?
Richard
dhclient -r; dhclient odnowi dzierżawę dhcp, aby Twój host był aktualny. Haki będą działać za każdym razem, gdy zdarzenie dhcp wystąpi ręcznie lub w inny sposób.
karlchilders
@Richard Proszę zaznaczyć jedną z odpowiedzi jako preferowaną. Dziękuję Ci.
karlchilders
3

Myśląc nieszablonowo - czy możesz ustalić stały adres IPv6? Zwykle tylko adresy IPv4 wymagają zmiany ze względu na ich niedobór.

MSalters
źródło
Adres IP, który ściągam, to tak naprawdę za każdym razem IPv6.
Richard
1
@ Richard: Przykro mi, że to nie działa. Pozostawię odpowiedź innym osobom, które mają ten problem z IPv4.
MSalters
@Richard Naprawdę powinieneś wspomnieć w swoim pytaniu, że masz do czynienia z IPv6. To sprawia, że ​​problem jest zupełnie inny.
Dubu,
1
@Dubu Naprawdę sprawia, że ​​problem jest inny. Tego rodzaju problem po prostu nie powinien się zdarzyć na IPv6, i może dlatego wszyscy zakładali, że to IPv4. Ale w rzeczywistości możesz dostać niektóre z opisanych symptomów, jeśli omyłkowo użyjesz adresu prywatności zamiast adresu statycznego. Jeśli na przykład zapytasz witrynę o adres IP, wyświetli się twój adres prywatności zamiast adresu statycznego. A użycie tego do połączeń ssh nie jest dobrym pomysłem. Nadal nie wyjaśnia, dlaczego to nie działa, dopóki serwer ssh nie zostanie zrestartowany.
kasperd
1
@Dubu: To dość niestandardowe podejście. DHCPv6-PD (Delegowanie prefiksu) w połączeniu z unikalnym identyfikatorem DHCP (DUID) powinien temu zapobiec.
MSalters
1

Co robiłem przez prawie rok. Wpadłem na twój problem w styczniu tego roku, wygłaszając przemówienie na moim lokalnym uniwersytecie.

Od tego czasu ten skrypt działa na moim komputerze: // Samo wyjaśnienie //

import smtplib
from requests import get
import time

user = '[email protected]'
psd = 'examplepassword'
msg = 'Hey, your ip has changed! Use this one from now on: '
currip = '0.0.0.0' # It'll send an email the first time you execute this aswell
while True:
    newip = get('https://api.ipify.org').text
    if currip == newip:
        print("nonewip")
        #You can just comment the line above this one if you want to
    else:
        tmpmsg = "\n"+msg + newip +" The old one used to be: "+currip
        currip = newip
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.connect('smtp.gmail.com')
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(user,psd)
        #You can change the second parameter, use ('from','to','message')
        server.sendmail(user, user, tmpmsg)

        server.quit()
        with open('/home/pi/DEV/iphistory.txt', 'a') as f:
            f.write('newip: '+currip+'\n')
            f.close()
        print('New IP Found: '+tmpmsg)
    time.sleep(7200)

Python 3.x powinien działać bezbłędnie Może nie jest to najlepsze rozwiązanie, ale działa.

Otrzymasz wiadomość e-mail do skrzynki odbiorczej za każdym razem, gdy zmieni się publiczny adres IP urządzenia.

Teraz odnośnie twoich pytań:

Czy muszę ponownie uruchamiać usługę przy każdej zmianie adresu IP? Jeśli przez ponowne uruchomienie usługi masz na myśli przywrócenie połączenia ssh, tak.

Jeśli tak, to dlaczego? Ponieważ jeśli adres, z którym próbujesz się komunikować, nie zapewnia już usługi, której szukasz. To już nie jest twoja maszyna.

Czy muszę podjąć jakieś inne działania, gdy zmieni się adres IP, aby umożliwić dostęp do SSH? Po prostu SSH na nowy adres.

Twoje zdrowie! JSR

Jaime Satorres Rey
źródło
Dzięki za odpowiedź @JSR! Napisałem podobny skrypt, aby zgłosić mi adres IP. Ale gdy się zmieni, nawet znając nowy adres IP, nie mogę połączyć się z SSH na zdalnym komputerze. Czy napotkałeś ten problem?
Richard
Czy na pewno odzyskujesz właściwy adres? jeśli tak, spróbuj pingować po uzyskaniu adresu IP. Nigdy wcześniej nie widziałem tego problemu. Na wypadek, gdybyś nie wiedział, możesz uruchomić skrypt w tle za pomocą „python3 scriptname.py &”. Ponadto sprawdź porty przekierowania routera, zakładam, że lokalny adres IP nie się zmieniają, ale nadal warto to sprawdzić.
Jaime Satorres Rey,
Tak, adres IP jest poprawny. Jeśli zrestartuję usługę SSH na komputerze docelowym, będę mógł połączyć się ponownie. Ale nie rozumiem, dlaczego tak powinno być.
Richard
@ Problem polega na tym, że ponieważ zmienia się twój adres IP, twój host zatrzymuje każde połączenie, ponieważ klucz RSA, którego używasz do uwierzytelnienia, nie zgadza się z tym, którego żąda. W żadnym wypadku nie jestem ekspertem w tym temacie, więc nie bierz moich słów za fakt ... Ale twoja sytuacja jest PRAWDOPODOBNIE z powodu tego, co właśnie powiedziałem.
Jaime Satorres Rey,
1

Warto to zobaczyć z innej strony: zazwyczaj znacznie łatwiej jest utworzyć zewnętrzne połączenie z komputerem, które wymaga Twojej uwagi (DNS, NAT i inne ustawienia zapory nie mają żadnego znaczenia lub są znacznie prostsze).

Możesz użyć tego do stworzenia odpornego na pociski i prostego rozwiązania, aby dostać się na zdalną maszynę R. Jedynym wymogiem jest to, że możesz zapewnić publiczny sshdostęp do jednego ze swoich lokalnych komputerów (nazwijmy to S). Następnie wykonaj następujące czynności:

  1. Utwórz sshpołączenie zewnętrzne od Rdo S, ustanawiając tunel zwrotny z powrotem doR :

    ssh -L 22:<address-of-S>:22000

  2. Włącz S, użyj tunelu zwrotnego do sshzdalnego komputera R:

    ssh -p 22000 127.0.0.1

Krok 1 może być uruchamiany ręcznie i na żądanie przez zdalną stronę, gdy tylko potrzebna jest twoja pomoc. Alternatywnie, możesz utworzyć usługę, Rktóra będzie stale utrzymywać taki tunel zwrotny do S.

Użyłem takiej konfiguracji do logowania się do zdalnych (mobilnych) systemów, które znajdowały się za firewallami / NAT i które w ogóle nie miały wpisów DNS.

Alex O
źródło
1

Jeśli potrzebujesz tylko zdalnego logowania, użyj mosh . Poza tym, że doskonale radzi sobie ze zmianami adresu IP (prawie bez opóźnień podczas przełączania), ma również inne zalety w stosunku do zwykłego ssh, takie jak lokalne echo predykcyjne, małe opóźnienie, znacznie szybsze odzyskiwanie z uszkodzonych łączy.

Jeśli konkretnie potrzebujesz ssh(powiedzmy, potrzebujesz przekierowania X11 lub czegoś takiego), sugeruję skonfigurowanie VPN (np. OpenVPN), najlepiej przez UDP, z krótkim podtrzymaniem. Połączenia TCP (tj. Twój ssh) przez VPN będą się leczyć i pozostaną połączone po zmianie adresu IP, potrwa to dłużej (do około minuty), ale możesz grać z /proc/sys/net/ipv4/tcp_*wpisami, aby było bardziej akceptowalne.

Edytować:

  • mosh potrzebuje sshuwierzytelnienia, ale po uwierzytelnieniu połączenie pozostaje do wylogowania (lub zrestartowania) i możesz sprawdzić awarię sshw wolnym czasie (np. strace -f -p pid_of_sshd )
  • możliwe jest użycie moshbez ssh, odpowiedź dostosowana stąd :

Na serwerze uruchom:

mosh-server new -p $randomport -- $shellprogram

otrzymujesz wynik jak QzdRHbAWzL7eRobi75DCrz

W trybie klienta:

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

Pamiętaj, że $serveripmusi to być adres IP, bez rozpoznawania nazw hostów.

To, jak dostaniesz klucz z jednej strony na drugą, zależy od ciebie. Sugeruję szyfrowanie za pomocą klucza wstępnego i wiadomości błyskawicznych, wysyłanie wiadomości e-mail lub zmuszanie lokalnego użytkownika do dyktowania go przez telefon.

  • jeśli naprawdę jest problem z ssh, zainstaluj inetdi uruchom stamtąd ssh, a nie jako samodzielny demon, np. za pomocą tej linii konfiguracyjnej dla „klasycznego” pliku inetd.conf, spowoduje to uruchomienie nowego demona przy każdym logowaniu (pamiętaj, że nie wszystkie Obsługa wideł inetd ipv6):

ssh stream tcp6 nowait root /usr/sbin/sshd sshd -i

Radovan Garabík
źródło
1
Dzięki za odpowiedź @Radovan! Mosh wygląda interesująco, ale wygląda na to, że używa SSH do uwierzytelnienia. Więc źródło mojego problemu nadal istniałoby, prawda? Daj mi znać, jeśli źle zrozumiałem dokumenty.
Richard
@Richard Tak, jednak istnieją możliwości ... Zredagowałem swoją odpowiedź.
Radovan Garabík