Komentarze do wpisów
OpenVPN - prosta i szybka konfiguracja
09.02.2008 - Sobota - 21:57
Chciałbym napisać w jaki sposób połączyć siecią wirtualną dwa komputery działające pod kontrolą systemu GNU/Linux i wykorzystujące oprogramowanie OpenVPN.
Podstawową sprawą jest posiadanie OpenVPN. Ten program nie ma wydzielonej części serwerowej i klienckiej. W zależności od zawartości pliku konfiguracyjnego może działać jako klient lub serwer (a nawet jako jedno i drugie). Ja, Ubunciarz z wyboru, nie parałem się kompilacją programu ze źródeł. Po co? ;-) Wklepałem po prostu apt-get install openvpn i po chwili miałem już zainstalowane oprogramowanie.
Całość konfiguracji sprowadza się do kilku prostych czynności. Pierwszą jest wygenerowanie klucza, który będzie używany do szyfrowania danych przesyłanych przez VPN. Jak? Banalnie...
root@eu07:~# openvpn --genkey --secret plik.key
Plik z kluczem przekopiowałem do katalogu /etc/openvpn zarówno w jednym jak i drugim komputerze. Wiem, że ten plik powinien być "secret", ale kto mi go przeczyta? Ja sam? ;-)
Następnie należy stworzyć pliki konfiguracyjne serwera i klienta. OpenVPN w trakcie startu przeszukuje /etc/openvpn w poszukiwaniu plików *.conf, a następnie je analizuje i uruchamia się wedle ich zaleceń. Jeden plik - jedna instancja OpenVPN, klienta lub serwera.
Zatem vi /etc/openvpn/server1.conf
dev tun secret /etc/openvpn/plik.key proto tcp-server ifconfig 192.168.11.1 192.168.11.2 daemon verb 4 log-append /var/log/openvpn.log keepalive 10 900 inactive 360000 comp-lzo
W pierwszej linijce pliku konfiguracyjnego wskazujemy OpenVPN, żeby korzystał z mechanizmu TUN, czyli enkapsulacji pakietów w warstwie trzeciej (sieci). Istnieje możliwość pracy w warstwie drugiej (łącza danych) przy pomocy mechanizmu TAP. Oczywiście TAP/TUN musi być obsługiwane przez jądro. Kolejna linia to wskazanie pliku zawierającego klucz. Linijka proto to wybór protokołu. Próbowałem opcji UDP, ale z nieustalonych jeszcze przeze mnie przyczyn nie nawiązałem transmisji pomiędzy komputerami wpiętymi w sieć VPN. Linijka ifconfig to linia wskazująca adresy IP węzłów sieci. Pierwszy adres to adres komputera, na którym jest ta instancja uruchamiana, drugi to adres komputera odległego. Interfejsy są konfigurowane w trybie point to point, a więc nie można podłączyć kilku komputerów do jednego serwera. Według dokumentacji jest to możliwe, ale mi nie wyszło. Linia daemon może pozostać bez wyjaśnienia ;-) Następnie poziom gadatliwości w logach - maksymalnie gadatliwy to dziewiątka; ścieżka do pliku logów i czasy utrzymywania serwera i interfejsów bez transmisji. Wartość inactive polecam ustawić dość dużą, jeśli serwer VPN nie będzie miał cały czas podłączonego klienta wymieniającego dane. No i na końcu wkazujemy, że chcemy wykorzystać kompresję danych.
Teraz należy zadbać o odblokowanie portu 1194 (domyślnego portu OpenVPN) dla transmisji TCP na maszynie, która będzie służyć za serwer.
root@eu07:~# iptables -A INPUT -p tcp --dport 1194 -s 0/0 -j ACCEPT
Cóż pozostaje zrobić teraz? Skonfigurować klienta: vi /etc/openvpn/client1.conf
dev tun proto tcp-client remote adres.serwera.net 1194 secret /etc/openvpn/plik.key ifconfig 192.168.11.2 192.168.11.1 keepalive 10 60 route 192.168.0.0 255.255.255.0 route 192.168.1.0 255.255.255.0 comp-lzo
Wyjaśnić należy linijkę remote, w której zapisany jest adres serwera (ten zewnętrzny, w sieci Internet) oraz port na, którym działa serwer. Różnica jest w linijce ifconfig - adresy zapisane są w odwrotnej kolejności, ale nadal pierwszy to adres końca lokalnego, a drugi końca odległego. Linijki route to informacje, że ruch do podsieci tam wymienionych ma być realizowany z wykorzystaniem VPN. W tym przypadku to adresy sieci rzeczywistych, które są osiągalne z serwera (który pełni dla nich funkcję routera z NAT).
Teraz tylko trzeba wszystko wystartować:
root@eu07:~# /etc/init.d/openvpn start
krzysztof@ed74:~$ sudo /etc/init.d/openvpn start
Teraz można sprawdzić czy VPN działa:
krzysztof@ed74:~$ ping 192.168.11.1 PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data. 64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=6.42 ms 64 bytes from 192.168.11.1: icmp_seq=2 ttl=64 time=5.61 ms 64 bytes from 192.168.11.1: icmp_seq=3 ttl=64 time=5.26 ms --- 192.168.11.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1999ms rtt min/avg/max/mdev = 5.262/5.765/6.420/0.484 ms
Widzą się, ale...
krzysztof@ed74:~$ ping 192.168.0.1 PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. --- 192.168.0.1 ping statistics --- 10 packets transmitted, 0 received, 100% packet loss, time 9008ms
Mimo, że wskazaliśmy komputerowi, że do tej sieci ma pakiety puszczać przez VPN transmisji nie ma. Istotnie wszystkie pakiety, które wysyłamy do 192.168.0.1 są puszczane przez VPN, ale na serwerze nie ma regułek przekazywania pakietów pomiędzy sieciami.
root@eu07:~# iptables -A FORWARD -s 0/0 -d 192.168.11.0/24 -j ACCEPT root@eu07:~# iptables -A FORWARD -s 192.168.11.0/24 -d 0/0 -j ACCEPT
Dopiero po takim posunięciu komputer-serwer potraktuje VPN jak każdą inną sieć podpietą do niego i będzie przekazywał pakiety do innych sieci. Nie ma sensu włączać maskarady (NAT) dla tej podsieci, bo wciąż poruszamy się w zakresie adresów z puli prywatnej, które w sieci wewnętrznej będą śmigały aż miło.

