Dawno temu, za czasów gdy na moich maszynach urzędował system giganta z Redmont, zdarzało się korzystać z połączeń VPN. Po przesiadce na pingwinki miewałem z tym problemy. Zawsze coś się klientowi nie podobało i zawsze miał mniejsze bądź większe “ale” przy próbie połączenia. Ostatnio zaszła potrzeba skorzystania z VPNa. A żeby skorzystać z VPNa trzeba postawić serwer. Tak więc w ruch poszedł wujek google i czarodziejski man. Niestety początki nie były kolorowe, ale z pomocą forum Gentoo i howtoforge w końcu się udało. Żeby zaoszczędzić wam poszukiwań i przerabiania dziesiątek poradników postanowiłem naskrobać swoje własne how-to. Korzystam z Gentoo (zarówno na deskopie jak i na serwerach) tak więc poradnik będzie dotyczył tejże dystrybucji (jak znajdę chwile czasu postaram się sklecić coś takiego dla Debiana). Zaczynajmy więc.

Jako serwer VPNa użyłem OpenVPN. Ponadto będziemy potrzebowali certyfikaty i klucze. Możemy się bawić i generować je łamańcami openssl, a możemy też iść na łatwiznę i skorzystać z easy-rsa. Ja należę do ludzi leniwych więc skorzystamy z easy-rsa. Zainstalujmy więc wymagane paczki. Do ustawienia trasy routowania przez VPNa skorzystam z iproute2 (bo domyślnie nim konfiguruje sieć). Jeśli nie masz tej flagi ustawionej w make.conf to musimy ją ustawić dla OpenVPN

echo "net-misc/openvpn iproute2" >> /etc/portage/package.use

Teraz zainstalujmy potrzebne paczki

valhalla ~ # emerge openvpn easy-rsa

Skoro mamy już paczki to przygotujmy sobie klucze i certyfikaty. OpenVPN “łyka” klucze/czeryfikaty na dwa sposoby.

  • klucze/certyfikaty zapisane są w osobnych plikach i w konfigu podajemy do nich ścieżkę
  • wpakowanie ich do konfiga w tagach <ca></ca>, <cert></cert> i <key></key>

Osobiście uważam pierwszą opcję za czytelniejszą i przyjemniejszą w obsłudze. Ułatwia to podmianę certyfikatu/klucza w dowolnym momencie bez konieczności przedzierania się przez tasiemcowatego konfiga (paranoicy bezpieczeństwa mogą sobie ustawić w cronie generowanie nowych certów np raz na dobę ;))

Wracając do kluczy. Easy-rsa instaluje się w /usr/share/easy-rsa. Klucze możemy zostawić tam, a możemy je przenieść. Lubimy mieć porządek w konfigach więc przeniesiemy sobie całość w odpowiednie miejsce. Powiedzmy do /etc/openvpn/rsa

cp -r /usr/share/easy-rsa /etc/openssl/rsa

Teraz przygotujmy sobie plik vars. Oryginalny plik zapisujemy pod dowolną nazwą np

cp /etc/openssl/rsa/vars /etc/openssl/rsa/vars-orig

Sprawdzamy jaką wersje OpenSSL mamy zainstalowaną

valhalla tmp # qlist -ICv openssl
dev-libs/openssl-1.0.1e-r1

U mnie jest to wersja 1.0. Przechodzimy więc do katalogu rsa

cd /etc/openvpn/rsa

i tworzymy symlink o nazwie openssl.cnf kierujący do konfiga (w odpowiedniej wersji) dostarczanego razem z easy-rsa

ln -s openssl-1.0.0.cnf openssl.cnf

Teraz w ulubionym edytorze otwieramy nowy plik vars i wklejamy do niego:

export OPENSSL="openssl"
export EASY_RSA="`pwd`"
export KEY_CONFIG="$EASY_RSA/openssl.cnf"
export KEY_DIR="$EASY_RSA/keys"
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
export KEY_SIZE=2048
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="PL"
export KEY_PROVINCE="WOJEWODZWTO"
export KEY_CITY="MIASTO"
export KEY_ORG="ORGANIZACJA (wpisujemy cokolwiek;))"
export KEY_EMAIL="Twoj@mail.com"

Rozmiar klucza ustawiłem na 2048bitów (generowanie klucza 4096 trwa wieki, ale jak ktoś chce, dopuszczalne wartości dla KEY_SIZE to 1024, 2048, 4096), wygasanie certyfikatu i klucza ustawiłem na 10 lat (oczywiście nic nie stoi na przeszkodzie ustawić dzień/miesiąc/tysiąć lat :)) Skoro plik vars jest już przygotowany to trzeba by wygenerować klucze i certyfikaty (wystarczy klikać cały czas enter a na pytanie czy podpisać certyfikat klikamy “y” i enter)

valhalla rsa # source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openssl/rsa/keys
valhalla rsa # ./clean-all
valhalla rsa # ./build-ca
valhalla rsa # ./build-key-server server
valhalla rsa # ./build-dh
valhalla rsa #

Wygenerujmy od razu klucz dla użytkownika (pododnie jak w przypadku klucza dla serwera wszystko potwierdzamy enterem i dwa razy “y” -> enter)

valhalla rsa # ./build-key UŻYTKOWNIK

Zostaje jeszcze wygenerowanie klucza tsl-auth

cd /etc/openssl ; openvpn --genkey --secret auth.key

Już prawie koniec “męki” – zostało jeszcze przygotowanie konfiga serwera i klienta. Nazwijmy swój tunel “anonim” – tworzymy więc plik touch /etc/openvpn/anonim.conf i dopisujemy do niego:

local IP.IP.IP.IP
proto udp
port 8080
dev anonim0
dev-type tun
mode server
server 10.8.0.0 255.255.255.0
client-to-client
ifconfig-pool-persist ipp.txt
client-config-dir ccd
keepalive 10 120
tls-auth auth.key 0
tun-mtu-extra 32
mssfix 1200
comp-lzo
max-clients 2
persist-key
persist-tun
push "redirect-gateway def1"
push "route 10.8.0.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
status /tmp/openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
tcp-nodelay
ca /etc/openvpn/rsa/keys/ca.crt
cert /etc/openvpn/rsa/keys/server.crt
key /etc/openvpn/rsa/keys/server.key
dh /etc/openvpn/rsa/keys/dh2048.pem

Kilka słow na temat konfiga.

  • local IP.IP.IP.IP – jeśli na sewerze mamy kilka adresów IP wskazujemy w tym miejscu IP, na którym OpenVPN ma nasłuchiwać na polączenia przychodzące
  • dev anonim0 oraz dev-type tun – nazwa wirtualnego interfejsu sieciowego (anonim0) oraz typ interfejsu. Jeśli ustawimy dev tun to możemy pominąć dev-type tun – OpenVPN będzie wtedy automatycznie tworzył kolejne interfejscy tunX
  • tcp-nodelaybardzo ważna opcja jeśli zamierzasz wykorzystać tunel do gier online ;) Tłumacząc z polskiego na nasze: “wypluwaj dalej pakiety tak szybko jak tylko dotrą do interfejsu tun”. Próbowałem zagrać w League of Legends przez VPNa (m.in po to powstał :)) i była tragedia. ping zamiast standardowego 40-60ms skakał 140-240ms (a czasami i pod 400ms). Po włączeniu tcp-nodelay ping jest na odpowiednim poziomie 50-70ms (czasem podskoczy do 80ms)

Teraz pora zająć się klientem (konfig dla klienta Windows – pingwiniarze muszą sobie podmienić ścieżki w konfigu na odpowiednie ;)). Tworzymy konfig klienta (w dowolnym miejscu, dla zachowania “czystości” niech będzie, że paczki z konfigami klientów będziemy trzymać w /etc/openvpn/clients/UŻYTKOWNIK). Tworzymy plik /etc/openvpn/clients/UŻYTKOWNIK.ovpn a w nim wklejamy:

client
dev tun
proto tcp
remote IP.IP.IP.IP 8080
resolv-retry infinite
nobind
tun-mtu 1500
tun-mtu-extra 32
mssfix 1200
persist-key
persist-tun
ca "C:\\Program Files\\OpenVPN\\config\\USER\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\config\\USER\\USER.crt"
key "C:\\Program Files\\OpenVPN\\config\\USER\\USER.key"
tls-auth "C:\\Program Files\\OpenVPN\\config\\USER\\auth.key" 1
comp-lzo
verb 3

Następnie do katalogu /etc/openvpn/clients/UŻYTKOWNIK/ kopujemy pliki:

  • /etc/openvpn/rsa/keys/ca.crt
  • /etc/openvpn/rsa/keys/UŻYTKOWNIK.crt
  • /etc/openvpn/rsa/keys/UŻYTKOWNIK.key
  • /etc/openvpn/auth.key

I przygotowujemy paczkę dla użytkwonika:

cd /etc/openvpn/clients/ ; zip UŻYTKOWNIK.zip -r UŻYTKOWNIK.opvn UŻYTKOWNIK/

Tak przygotowaną paczkę wysyłamy użytkownikowi naszego VPNa. Pliki z zipa należy wypakować do katalogu OpenVPNa, domyślnie: C:\Program Files\OpenVPN\config\

Teraz pora na uruchomienie serwera VPN:

cd /etc/init.d/

ln -s openvpn openvpn.anonim

/etc/init.d/openvpn.anonim start

Jeśli chcemy, żeby VPN startował razem z systemem trzeba go dodać do odpowiedniego runlevelu:

rc-update add openvpn.anonim default

Serwer skonfigurowany, klient również. Klient może się połączyć z serwerem ale nie ma wyjścia na świat… Teoretycznie dobrze, praktycznie chyba nie do końca o takie rozwiazanie nam chodziło. Trzeba jeszcze pamiętać o 2 najważniejszych poleceniach:

  • echo 1 > /proc/sys/net/ipv4/ip_forward
  • iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Jeśli dla serwera VPN ustawiliśmy inną adresacje (np 192.168.2.0/24) to oczywiście w iptables podajemy odpowiednią podsieć ;)

No i to by chyba było na tyle. Serwer VPN działa, klient może się połączyć, wyjście na świat jest…

WykopShare