OpenVPN: sieć prywatna dla każdego

Opublikował siefca śr 15 paź 2008 20:18:36 GMT

Zdarzyło Ci się kiedyś zarządzać bazą danych, do której potrzebny był zdalny dostęp przez niezaufane podsieci? A może zajmujesz się jakąś siecią LAN wymagającą dostępu wybranych użytkowników z Internetu? Jeśli tak jest, to najprawdopodobniej potrzebujesz użyć jakiejś formy tak zwanego tunelowania. Jak sama nazwa mówi polega to na stworzeniu tak zwanego tunelu, czyli pary sztucznych, skomunikowanych ze sobą interfejsów sieciowych zachowujących się identycznie jak połączone kablem karty sieciowe. Różnica jest tylko taka, że ów kabel nie istnieje naprawdę, jest emulowany z wykorzystaniem protokołów działających w Sieci.

Dla procesu korzystającego z takiego interfejsu druga strona komunikacji wydaje się być umiejscowiona w jego lokalnym zasięgu, czyli w odległości jednego punktu skoku (tak zwanego hopa), mimo że wymieniane informacje przechodzą przez wiele punktów pośrednich. Najczęściej poza połączeniem systemów chcemy także, aby wymieniane między nimi informacje nie były dostępne dla każdego – stosujemy wtedy szyfrowanie danych przesyłanych tunelem.

Tunel jest pewnego rodzaju siecią łączącą dwa punkty stworzoną w oparciu o mechanizmy komunikacyjne istniejące w innej sieci. Na poziomie podstawowych porcji danych tunel to nic innego jak pakiety jakiegoś protokołu komunikacyjnego (np. IP) przenoszone w innych pakietach (np. SSL) zdolnych zapewnić komunikację dwóch punktów. Proces opakowywania jednych pakietów w drugich nosi nazwę enkapsulacji i można go sobie wyobrazić używając analogii do samochodu ciężarowego przewożącego samochody osobowe. W przypadku szyfrowanej komunikacji odpowiednikiem byłby na przykład TIR z odpowiednio zabezpieczonym kontenerem. Kierowca siedzący w samochodzie osobowym wjeżdża do transportera i wyjeżdża z niego po przebyciu trasy. Z jego punktu widzenia nie miały miejsca żadne kontrole drogowe ani próby popsucia nowiutkiego auta, ponieważ na trasie do punktu docelowego był on właśnie tunelowany. Istnieją też tunele nie wymagające enkapsulacji całych pakietów, a jedynie dodania odpowiednich informacji do ich nagłówków. Nie będę się tu nimi zajmował, dodam jedynie, że można je sobie wyobrazić na przykład jako samochody holowane przez inne, lub też jako pojazdy, których kierowcy ustąpili na jakiś czas miejsca zawodowym szoferom dbającym o bezpieczeństwo podróży.

Z tunelowania intensywnie korzystają tzw. wirtualne sieci prywatne (ang. Virtual Private Networks, w skr. VPN). W tym przypadku tuneli używa się do stworzenia bezpiecznej widoczności dla dwóch lub więcej węzłów. Można wtedy łączyć nimi całe sieci albo komputery znajdujące się w różnych miejscach. Po podłączeniu do VPN Twojej stacji wydaje się, że znajduje się wewnątrz chronionej sieci.

OpenVPN

Do tworzenia wirtualnych sieci można używać prostego w konstrukcji i mało wymagającego protokołu PPTP (ang. Point-To-Point Tunelling Protocol), zaawansowanego zestawu mechanizmów o nazwie IP Security (IPSec) lub innych sposobów. Jakiś czas temu potrzebowałem łączyć się do moich baz danych używając laptopa i zainteresowałem się oprogramowaniem pozwalających łatwo i przyjemnie stworzyć wirtualną sieć prywatną. Jego nazwa to OpenVPN.

Spróbuję więc opisać, w jaki sposób stworzyć wirtualną sieć prywatną bazującą na mechanizmie OpenVPN. Używany jest on najczęściej do zabezpieczenia łączności między pojedynczymi komputerami a całymi sieciami. Takie zastosowanie wynika przede wszystkim z dużej liczby oprogramowania klienckiego współpracującego z systemami GNU/Linux, Mac OS X czy Windows, a także z faktu, że protokół ten dosyć łatwo “przebija się” przez firewalle.

OpenVPN wykorzystuje popularny protokół SSL/TLS do szyfrowania przesyłanych danych, certyfikatów X.509 do poświadczania autentyczności i uwierzytelniania klientów, a do transportowania pakietów potrafi używać zarówno bezpołączeniowego protokołu UDP jak i połączeniowego TCP. Jest to mechanizm typu klient-serwer, to znaczy w celu stworzenia tunelu jedna ze stron (klient) inicjuje połączenie do serwera.

Założenia

Skupię się tutaj na przykładzie, w którym na serwerze znajdującym się w zarządzanej przez Ciebie sieci instalujesz OpenVPN-a, a na przenośnych komputerach pracowników oprogramowanie klienckie. Zakładam, że serwer pracuje pod kontrolą jakiejś dystrybucji GNU/Linuksa, klient natomiast działa pod Windows lub Mac OS-em X. Zakładam na potrzeby przykładu, że komputery w Twojej lokalizacji mają przydzielane adresy z puli 192.168.1.0/24, a serwer z dostępem do Internetu ma dwa interfejsy sieciowe. Pierwsza karta sieciowa widoczna jest w systemie jako eth0 i służy do łączności z Internetem, a druga jako eth1 i “widzi” komputery w sieci LAN. Poniżej podaję parametry serwera:

Interfejs | Adres IP | Maska | Opis ———–|———————-|———————|————————— eth0 | 140.186.70.10 | 255.255.255.0 | interfejs publiczny | eth1 | 192.168.1.1 | 255.255.255.0 | interfejs lokalny | tun0 | 192.168.2.0 | 255.255.255.0 | interfejs VPN |

I parametry jednego z klientów (adresy mogą różnić się końcówkami):

Interfejs | Adres IP | Maska | Opis ———–|———————|————————-|————————— eth0 | 172.30.99.99 | 255.255.255.252 | interfejs publiczny | tun0 | 192.168.2.5 | 255.255.255.0 | interfejs VPN |

Celem będzie takie skonfigurowanie obu maszyn, aby ich interfejsy typu TUN uzyskały wzajemną widoczność i aby była możliwa komunikacja między systemem klienta a systemami w sieci LAN (pula 192.168.1.0/24). Istotne w tym przykładzie jest to, że dla potrzeb zestawienia tunelu przydzielić trzeba inne adresy niż użyte w sieci LAN. W przeciwnym razie wystąpić mogą konflikty na poziomie trasowania IP. W tym przypadku do wewnętrznej komunikacji między końcówkami tunelu użyta została pula 192.168.2.0/24

Instalacja serwera

Instalacja polega na odszukaniu odpowiedniego pakietu przeznaczonego dla konkretnej dystrybucji i zainstalowaniu go lub samodzielnej kompilacji. Jeśli interesuje Cię ten drugi wariant instalowania to skorzystaj z dokumentacji umieszczonej na stronie projektu. Będę tu opisywał głównie konfigurację, dlatego postanowiłem pominąć część wyjaśniającą jak używać skryptów configure i narzędzia make. Zaznaczam też, że do poprawnej pracy trzeba mieć w kernelu włączoną obsługę “TUN/TAP Driver”, ewentualnie posiadać odpowiedni moduł ładowalny pozwalający oprogramowaniu na tworzenie sztucznych interfejsów sieciowych typu TUN.

Aby zainstalować OpenVPN na przykład w Debianie musimy wydać polecenie:

apt-get install openvpn

W PLD Linux:

poldek -i openvpn

W Gentoo:

emerge --ask openvpn

Konfiguracja serwera

OpenVPN korzysta z pliku konfiguracyjnego. Jeśli potrzebujesz uruchomić wiele tuneli to możesz stworzyć kilka takich plików i w każdym z nich przechowywać konfigurację dla pewnej ich klasy. Oczywiście nie chodzi tutaj o osobne konfigurowanie tunelu dla każdego z klientów należących do danej sieci prywatnej, ale o typy tuneli różniących się przede wszystkim nazwą lokalnego interfejsu i przydzielaną adresacją. Na przykład jeden plik może określać tunele zestawiane dla pracowników firmy, inny natomiast tunele służące do zabezpieczania komunikacji z podsieciami oddziałów. Jeśli więc Twoi klienci mają widzieć tę samą sieć LAN to najprawdopodobniej w zupełności wystarczy Ci jeden plik konfiguracyjny i jedna instancja demona openvpn. W pliku konfiguracyjnym decydujemy również o tym, czy usługa ma działać jako serwer, czy może jako strona inicjująca połączenia do innego serwera OpenVPN.

Plik konfiguracyjny

Katalogiem konfiguracji jest zazwyczaj /etc/openvpn/. Możesz znaleźć w nim podkatalog o nazwach keys służący do przechowywania kluczy. Jeśli nie istnieje to warto go stworzyć używając:

cd /etc/openvpn
mkdir keys
chmod og-rwx keys

W niektórych dystrybucjach systemu GNU/Linux osoby odpowiedzialne za tworzenia pakietu zawierającego OpenVPN doszli do wniosku, że najlepiej będzie zautomatyzować uruchamianie wielu instancji usługi, jeśli w katalogu konfiguracji znalezione zostanie kilka plików z ustawieniami. Wtedy dla każdego pliku skrypt inicjujący (zwykle /etc/init.d/openvpn) uruchomi demona.

Domyślny plik konfiguracyjny używany przez OpenVPN określić można:

  • przez podanie opcji --config przy uruchamianiu demona
  • ustawiając zmienną w pliku przygotowanym przez osobę tworzącą pakiet oprogramowania

W przypadku Debiana, Gentoo czy PLD Linuksa jest to ta druga opcja. W Debianie nadrzędnym plikiem ustawień dla usługi jest /etc/default/openvpn i to właśnie w nim podajemy, jakie konfiguracje mają zostać wczytane. Opcją domyślną jest wystartowanie tylu instancji demona openvpn ile znalezionych będzie plików pasujących do wzorca /etc/openvpn/*.conf.

Oto przykładowy plik konfiguracyjny dla serwera, który zwyczajowo nazwałem server.confi umieściłem w katalogu /etc/openvpn:

#adres nasłuchu
local 140.186.70.10

# protokół transportowy
proto udp

# typ urządzenia wirtualnego
dev tun

# ścieżki do kluczy
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/gem.crt
key /etc/openvpn/keys/gem.key  # trzymaj w tajemnicy!

# parametry dh
dh /etc/openvpn/keys/dh2048.pem

# wymagane certyfikaty oznaczone wyraźnie jako klienckie
ns-cert-type client

# wymagane dodatkowe podawanie haseł i korzystanie z PAM
plugin /usr/lib/openvpn/openvpn-auth-pam.so ovpn
username-as-common-name

# pula adresów lokalnych przydzielanych klientom VPN
server 192.168.2.0 255.255.255.0

# podłączający się klienci będą mieli zawsze takie same adresy IP
ifconfig-pool-persist ipp.txt
ifconfig-pool-linear
persist-remote-ip

# trasy, dla których nasz system ma być bramą (routing ustawiany u klientów)
push "route 192.168.1.0 255.255.255.0"

# systemy klienckie powinny otrzymać komunikat DHCP
# ustawiający nasz DNS jako ich serwer nazw
push "dhcp-option DNS 192.168.1.1"

# chcemy, aby połączeni klienci widzieli się wzajemnie
client-to-client

# zapobiegamy zrywaniu sesji podłączonych klientów
keepalive 10 120

# algorytm szyfrowania danych
cipher BF-CBC  # blowfish (domyślny)

# włączamy kompresję
comp-lzo

# maksymalna liczba podłączonych klientów
max-clients 32

# obniżenie uprawnień usługi po starcie
user nobody
group nogroup

# zachowujemy dostęp do chronionych zasobów, aby nie trzeba było
# wykonywać restartu, gdy funkcjonujemy z obniżonymi uprawnieniami
persist-key
persist-tun

# zapisujemy raporty z działania (plik obcinany co minutę)
status openvpn-status.log

# szczegółowe informacje o działaniu kierujemy do pliku
# (zakomentuj, jeśli mają wędrować do demona syslog)
log-append  openvpn.log
verb 3

Nie uruchamiaj jeszcze demona, w następnej sekcji dowiesz się jak wygenerować potrzebne certyfikaty, a wcześniej co dokładnie oznaczają opcje pliku konfiguracyjnego.

Generowanie kluczy

(c.d.n)

Podziel się

Trackbacki

Użyj następującego trackbacka na swojej stronie:

http://randomseed.pl/trackbacks?article_id=openvpn&day=15&month=10&year=2008

Komentarze

  1. texas holdem poker game tournaments powiedział about 1 year later:

    That large-scale texas holdem poker game smiled in favour of some inclined computer. Well, the sort is more historical than some reluctant voice. You said, some texas holdem poker game tournaments is much more gross than the musical industry. I clung that online texas holdem poker game above a view. It’s principal to be guffawed! I made that century along some model. One spectacular letter danced some line dully. It’s increased to be shut!..

    Ten komentarz oczekuje na akceptację. Nie ukaże się do czasu zaakceptowania przez autora..

(leave url/email »)

   Pomoc języka formatowania Obejrzyj komentarz