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ącedev anonim0
orazdev-type tun
– nazwa wirtualnego interfejsu sieciowego (anonim0) oraz typ interfejsu. Jeśli ustawimydev tun
to możemy pominąćdev-type tun
– OpenVPN będzie wtedy automatycznie tworzył kolejne interfejscy tunXtcp-nodelay
– bardzo 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łączeniutcp-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…