Wystawiamy Domoticz na Świat nie mając publicznego adresu IP

Często znajduję w sieci pytania związane z problemem nieposiadania przez użytkowników publicznego adresu IP. Często też „brak publicznego adresu IP” jest mylony ze „zmiennym adresem IP” a to nie jest ten sam problem.

Często te pytania pojawiają się, gdy ktoś chce wystawić swojego Domoticza na szeroki internet.

Różnica między IP prywatnym a publicznym: http://ictprofessional.pl/prywatne-ip-vs-publiczne-ip/

To, że nie mamy publicznego adresu IP oznacza, że od dostawcy internetu dostajemy adres prywatny  (na przykład adres w postaci 192.168.3.11 lub 10.14.0.14) do interfejsu WAN routera, do którego mamy dostęp jako administrator. Zmienne IP to IP publiczne jakie dostajemy na interfejs WAN swojego routera ale zmieniające się co jakiś czas.

Znając IP w danym czasie i przy odpowiednim skonfigurowaniu naszego routera możemy z zewnątrz sieci (czyt. z internetu) dostać się do maszyn w naszej sieci lokalnej. Przy braku adresu publicznego jest to wprost niemożliwe gdyż nie możemy dokonać przekierowań portów na routerach dostawcy internetu.

Sposobem na rozwiązanie problemu  zmiennego IP jest zastosowanie serwisów typu Dynamic DNS, śledzących zmienne IP i przypisywanie go jakiejś stałej nazwie domenowej. Takie serwisy to między innymi „DynDNS”, „No-IP” itp. Działa to tak, że jakiś serwis uruchomiony w naszej sieci prywatnej raportuje do serwisu Dynamic DNS aktualnie przydzielony adres IP a serwis przypisuje jakąś nazwę domeny (na przykład kowalski12.dyndns.com) do aktualnego IP. Zatem gdy odwołamy się do tego adresu to serwis Dynamic DNS odeśle nas pod nasz aktualny adres IP.

Z brakiem publicznego IP już nie jest tak łatwo i tu trzeba zastosować inne tricki.

Jednym z rozwiązań, które właśnie postanowiłem opisać jest wykorzystanie maszyny z linuxem, działającym gdzieś w internecie, posiadającym publiczny i stały adres IP jako „drzwi” do naszej prywatnej sieci. Teraz pewnie wiele osób zapyta:

– no tak, ale skąd wziąć taką maszynę? Przecież to musi dużo kosztować!

Otóż nie, nie kosztuje to dużo i bardzo łatwo taką maszynę zdobyć. Istnieje bardzo dużo firm, które oferują serwery wirtualne (VPS) za kilka złotych miesięcznie w systemie pre-paid, czyli doładowujemy sobie konto za kilkadziesiąt złotych i mamy VPS na rok lub więcej. Taki VPS możemy wykorzystać do bardzo wielu zadań. Od postawienia swojej strony internetowej, serwera pocztowego do… i tu „sky is the limit”…

Jeśli chodzi o firmy oferujące serwery wirtualne to osobiście polecam https://tiktalik.com/pl/ ze względu na prostotę obsługi panelu zarządzania. Serwer wirtualny jaki potrzebujemy kosztuje tam około 9 zł miesięcznie. Są firmy, gdzie to może kosztować nawet około 5 złotych lub nawet można poszukać czegoś za free. Oczywiście wybór firmy należy do Ciebie.

Nie będę tu opisywał jak utworzyć VPS gdyż takie operacje wykonuje się za pomocą kreatorów w panelach zarządzania dostawców, gdzie krok po kroku „wyklikujemy” taką maszynę.

Jeśli posiadamy już swój VPS, znamy jego IP publiczne oraz nazwę rozwiązywaną przez DNSy, to przystępujemy do opracowania koncepcji wdrożenia ominięcia braku publicznego adresu IP. Koncepcja ta rozwiązuje przy okazji także problem zmiennego adresu IP.

Przyjmujemy że publiczny adres IP VPS to 212.54.180.3 (losowy, przykładowy IP), natomiast adres naszego Raspberry PI, na którym zainstalowaliśmy Domoticz to prywatny adres 192.168.1.17 w sieci domowej.

Normalnie nie mamy żadnej możliwości aby z adresu 212.54.180.3 ustanowić połączenia z naszym Raspberry bez użycia specjalistycznych narzędzi pomijających NAT i zabezpieczenia.

Jednym z naszych celów jest taka konfiguracja aby po wpisaniu w przeglądarkę adresu publicznego 212.54.180.3 i powiedzmy domyślnego portu dla http, VPS przekierował nas do sieci wewnętrznej na adres Raspberry PI i port 8080 by wyświetlić stronę naszego Domoticza.

Żeby jednak było to możliwe, musimy w jakiś „bezpośredni” sposób połączyć VPS z Raspberry PI. Robimy to poprzez bardzo lekki VPN P2P jakim jest N2N. Teraz wiele osób zapewne z oburzeniem zapyta, dlaczego jakieś N2N, o którym nigdy nie słyszałem, jak mamy inne wspaniałe VPNy?… Otóż dlatego, że N2N jest bardzo prosty do skonfigurowania i świetnie spełnia swoje zadanie, nie potrzebuje też ciężkich klientów a jeśli ktoś odkryje zasadę całego rozwiązania to będzie sobie mógł podmienić w każdej chwili N2N na jakiś swój ulubiony VPN. Zaletą N2N jest też to, że działa on na zasadzie P2P czyli coś podobnie jak hamachi ale nie korzysta przy tym z „negocjatorów” połączenia firm trzecich  tylko z naszego zainstalowanego na VPS.

Załóżmy zatem, że mamy już swoją maszynę VPS i potrafimy się do niej zalogować przez SSH. Przystępujemy więc do instalacji N2N na VPS wykonując następujące polecenia:

sudo apt update
sudo apt install n2n

po zainstalowaniu pakietów uruchamiamy usługę poleceniem:

supernode -l 82 &

co spowoduje, utworzenie węzła sieci p2p, do którego będą się łączyć klienci: VPS i Raspberry PI – jest to nasz prywatny węzeł i możemy do niego podłączyć wiele klientów N2N.

Musimy zadbać aby usługa startowała wraz z systemem, umieszczając na przykład odpowiedni wpis w pliku /etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

supernode -l 82

exit 0

Zapisujemy plik rc.local.

Teraz odszukujemy na VPS plik konfiguracyjny klienta N2N w lokalizacji /etc/default/ o nazwie n2n i edytujemy go następująco:

# Config file for the n2n edge node daemon.

# Sets the n2n community name. All edges within the same community appear on
# the same LAN (layer 2 network segment). Community name is 16 bytes in length.
N2N_COMMUNITY="MyNetworkName" # tu spisujemy wymyśloną przez siebie nazwę.

# Sets the twofish encryption key from ASCII text. All edges communicating must
# use the same key and community name.
N2N_KEY="MyPassW0rd" # tu wymyślamy hasło zabezpieczające naszą sieć N2N

# Sets the n2n supernode IP address and port to register to.
N2N_SUPERNODE="212.54.180.3" # tu wpisujemy adres IP naszego VPSa
N2N_SUPERNODE_PORT="82"

# Sets the n2n virtual LAN IP address being claimed. This is a private IP
# address. All IP addresses in an n2n community typical belong to the same /24
# net‐ work (ie. only the last octet of the IP addresses varies).
N2N_IP="192.168.2.1" # tu nadajemy adres IP sieci N2N naszemu VPS

N2N_DAEMON_OPTS=""

# Uncomment this to get edge node started.
N2N_EDGE_CONFIG_DONE="yes"

#TODO
# add routing option
#sudo ip route add 192.168.2.0/24 via 192.168.2.1

Czyli zmieniamy następujące zmienne:

  • N2N_COMMUNITY – nadajemy swoją przyjazną nazwę sieci N2N
  • N2N_KEY – hasło zabezpieczające sieć N2N
  • N2N_SUPERNODE – adres IP supernode, który uruchomiliśmy na początku, czyli nasz przykładowy adres 212.54.180.3
  • N2N_SUPERNODE_PORT – port na którym działa nasz supernode czyli tak jak go uruchomiliśmy wcześniej z opcją -l wskazując na port 82.
  • N2N_IP – adres wirtualnego interfejsu sieciowego sieci N2N na naszym VPS.
  • N2N_EDGE_CONFIG_DONE=”yes” – to musimy odkomentować aby N2N startowało jako usługa wraz z systemem.

Po zapisaniu pliku wykonujemy start usługi N2N:

sudo /etc/init.d/n2n start

Jeśli usługa uruchomiła się bez błędów to wykonujemy sprawdzenie połączenia poprzez ping:

ping 192.168.2.1

Jeśli adres pinguje to jest OK, jeśli nie, to sprawdzamy czy nie zostały popełnione błędy w pliku konfiguracyjnym, poprawiamy i sprawdzamy jeszcze raz.

Teraz logujemy się do naszego Raspberry PI przez SSH i instalujemy N2N tak samo jak na VPS czyli:

sudo apt update
sudo apt install n2n

Na Raspberry już nie uruchamiamy supernode bo potrzebujemy go tylko na VPS.

Dokonujemy na Raspberry, podobnie jak na VPS, konfiguracji w pliku /etc/default/n2n w następujący sposób:

# Config file for the n2n edge node daemon.

# Sets the n2n community name. All edges within the same community appear on
# the same LAN (layer 2 network segment). Community name is 16 bytes in length.
N2N_COMMUNITY="MyNetworkName" # tu wpisujemy tą samą nazwę co w VPS.

# Sets the twofish encryption key from ASCII text. All edges communicating must
# use the same key and community name.
N2N_KEY="MyPassW0rd" # to samo hasło co w VPS, zabezpieczające naszą sieć N2N

# Sets the n2n supernode IP address and port to register to.
N2N_SUPERNODE="212.54.180.3" # tu wpisujemy adres IP naszego VPSa
N2N_SUPERNODE_PORT="82"

# Sets the n2n virtual LAN IP address being claimed. This is a private IP
# address. All IP addresses in an n2n community typical belong to the same /24
# net‐ work (ie. only the last octet of the IP addresses varies).
N2N_IP="192.168.2.2" # tu nadajemy adres IP sieci N2N naszemu Raspberry PI

N2N_DAEMON_OPTS=""

# Uncomment this to get edge node started.
N2N_EDGE_CONFIG_DONE="yes"

#TODO
# add routing option
#sudo ip route add 192.168.2.0/24 via 192.168.2.2

Zapisujemy plik i uruchamiamy usługę N2N na Raspberry PI.

sudo /etc/init.d/n2n start

Ponownie wchodzimy na konsolę VPSa i sprawdzamy czy działa połączenie do Raspberry Pi:

ping 192.168.2.2

Jeśli ping działa poprawnie to oznacza, że udało nam się zestawić połączenie z odległym, spoza naszej prywatnej sieci VPSem, czyli dołączyliśmy go do naszej domowej sieci a on się nam odwdzięczy publicznym adresem IP :).

Połączenie powinno działać w obie strony czyli ping z Raspberry PI na adres 192.168.2.1 też powinien działać.

Jeszcze żeby się upewnić, że wszystko działa jak trzeba to z poziomu VPS spróbujmy się zalogować przez SSH do Raspberry PI:

ssh [email protected]

Jeśli się udało, to już powinniśmy być uśmiechnięci bo wyobraźnia podpowiada nam nowe możliwości, które były wcześniej niedostępne 🙂

Teraz musimy zadbać o to, żeby VPS wiedział, jak zareagować na żądanie w postaci:

http://212.54.180.3 lub http://<domena_vps>

i wyświetlił stronę naszego Domoticza (oczywiście wcześniej zabezpieczoną odpowiednio długim i skomplikowanym hasłem w konfiguracji Domoticz). Aby to zrobić, musimy dodać reguły iptables przekierowujące port 80 serwera VPS na adres 192.168.2.2 i port 8080 oraz zdefiniować odpowiedni routing ruchu między interfejsami sieciowymi VPS.

W tym celu musimy wykonać szereg poleceń, ale żeby nie robić tego za każdym razem gdy zrestartujemy VPS, to w katalogu /etc/init.d na VPS tworzymy plik o nazwie „firewall” i wrzucamy do niego zawartość:

#!/bin/bash

## przekazywanie pakietów
sysctl net.ipv4.ip_forward=1

## czyszczenie tablic iptables
iptables -F
iptables -X
iptables -F -t filter
iptables -X -t filter

## Routing n2n na local network
ip route add 192.168.2.0/24 via 192.168.2.1

## Maskarada
iptables -t nat -A POSTROUTING -j MASQUERADE

## Port forwarding
# domoticz pi
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.2.2:8080

ustawiamy mu odpowiednie uprawnienia aby uczynić go wykonywalnym:

sudo chmod +x /etc/init.d/firewall

Uruchamiamy pierwszy raz skrypt poleceniem:

sudo /etc/init.d/firewall

Teraz możemy przetestować czy po wpisaniu w przeglądarce adresu http://<domena_vps> pojawi się strona logowania naszego Domoticza.

Istnieje klient sieci N2N na Windows, więc jeśli jest potrzeba, to można się też z komputera „wbić” na Raspberry spoza lokalnej sieci.

Osobiście mocno rekomenduję odpowiednio zabezpieczyć Domoticz wystawiony na zewnątrz, w tym rozwiązaniu, najlepiej poprzez zainstalowanie na VPS nginxa i wykonaniu na nim proxy_pass a następnie podpięcie do VPS swojej domeny i po uzyskaniu certyfikatów zabezpieczyć połączenie SSL – to jest na prawdę ekskluzywne zabezpieczenie.

Przy ustawieniu odpowiedniego routingu na Raspberry można spowodować, że VPS będzie widział wszystkie IP z naszej sieci lokalnej.

To już jednak tematy na następne artykuły.