TechLife devBlog

Łą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

Graffi 04.11.2011 / 23:41

póki miałem dynamiczny IP to używałem czegoś takiego odpalanego co minutę w cronie:

#!/bin/bash

MOJ-IP=`cat /home/users/graffi/.bin/mojIP`
terazIP=`/sbin/ifconfig ppp0 | /bin/grep 'inet addr' | /bin/sed -e 's/^.*addr://' | /bin/sed -e 's/ P-t-P.*$//'`
teraz=`date`

if [ "$terazIP" = "$MOJ-IP" ]; then
    echo "$teraz rowne" >> /home/users/graffi/.bin/dyndnsHistoria
else
    echo "$terazIP" > /home/users/graffi/.bin/mojIP
    echo "$teraz $terazIP" >> /home/users/graffi/.bin/dyndnsHistoria
    /home/users/graffi/.bin/ddclient/ddclient -ip $terazIP -file /home/users/graffi/.bin/ddclient/conf
fi

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

vmario 05.11.2011 / 00:08

Ja bym spróbował na komputerze zdalnym uruchomić OpenVPN-a, a komputerowi lokalnemu kazał utrzymywać z nim połączenie.

d4rky 05.11.2011 / 04:40

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.

mina86 05.11.2011 / 07:04

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ś.

trójkąt 05.11.2011 / 12:31

@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?

Graffi 05.11.2011 / 12:50

@trójkąt, z tego co ze 2 tygodnie tymu u klienta robiłem kamerki to darmowy dyndns działa jak widzę

a_patch 05.11.2011 / 13:53

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.

mina86 05.11.2011 / 15:39

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.

z tego co widzę to skryptowi synchronizującemu FreeDNS::42 trzeba podać nowy adres IP jako parametr.

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.

Jacek 05.11.2011 / 18:33

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)

Radek 05.11.2011 / 21:04

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.

rozie 05.11.2011 / 22:46

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.

pecet 05.11.2011 / 23:41

ipv6

może od razu mu poleć okulary z grubą ramą, jak ma być hipsterem :)

rozie 06.11.2011 / 08:57

@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ć.

pecet 06.11.2011 / 12:15

@rozie -- miejmy nadzieję, że tak nie będzie, jestem przeciwnikiem ipv6

trójkąt 06.11.2011 / 15:36

Dzisiaj dostałem takiego maila:

Dear Dyn Customer:

The hostname trojkat.dyndns.org in account trojkat, has been blocked for abusive updates.

This can happen because we have received multiple "updates" with the same IP address. Updates should only occur when your IP address actually changes.

Odpalałem klienta dyndns co godzinę. Widocznie wykrywać zmiany IP i tak muszę sam :-/

Stanisław 'dozzie' Klekot 10.11.2011 / 21:11

Dlaczego mi to wygląda jak zadanie dla procedury RPC uruchamiającej nsupdate dla dynamicznej strefy DNS?

Adam Ziaja 21.01.2012 / 05:00

Lepiej lokalne monitorowanie czy uległo zmianie IP, a jeśli tak to update strefy DNS z TTL 60. Albo też po prostu DynDns.



Komentarze