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
Jeżeli dostajemy komunikat:
bash: ./vars: Permission denied
musimy wykonać:
chmod +x /etc/easy-rsa/vars
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 123.123.123.123 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 # cztery 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, tworzymy kolejny /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” (tunel to nazwa pliku z konfiguracją bez .conf)
Serwer mamy gotowy.
plik konfiguracyjny klienta:
client proto udp #adres i port naszego serwera remote 123.123.123.123 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ę.
service openvpn start
ping 10.8.0.1
- powinno działać.
zakładamy jednak że działa i chcemy teraz aby korzystać z zasobów internetu jako 123.123.123.123 (czyli przez IP serwera OpenVPN)
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
warto sobie ustawić to na stałe: w pliku /etc/sysctl.conf ustawiamy net.ipv4.ip_forward = 0
nie zapominamy o iptables :)
zakładamy że eth0 jest interfejsem przez który serwer łączy się ze światem.
wszystko fajnie działa i możemy iść spać
Jedną z opcji podniesienia bezpieczeństwa naszego servera OpenVPN'a jest dodanie parametru: tls-auth, przed czym to chroni?:
Najpierw więc musimy wygenerować klucz współdzielony (który kopiujemy później na wszystkich klientów), możemy go umieścić tam, gdzie poprzednie certyfikaty.
openvpn --genkey --secret ta.key
Do konfiguracji serwera musimy dodać:
tls-auth /etc/easy-rsa/ta.key 0
Natomiast do konfiguracji klienta:
tls-auth "c:\\Program Files\\OpenVPN\\config\\ta.key" 1
Kolejną możliwością podniesienia bezpieczeństwa jest zmiana sposobu szyfrowania. Ponieważ standardowo openvpn używa Blowfisha (128 bitów), tak by nie przesadzić możemy śmiało zmienić go np. na AES-256-CBC (OpenVPN wspiera wszystkie metody szyfrowania które udostępnia biblioteka OpenSSL).
Pamiętajmy, że musimy dodać to do plików konfiguracyjnych zarówno po stronie serwera jak i klientów:
cipher AES-256-CBC
do wyboru mamy jeszcze np:
pozostałe możemy sobie ładnie wylistować wpisując komendę:
openvpn --show-ciphers
bardzo miły w użytkowaniu klient pod windows: http://openvpn.se/
i dla mac os http://code.google.com/p/tunnelblick/
powodzenia