Założenie miałem bardzo proste.

Jest sobie serwer M który ma mieć tunele z serwerami A i B. Ruch przez tunel ma być skompresowany, a autoryzacja używa certyfikatów SSL.

Pierwszym krokiem było zainstalowanie openvpn’a na wszystkich maszynach, ale ponieważ instalacja szła z pakietów debiana, więc była po prostu nudna, choć samo środowisko w którym rzecz się działa dostarczyło powodów do zastanowienia się. W ramach rozrzucania usług po chrootach, wytworzyłem nowego chroota o dumnej nazwie vpn. Przy okazji grsecurity dał o sobie znać, ponieważ go nie wyłączyłem (jak wyłączyć grsecurity?) to proces zakładanie chroota się nie powiódł.

Po wyłączeniu wszystko poszło jak po maśle i nie było żadnych problemów z dalszą instalacją.

Następnym krokiem jest generacja kluczy. Najprostszym sposobem jest na przygotowanie środowiska jest skopiowanie z katalogu  (podaje cały czas dla ubuntu) :

/usr/share/doc/openvpn/examples/easy-rsa/2.0

w jakąś lokalizację w której łatwo będzie korzystać. Ja przeniosłem ten katalog w takie miejsce:

/etc/openvpn/easy-rsa/

pomijając już „2.0”. W środku znajdziemy narzędzia, które służą do generowania kluczy. Całość zaczynamy od edycji pliku vars, który służy do ustawiania domyślnych wartości dla zmiennych środowiskowych wykorzystywanych w procesie generowania certyfikatów. W moim przypadku uzupełniłem dane związane z wystawiającym oraz zwiększyłem długość klucza do 2048 bajtów, co dokumentacja kwituje krótkim:

Increase this to 2048 if you are paranoid.

Samo generowanie kluczy jest już potem trywialne i sprowadziło się do sekwencji komend:

  • . ./vars – ustawienie zmiennych uwaga na kropkę przed, ja się nadziałem – kilka razy zanim zajarzyłem
  • ./clean-all – przygotowanie katalogu dla kluczy
  • ./build-ca – wygenerowanie klucza CA
  • ./build-key-server <nazwa> – zbudowanie klucza serwera
  • ./build-dh – zbudowanie Diffie Hellman

Kolejną rzeczą potrzebną do zestawienia tunelu zgodnie z założeniami, jest wygenerowanie kluczy dla serwerów, co wykonujemy powtarzając do wyczerpania komendą:

./build-key client1
./build-key client2
...

Do wystartowania nadal konfiguracji serwera, czyli modyfikacja pliku /etc/openvpn/server.conf, który szczęśliwie jest świetnie opisany i na dodatek większości opcji nie dotykam, bo działa na domyślnych. Zmieniam rzeczy związane z konfiguracją:

  • local czyli IP przypisane do tunelu
  • port – żeby na standardowym nie wisiało
  • dev – explicite podaję nazwę device’a żeby się nie losowało, bo ustawianie reguł na firewall’u przy zmieniającej się nazwie interface’u jest możliwe, ale prościej przy zadeklarowanym
  • zmieniam ścieżki do certyfikatów
  • server – wybranie i ustawienie odpowiedniej podsieci dla vpn’a
  • push – zdefiniowanie IP’ków wpychanych klientowi w ramach routingu
  • odkomentowałem comp-lzo w celu zapewnienia kompresji danych w tunelu

Teoretycznie można już wystartować: /etc/init.d/openvpn restart

Start się nie powiódł z powodu błędu z dostępem do /lib/udev/devices/net/tun i nie była to niestety kwestia uprawnień, tylko jak się okazało opcja chroot_deny_mknod nie pozwoliła na dostęp z chroota do tego node’a. Koniec końców chroot został skasowany a openvpn wylądował w głównym systemie.

Kolejna już próba odpalenia servera vpn powiodła się, ale ruch po połączeniu to już nie bardzo. Główną regułą firewall’a jest DROP od której są później wyjątki. I tu przydało się zdefiniowanie nazwy dla interface’u tunelu, bo dzięki temu łatwo dodać regułę: iptables -A INPUT -i tun34 -j ACCEPT dzięki której wszystko co przychodzi z tunelu jest akceptowane.

Kolejne połączenie i wszystko śmiga, czego i Wam życzę.