OpenVPN

Michal 'lipek' Lipka lipek w lipek.pl
Nie, 14 Sty 2007, 13:39:30 CET


Witam
pół weekendu zajęło mi stworzenie działającego VPNa z wyjściem na świat 
więc aby zaoszczędzić innym czasu stworzyłem małe HOWTO (w załączeniu)
Gdyby ktoś był tak miły i przetestował czy rzeczywiście nic nie pominąłem 
(wiadomo że jak się pisze PO to można coś przeoczyć) byłbym wdzięczny.
Jeśli wszystko będzie OK myślę, że można dołączyć do pl.docs
pozdrawiam
Michał 'lipek' Lipka
-------------- następna część ---------
W niniejszym opracowaniu krok po kroku pokażę jak stworzyć sieć VPN używając OpenVPN.

najpierw instalujemy potrzebne rzeczy:

poldek -i openvpn easy-rsa pam

(pam instalujemy jeżeli chcemy robić autoryzację użytkowników za pomocą loginu/hasła. Jeśli wystarczą Nam certyfikaty to nie musimy)

Pierwsze co robimy tgo generowanie certyfikatów dla serwera i opcjonalnie dla klientów (jeżeli chcemy autoryzację certyfikatami).
przechodzimy do katalogu /etc/easy-rsa i wydajemy polecenia:

/usr/share/easy-rsa/clean-all
. ./vars
/usr/share/easy-rsa/build-ca

generujemy Diffie Hellman (dla zainteresowanych: http://www.rsasecurity.com/rsalabs/node.asp?id=2248)

/usr/share/easy-rsa/build-dh

a następnie odpowiadamy na kilka pytań. Aby skrócić czas możemy najpierw wyedytować plik /etc/easy-rsa/vars tak aby domyślne podpowiedzi przy 
generowaniu certyfikatu były tymi które nam będą odpowiadały. Ważne jest aby podać Common Name.
Mamy już certfyikat centrum autoryzacyjnego którym będziemy podpisywać inne certyfikaty. teraz generujemy certyfikat i klucz serwera:

/usr/share/easy-rsa/build-key-server serwer

(zamiast serwer możemy podać dowolną nazwę)
[ odpowiadamy dwa razy twierdząco (y) ]
oraz certyfikaty dla klientów (tylko jeśli chcemy autoryzować certyfikatami):

/usr/share/easy-rsa/build-key klient1
/usr/share/easy-rsa/build-key klient2
/usr/share/easy-rsa/build-key klient3

jeśli zależy nam aby każdy miał swoje hasło do klucza to zamiast powyższego wydajemy polecenie: /usr/share/easy-rsa/build-key-pass
Po pomyślnym wygenerowaniu certyfikatów przystępujemy do konfigurowania OpenVPN. W tym celu tworzymy plik /etc/openvpn/tunel.conf i wpisujemy tam:

#numer IP na którym ma nasłuchiwać OpenVPN (nieobowiązkowy)
local 1.2.3.4
port 1194
proto udp
dev tun
ca /etc/easy-rsa/keys/ca.crt
cert /etc/easy-rsa/serwer.crt
key /etc/easy-rsa/serwer.key  # This file should be kept secret

#trzy linijki poniżej są tylko dla tych co chcą autoryzować za pomocą pam
plugin /usr/lib/openvpn/plugins/openvpn-auth-pam.so ovpn
client-cert-not-required
username-as-common-name
dh certs/dh1024.pem
# pula adresów używana przez vpn. można dobrać dowolne nieroutowalne 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
# należy przy tym pamiętać żeby dobrać maksymalnie niestandardowe (po to aby były różne od nieroutowalnego IP
# które dostanie klient np z publicznego AP
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway"

#poniżej możemy wstawić dowolne opcje które będą ustawione u klienta za pomocą DHCP
push "dhcp-option DNS 10.8.0.1"
;push "dhcp-option WINS 10.8.0.1"

# jeżeli autoryzujemy certyfikatami i nie chce Nam się generować dla każdego klienta osobno można odśrednikować
# poniższą opcję (generalnie niezalecane jeśli nie masz 100% zaufania do klientów)
;duplicate-cn
keepalive 10 120
# włączamy kompresję danych
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log         openvpn.log
log-append  openvpn.log
verb 3
#eof

po zapisaniu tego pliku robimy plik /etc/pam.d/ovpn i wpisujemy tam

#%PAM-1.0
auth            required        pam_unix.so
auth            required        pam_shells.so
account         required        pam_unix.so
password        required        pam_unix.so md5 shadow use_authtok
password        required        pam_make.so /var/db

teraz w pliku /etc/sysconfig/openvpn zmieniamy TUNNELS="tunel" (nazwa pliku z konfiguracją bez .conf)

serwer mamy gotowy
plik konfiguracyjy klienta:

client 
proto udp 
#adres naszego serwera
remote 148.81.222.122 1194 
dev tun 
resolv-retry 
infinite 
nobind 
tun-mtu 1500 
tls-client 
#jeśli autoryzujemy przez pam to poniższa linijka jest potrzebna.jeśli nie to nie
auth-user-pass 
# ścieżka do plik ca.crt (który klientowi przekazujemy). jeżeli klient jest windowsowy to ścieżka może wyglądać jak poniżej
ca "c:\\Program Files\\OpenVPN\\config\\ca.crt" 
# poniżej dwie linijki tylko dla tych co autoryzują certyfikatami
# oczywiście wygenerowane pliki klient1.crt i klient1.key przekazujemy bezpiecznym kanałem klientowi
cert "c:\\Program Files\\OpenVPN\\config\\klient1.crt" 
key "c:\\Program Files\\OpenVPN\\config\\klient1.key" 

ping-restart 60 
ping-timer-rem 
persist-tun 
persist-key 
resolv-retry 86400 
ping 10 
comp-lzo 
verb 4
; eof 

teraz możemy przetestować naszą konfigurację.
odpalamy serwer: service openvpn start
obdlokowujemy na firewallu port 1194 (jeśli potrzeba)
i próbujemy się połączyć klientem (uwaga: przestanie działać internet na maszynie klienckiej - tylko połączenie z serwerem będzie możliwe. po 
rozłączeniu prawidłowym wszystko powinno wrócić do normy)
po kilku chwilach z klienta wpisujemy ping 10.8.0.1 - powinno działać.
jeśli nie działa mamy noc z głowy i przystępujemy do szukania odpowiedzi na pytanie "dlaczego?"
zakładamy jednak że działa i chcemy teraz aby korzystać z zasobów internetu jako 1.2.3.4 (czyli przez vpn)
to tylko dwie krótkie zmiany na serwerze:

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

zakładamy że eth0 jest interfejsem przez który serwer łączy się ze światem.
wszystko fajnie działa i możemy iść spać
ps. bardzo miły w użytkowaniu klient pod windows: http://openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe



Więcej informacji o liście dyskusyjnej pld-devel-pl