Tunel VPN P2P bez adresów publicznych
Zapewne nie raz spotkaliście się z sytuacją, kiedy musieliście się połączyć z komputerem zdalnym, który nie posiadał publicznego adresu. W tym celu konieczne było skorzystanie z jakiegoś programu realizującego funkcje zdalnego dostępu. W rozwiązaniach komercyjnych stosuje się do tego celu połączenia VPN, jednak wymagają one odpowiedniego sprzętu (router z VPN). Do użytku prywatnego istnieją darmowe rozwiązania, które tworzą sieć VPN bez dodatkowego sprzętu, wystarczy zainstalować na komputerze odpowiednie oprogramowanie. Jednym z najpopularniejszych tego typu programów jest TeamViewer (dostępny m.in. na Windows, Linux, Mac), który umożliwia zdalne zarządzanie komputerami, na których jest zainstalowany. Działa on jak zdalny pulpit, z tą różnicą że komputer do którego chcemy się podłączyć nie musi znajdować się w naszej sieci LAN. TeamViewer nie umożliwia jednak połączeń terminalowych przez ssh. Do tego typu celów doskonale sprawdza się oprogramowanie N2N.
N2N
N2N jest programem, który umożliwia tworzenie tuneli VPN wykorzystując metodę Peer-to-Peer. N2N pozwala na połączenie komputerów znajdujących się za NAT-em oraz komputerów korzystających z sieci z zablokowanymi portami wejściowymi (np. sieć komórkowa 3G). Architektura N2N opiera się na dwóch elementach: węzłach brzegowych i węźle głównym.
Węzły brzegowe to nic innego jak urządzenia które będziemy łączyć ze sobą przy pomocy węzła głównego w sieć VPN. Węzeł główny to komputer, do którego będą się łączyły węzły brzegowe. Może być to nasz komputer (jednak musi posiadać publiczny adres IP), albo można skorzystać z dostępnych serwerów (tzw. public supernode).
N2N jest dostępny na wiele platform. Ja korzystam z niego na komputerach z Debianem, na routerze z OpenWrt (Gargoyle), na RaspberryPI z Raspbmc, oraz na telefonie z Androidem. Probowalem uruchomić N2N na komputerze z Windows 7 jednak nie udało mi się tego zrobić. Dlatego wymyśliłem proste rozwiązanie, jako że bardzo często korzystam z VirtualBoxa, to postawiłem maszynę wirtualną z Debianem, do której łączę się przez ssh (MobaXterm) i na niej zainstalowałem N2N. Na chwilę obecną mam 5 urządzeń z zainstalowanym N2N i do każdego mogę się podłączyć przez ssh. Najbardziej podoba mi się N2N na telefon z Androidem, dzieki temu mam dostęp do moich urządzeń gdziekolwiek jestem. Do poprawnego działania oprogramowania na Androida trzeba mieć zroot’owany telefon.
KONFIGURACJA
Poniżej przedstawię przykład połączenie dwóch komputerów znajdujących się za NAT’em (PC1 i PC2) w sieć VPN wykorzystując oprogramowanie N2N. Na komputerach zainstalowany jest Debian „Wheezy” 7.0. Oba komputery znajdują się za NAT’em i nie jest możliwe bezpośrednie ich połączenie ze sobą, w tym celu skorzystam z węzła głównego dostarczanego przez remoteqth.com o adresie publicznym: 78.111.124.210:82, gdzie 82 oznacza numer portu, na którym serwer nasłuchuje połączeń od węzłów brzegowych.
Schemat połączenia.
Instalacja krok po kroku:
- Najpierw na obu komputerach należy zainstalować pakiet n2n wydając polecenie:
root@debian:~# apt-get install n2n
- Teraz konieczne jest wybranie następujących parametrów:
- hasła, którego n2n będzie używać do szyfrowania transmisji;
- nazwa sieci (community), każdy węzeł brzegowy może należeć jednocześnie do kliku sieci VPN, ktore są określane przez nazwe sieci;
- adresy IP węzłów brzegowych, adresy IP węzłów w tej samej sieci VPN (community) muszą być z tej samej podsieci.
Ja do mojego przykładu wybralem następujące parametry:
- hasło – „abcd1234”
- community – „vpn”
- adresy IP – PC1 : 10.10.10.1 ; PC2 : 10.10.10.2
- Uruchomienie programu:
Na PC1:
root@debian:~# N2N_KEY=abcd1234 /usr/sbin/edge -d n2n0 -a 10.10.10.1 -c vpn -f -l 78.111.124.210:82 -b
Na PC2:
root@debian:~# N2N_KEY=abcd1234 /usr/sbin/edge -d n2n0 -a 10.10.10.2 -c vpn -f -l 78.111.124.210:82 -b
Opcja -d n2n0 określa nazwę interfejsu TAP, który zostanie stworzony przez program N2N i do którego zostanie przypisany wybrany przez nas adres IP, natomiast opcja -f oznacza, że program będzie działał w tle.
Po wydaniu powyższych poleceń na PC1 i na PC2, na ekranie konsoli powinien pojawić się następujący komunikat:
oznacza on, że program poprawnie utworzył interfejs n2n0 i nadał mu odpowiedni adres IP. Teraz można zweryfikować utworzony interfejs wydając polecenie:
root@debian:~# ifconfig n2n0
Teraz można przetestować, czy między komputerami PC1 i PC2 jest łączność, w tym celu pingujemy z jednego komputera drugi:
Jeśli nie działa nam komunikacja to należy sprawdzić czy poprawnie wpisaliśmy hasło (N2N_KEY), nazwę sieci VPN (community) oraz czy adresy IP są z tej samej podsieci, w moim przypadku podsieć to 10.10.10.0/24. Szczegółowe informacje na temat ew problemów z działaniem N2N można znaleźć w syslogu:
root@debian:~# cat /var/log/syslog
- Autostart
N2N możemy uruchomić przy starcie naszego systemu, w tym celu należy w pierwszej kolejności stworzyć plik n2n_autostart.sh o następującej zawartości:
Dla PC1:
#!/bin/bash N2N_KEY=abcd1234 /usr/sbin/edge -d n2n0 -a 10.10.10.1 -c vpn -f -l 78.111.124.210:82 -b
Dla PC2:
#!/bin/bash N2N_KEY=abcd1234 /usr/sbin/edge -d n2n0 -a 10.10.10.2 -c vpn -f -l 78.111.124.210:82 -b
Skryptowi należy nadać atrybut wykonywalności +x:
root@debian:~# chmod +x n2n_autostart.sh
Po utworzeniu skryptów konieczne jest dodanie poniższego wpisu do tablic crontab obu komputerów:
@reboot /root/n2n_autostart.sh >> /var/log/cron 2>&1 &
Do edycji tablicy crontab służy polecenie:
root@debian:~# crontab -e
W moim przykładzie plik n2n_autostart.sh znajduje się w katalogu /root/n2n_autostart.sh , jeśli jednak skrypt znajduje się w innym katalogu, to trzeba zmienić we wpisie crontab ścieżkę skryptu.
Poniższy wpis w crontab spowoduje, że przy każdym restarcie i uruchomieniu się komputera zostanie uruchomiony skrypt n2n_autostart.sh, a jego wynik zostanie zapisany w logu: /var/log/cron.
WYDAJNOŚĆ
Teraz pora na test wydajności połączenia pomiędzy komputerami w sieci N2N VPN. Do testowania połączenia użyłem oprogramowania iperf:
Jak widać na powyższym screenie prędkość połączenia TCP pomiędzy komputerami PC1 i PC2 wynosi ok 0,5Mb/s, co nie jest najgorszym wynikiem, a przy połączeniach terminalowych w zupełności wystarcza. Na ten wynik w głównej mierze ma wpływ korzystanie z serwera pośredniczącego jakim jest węzeł główny 78.111.124.210:82. Musimy wziąć pod uwagę, że serwer ten jest dostarczany za darmo i umożliwia nam dostęp do komputerów, które nie posiadają publicznych adresów IP (są za NAT’em i nie są dostępne z zewnątrz), więc nie ma co narzekać.