Łączenie przez SSH na dynamiczne IP
Internet 4th Nov 2011
Kiedyś korzystałem z różnych serwisów z cyklu NO-IP. Z czasem jednak niektóre się pozamykały a inne stały się płatne. Nie miałem też ochoty rejestrować się i testować nowych rozwiązań, po których do końca nie było wiadomo czy na pewno są darmowe czy może płatne. Wymyśliłem więc prosty trick.
The story
W biurze mam stale działający komp, który służy do robienia backupów z naszych serwerów. Czasem z domu chcę coś na nim pogrzebać ale problem polega na tym, że nasz Netiowy ADSL co jakiś czas zmienia IP. Żeby więc móc za każdy razem połączyć się przez SSH muszę śledzić zmiany IP.
The trick
Metoda jest bardzo prosta. Wystarczy posiadać internetowy serwer (nazwijmy go serwerem zdalnym), który spełni rolę pseudo DNS-a, czyli zapytany o namiary na biurowy serwer (nazwijmy do serwerem lokalnym) zdradzi nam jego IP.
W tym celu na serwerze zdalnym piszemy prosty skrypt, który serwer lokalny będzie odpalał co godzinę.
nazwijmy go zapisz-ip.sh
#/bin/sh
echo $SSH_CLIENT | cut -f1 -d' ' > /tmp/ip
Tak przygotowany plik zapisujemy np. w katalogu bin w katalogu domowym użytkownika (czyli /home/tomek/bin/zapisz-ip.sh
) i oczywiście dajemy mu prawa do wykonywania (chmod +x bin/zapisz-ip.sh
). Jak widać skrypt ze zmiennej $SSH_CLIENT
wyciąga adres IP i zapisuje go do pliku /tmp/ip
.
Teraz na serwerze lokalnym (tym w biurze) ustawiamy w cronie zadanie wywoływania tego skryptu co godzinę. Czyli stukamy crontab -e
i piszemy:
11 * * * * tomek@ADRES-SERWERA-ZDALNEGO.pl ~tomek/bin/zapisz-ip.sh
Tutaj należy wspomnieć, że połączenie pomiędzy serwerem lokalnym a zdalnym powinno odbywać się poprzez autoryzację kluczem SSH. W przeciwnym wypadku skrypt zatrzyma się na etapie podawania hasła.
Mamy więc na serwerze zdalnym stale uaktualniany plik /tmp/ip
zawierający bieżące IP serwera lokalnego. Żeby teraz połączyć się z serwerem lokalnym z dowolnego innego miejsca wystarczy przy łączeniu przez SSH adres IP odczytać z serwera zdalnego. Wygląda to tak:
ssh tomek@`ssh tomek@ADRES-SERWERA-ZDALNEGO.pl cat /tmp/ip`
Najlepiej oczywiście wsadzić to w jakiś skrypt i wywoływać jednym poleceniem. Taki sam efekt można uzyskać wykorzystując serwer www z obsługą np. PHP + prosty skrypt zapisujący do pliku adres IP a następnie serwujący go pod jakimś URL-em.
PS. Jeżeli trick wydaje Wam się zbyt banalny to polecam niezłą listę 100 darmowych gier na Linuksa ;-).
Komentarze z jogger.pl
póki miałem dynamiczny IP to używałem czegoś takiego odpalanego co minutę w cronie:
nie mniej jednak czasy te minęły i mimo że dalej posiadane przeze mnie łącze jest zwykłym ADSLem to jednak obecny operator daje mi stały IP i nie muszę żadnego dyndnsa utrzymywać :)
jak Ci się przyda to zawsze możesz częściej sprawdzać czy aby numer się nie zmienił i wysyłać info
ten moj skrypt nawet prowadził plik z historią kiedy się numery zmieniały i na jakie ;)
aha, jak masz router a nie modem segam neostradowy stary dobry, to też nie wielki problem, posiedzieć tylko i napisać skrypt który kulturalnie zaloguje się na router i odczyta jaki ten ma numer publiczny
Ja bym spróbował na komputerze zdalnym uruchomić OpenVPN-a, a komputerowi lokalnemu kazał utrzymywać z nim połączenie.
Dziwne te twoje tricki. U mnie ani $SSH_CLIENT nie działa, ani wywoływanie skryptu ze zdalnego serwera poprzez podanie jego nazwy i polecenia nie uruchamia się jak jest to założone w twoim skrypcie.
Eee... To nie lepiej po prostu sobie FreeDNS::42 skonfigurować? Wydaje się to znacznie prostsze i bezpieczniejsze od klucza SSH bez hasła używanego z crontaba.
(Nie wspominając, że wiele routerów ma wbudowaną obsługę dyndns.org i podobnych serwisów.)
PS. Zupełnie z innej beczki, niektórzy ludzie wykorzystują Ctrl+H. No i pod Ctrl+B też coś podpiąłeś.
@d4rky: na jakiej dystrybucji testujesz i na jaką powłokę się logujesz?
@mina86: z tego co widzę to skryptowi synchronizującemu FreeDNS::42 trzeba podać nowy adres IP jako parametr. Z dyndns.org korzystałem do czasu ich ostatniej migracji, kiedy to zniknęło moje konto. Ktoś wie, czy te ich darmowe konta w dalszym ciągu są używalne?
@trójkąt, z tego co ze 2 tygodnie tymu u klienta robiłem kamerki to darmowy dyndns działa jak widzę
Dyndns działa, ale możesz mieć tylko dwa hosty i co jakiś czas (miesiac, albo dwa) wysyłają link do potwierdzenia. Raz zapomnisz i ci skasują konto.
Nigdy jeszcze mi nic nie wysłali I ciągle mam konto.
wget -o /dev/null -O - http://automation.whatismyip.com/n09230945.asp
whatismyip.com pozwala na korzystanie z tego nie częściej niż raz na 5 minut.
Można też napisać do Piotra czy nie dałoby zrobić detekcji po stronie serwera, co nie powinno być zbyt skomplikowane.
I dlatego wymyślono DynDNS / no-ip.com aby nie mieć tych problemów i nie wynajdowac kola na nowo
Ja polecam DynDNS - mam tam 3 konta od ~10 lat i zero problemów (poza tym że swego czasu ograniczyli liczbe hostow do 1)
Ja też używam http://no-ip.pl/ - nie musiałem się niczego douczać, żeby to poustawiać i od kilku lat działa bezbłędnie.
Dyndns był (polecam), o niebezpieczeństwie wywoływania skryptu po SSH było, zostało dodać 2 dodatkowe możliwości:
1. Wywołujesz cyklicznie wget określonego pliku z określonego miejsca na serwerze, na którym masz dostęp do logów. Bieżące IP sprawdzasz w logach serwera.
2. Uruchom tunel IPv6 i masz stały, publiczny adres IP, niezależnie od zmieniającego się adresu IPv4. Łączność IPv6 gratis.
może od razu mu poleć okulary z grubą ramą, jak ma być hipsterem :)
@pecet: KISS. Funkcjonalność jest, rzeźby chyba najmniej (NAT piercing gratis), eleganckie. A jeśli UKE zrealizuje swój szalony pomysł, to za niecały rok wszyscy i tak będą natywnie po IPv6 pomykać.
@rozie -- miejmy nadzieję, że tak nie będzie, jestem przeciwnikiem ipv6
Dzisiaj dostałem takiego maila:
Odpalałem klienta dyndns co godzinę. Widocznie wykrywać zmiany IP i tak muszę sam :-/
Dlaczego mi to wygląda jak zadanie dla procedury RPC uruchamiającej
nsupdate
dla dynamicznej strefy DNS?Lepiej lokalne monitorowanie czy uległo zmianie IP, a jeśli tak to update strefy DNS z TTL 60. Albo też po prostu DynDns.