Opisywałem już konfigurację VPN PPTP na Raspberry Pi (tutaj: Raspberry Pi – instalacja i konfiguracja VPN PPTP), a teraz czas na opis konfiguracji serwera OpenVPN z logowaniem przy użyciu loginu i hasła. W takim przypadku klienci potrzebują tylko certyfikat “ca.crt” serwera i mogą się logować. Taki sposób może nie jest tak bezpieczny jak certyfikaty, ale ma też swoje plusy. W Internecie jest dużo opisów jak zrobić OpenVPN na podstawie certyfikatów, a mniej z logowaniem przy użyciu loginu i hasła, dlatego opiszę ten wariant. Instalacja i konfiguracja została wykonana na przykładzie Linuxa Debian (podobnie będzie także w Raspbianie na Raspberry Pi). Uruchomienie OpenVPN nie jest trudne. Komend może się wydawać sporo, ale to dlatego, że trzeba wygenerować certyfikat.
Instalacja
Instalacja OpenVPN:
apt-get install openvpn -y
Jeśli ktoś nie ma edytora Nano, a chce z niego korzystać to może zainstalować:
apt-get install nano -y
Certyfikat serwera
Najpierw utworzymy katalog dla narzędzi którymi wygenerujemy certyfikat i przejdziemy do tego katalogu.
mkdir /etc/openvpn/easy-rsa && cd /etc/openvpn/easy-rsa
Narzędzia znajdziemy w katalogu /usr/share/easy-rsa (część tutoriali w internecie podaje katalog /usr/share/doc/openvpn/examples/easy-rsa/2.0, ale jak instalowałem OpenVPN na kilku Debianach to nie zawsze te narzędzia tam były).
Skopiujemy je do utworzonego katalogu:
cp /usr/share/easy-rsa/* /etc/openvpn/easy-rsa
Teraz wszystkie wymagane pliki mamy w naszym katalogu (gdyby ktoś jednak nie znalazł narzędzi w /usr/share/easy-rsa to możliwe, że są w katalogu /usr/share/doc/openvpn/examples/easy-rsa/2.0 i musi zmienić /usr/share/easy-rsa/* na /usr/share/doc/openvpn/examples/easy-rsa/2.0/* )
Jeśli nie ma easy-rsa:
apt-get install easy-rsa -y
wtedy wykonujemy kopiowanie podane wyżej.
Edytujemy plik vars w katalogu /etc/openvpn/easy-rsa (powinniśmy znajdować się już w tym katalogu ponieważ krok z mkdir zawiera także krok cd /etc/openvpn/easy-rsa) wybranym edytorem (ja używam nano):
nano vars
Ustawiamy parametr KEY_SIZE. Jeśli chcemy silny klucz, ale przez co także wolniejsze negocjowanie połączenia to można ustawić 2048. Na moje potrzeby ustawiłem jednak 1024.
export KEY_SIZE=1024
Wartość CA_EXPIRE to ilość dni ważności generowanego certyfikatu. U siebie zostawiłem 3650 dni.
export CA_EXPIRE=3650
Podobnie z kluczem
export KEY_EXPIRE=3650
Teraz ustawmy parametry do certyfikatu (poniżej wartości takie jakie ja wprowadziłem. Każdy powinien podać swoje wybrane):
export KEY_COUNTRY="PL" export KEY_PROVINCE="Pomorskie" export KEY_CITY="Gdynia" export KEY_ORG="Wiblo" export KEY_EMAIL="anon@anon.pl" export KEY_OU="Wiblo"
Ważne aby żadne z tych pól nie zostało puste. Wpisać należy cokolwiek, bo inaczej można otrzymać błąd typu:
140459654829712:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:584:line 145
Będąc w katalogu /etc/openvpn/easy-rsa używamy komendy:
source vars
(jeśli wystąpi błąd “No /etc/openvpn/easy-rsa/openssl.cnf file could be found” wtedy należy wykonać
cp openssl-1.0.0.cnf openssl.cnf
i ponownie wykonać source vars)
oraz
./clean-all
następnie przechodzimy do generowania ca:
./build-ca
Może się trafić błąd z racji braku uzupełnionego jakiegoś pola. Jeśli wszystko jest uzupełnione, a otrzymujemy błąd:
error on line 198 of /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
To zapewne chodzi o pole KEY_ALTNAMES, które trzeba dodać w pliku. Czyli otwieramy edytorem (np. nano) plik vars i dopisujemy export KEY_ALTNAMES=”something”.
Przykład poniżej:
export KEY_COUNTRY="PL" export KEY_PROVINCE="Pomorskie" export KEY_CITY="Gdynia" export KEY_ORG="Wiblo" export KEY_EMAIL="anon@anon.pl" export KEY_OU="Wiblo" export KEY_ALTNAMES="something"
Jeśli nie ma błędów i wszystko jest OK to w tym momencie po prostu przechodzimy przez kolejne pytania wciskając ENTER. Chyba, że chcemy coś zmienić to wtedy wpisujemy wartości jakie chcemy. Przykładowy wynik:
Generating a 1024 bit RSA private key ...++++++ ...............++++++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [PL]: State or Province Name (full name) [Pomorskie]: Locality Name (eg, city) [Gdynia]: Organization Name (eg, company) [Wiblo]: Organizational Unit Name (eg, section) [Wiblo]: Common Name (eg, your name or your server's hostname) [Wiblo CA]: Name [EasyRSA]: Email Address [anon@anon.pl]:
Po pomyślnym wygenerowaniu ca tworzymy certyfikat serwera poleceniem
./build-key-server nazwaserwera gdzie nazwaserwera to nasza wybrana nazwa np:
./build-key-server wiblovpn
Tutaj także przechodzimy dalej wciskając enter (nie ustawiamy challenge password) aż do pytania o podpisanie certyfikatu (Certificate is to be certified until Nov 22 12:26:45 2026 GMT (3650 days)
Sign the certificate? [y/n]:y) gdzie odpowiadamy yes wpisując y i na pytanie commit (1 out of 1 certificate requests certified, commit? [y/n]y) także odpowiadamy yes wpisując y.
Przykładowy wynik:
Generating a 1024 bit RSA private key ...........++++++ ..................................................++++++ writing new private key to 'wiblovpn.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [PL]: State or Province Name (full name) [Pomorskie]: Locality Name (eg, city) [Gdynia]: Organization Name (eg, company) [Wiblo]: Organizational Unit Name (eg, section) [Wiblo]: Common Name (eg, your name or your server's hostname) [wiblovpn]: Name [EasyRSA]: Email Address [anon@anon.pl]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'PL' stateOrProvinceName :PRINTABLE:'Pomorskie' localityName :PRINTABLE:'Gdynia' organizationName :PRINTABLE:'Wiblo' organizationalUnitName:PRINTABLE:'Wiblo' commonName :PRINTABLE:'wiblovpn' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'anon@anon.pl' Certificate is to be certified until Nov 22 12:26:45 2026 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
Trzeba jeszcze wygenerować plik dh:
./build-dh
Teraz musimy przenieść utworzone pliki, które będą potrzebne do konfiguracji naszego serwera. Czyli przechodzimy do katalogu keys:
cd /etc/openvpn/easy-rsa/keys/
Następnie przenosimy pliki (nazwę wiblovpn należy zastąpić nazwą, jaka została podana przy ./build-key-server nazwaserwera)
mv wiblovpn.key wiblovpn.crt ca.crt dh1024.pem /etc/openvpn
Plik ca.crt należy skopiować z serwera na komputer/komputery z których będziemy się łączyć z serwerem OpenVPN (tylko i wyłącznie plik ca.crt).
Konfiguracja serwera
Przechodzimy do katalogu:
cd /etc/openvpn
Tworzymy plik z konfiguracją:
nano server.conf
Uzupełniamy plik konfiguracyjny. Przykładowy plik poniżej:
# Port OpenVPN port 1194 # Protokół TCP lub UDP. proto udp # Typ interfejsu TUN or TAP. dev tun #dev tap # Certificates. ca ca.crt cert wiblovpn.crt key wiblovpn.key # Ten plik nie powinien byc rozpowszechniany/powinien byc chroniony # Diffie hellman parameters. dh dh1024.pem # autoryzacja auth SHA1 # enkrypcja/szyfrowanie #cipher BF-CBC cipher AES-128-CBC # topologia serwera topology subnet # Podsiec do uzytku OpenVPN server 10.5.0.0 255.255.255.0 # routing # push "route 10.5.0.1 255.255.255.255" # routing do serwera OpenVPN push "route 10.5.0.0 255.255.255.0" # routing do całej podsieci OpenVPN # Keepalive: wysyla ping co 10 sekund, rozlacza tunel jesli przez 90 sekund jest brak odpowiedzi keepalive 10 90 # LZO Compression - kompresja pakietów. # comp-lzo # te ustawienia wplywaja na predkosc przesylu tun-mtu 1500 mssfix 1300 sndbuf 0 rcvbuf 0 # Odrzuc uprawnienia dla uzytkownika i grupy nobody user nobody group nogroup # Czyni polaczenie bardziej odporne na bledy polaczenia persist-key persist-tun # Autentykacja po nazwie uzytkownika i hasle, nie wymagaj certyfikatu client-cert-not-required plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so login # Plik ze statusem OpenVPN status openvpn-status.log # umożliwia podłączanie się klienta ovpn do innego podłaczonego klienta ovpn # czyli klienci widzą siebie wzajemnie client-to-client # Poziom logów OpenVPN: # 0 is silent, except for fatal errors # 4 is reasonable for general usage # 5 and 6 can help to debug connection problems # 9 is extremely verbose verb 3
W powyższym przykładzie (należy zmienić nazwy wiblovpn na swoje własne) domyślny port nasłuchiwania OpenVPN to 1194 (czyli taki jak OpenVPN ma standadrowo ustawiony. Można zmienić na dowolny inny). Jeśli ktoś chce mieć włączoną kompresję to musi odkomentować linie comp-lzo (usunąć # przed comp-lzo).
Ważna rzecz przy komendzie plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so. Tutaj należy samemu sprawdzić jaki plik się znajduje w katalogu /usr/lib/openvpn/. Zdarzyło się mi parę razy, że plik miał nazwę openvpn-auth-pam.so, a nie openvpn-plugin-auth-pam.so. Jeśli nazwa się różni od tego w pliku konfiguracyjnym to należy ją poprawić na taką jaka jest w katalogu /usb/lib/openvpn.
UWAGA router Mikrotik: jeżeli chcemy podłączyć do serwera router Mikrotik (przy użyciu opcji OVPN Client) to należy wyłączyć kompresję (usunąć bądź zakomentować linię comp-lzo) i zmienić protokół serwera z UDP na protokół TCP czyli:
# Protokół TCP lub UDP. proto udpna
# Protokół TCP lub UDP. proto tcpMikrotik na dzień, w którym był tworzony ten opis niestety nie obsługuje OpenVPN w protokole UDP i nie obsługuje kompresji. Dlatego należy serwer ustawić w protokole TCP bez kompresji. Wtedy Mikrotik bez problemów połączy się z serwerem jako klient.
Po utworzeniu konfiguracji zatrzymujemy serwer OpenVPN komendą:
service openvpn stop
lub
/etc/init.d/openvpn stop
Profilaktycznie edytujemy plik openvpn w /etc/default
nano /etc/default/openvpn
Usuwamy komentarz przy linii zawierającej komendą AUTOSTART=”all”
Czyli:
# This is the configuration file for /etc/init.d/openvpn # # Start only these VPNs automatically via init script. # Allowed values are "all", "none" or space separated list of # names of the VPNs. If empty, "all" is assumed. # The VPN name refers to the VPN configutation file name. # i.e. "home" would be /etc/openvpn/home.conf # #AUTOSTART="all" #AUTOSTART="none" #AUTOSTART="home office" # # Refresh interval (in seconds) of default status files # located in /var/run/openvpn.$NAME.status # Defaults to 10, 0 disables status file generation # #STATUSREFRESH=10 #STATUSREFRESH=0 # Optional arguments to openvpn's command line OPTARGS="" # # If you need openvpn running after sendsigs, i.e. # to let umountnfs work over the vpn, set OMIT_SENDSIGS # to 1 and include umountnfs as Required-Stop: in openvpn's # init.d script (remember to run insserv after that) # OMIT_SENDSIGS=0
zmieniamy na
# This is the configuration file for /etc/init.d/openvpn # # Start only these VPNs automatically via init script. # Allowed values are "all", "none" or space separated list of # names of the VPNs. If empty, "all" is assumed. # The VPN name refers to the VPN configutation file name. # i.e. "home" would be /etc/openvpn/home.conf # AUTOSTART="all" #AUTOSTART="none" #AUTOSTART="home office" # # Refresh interval (in seconds) of default status files # located in /var/run/openvpn.$NAME.status # Defaults to 10, 0 disables status file generation # #STATUSREFRESH=10 #STATUSREFRESH=0 # Optional arguments to openvpn's command line OPTARGS="" # # If you need openvpn running after sendsigs, i.e. # to let umountnfs work over the vpn, set OMIT_SENDSIGS # to 1 and include umountnfs as Required-Stop: in openvpn's # init.d script (remember to run insserv after that) # OMIT_SENDSIGS=0
Po dokonaniu zmian zapisujemy plik.
Test serwera i użytkownicy
W celu łatwiejszego testowania OpenVPN przechodzimy do katalogu z konfiguracją
cd /etc/openvpn
gdzie uruchamiamy serwer komendą:
openvpn server.conf
Pojawi się wynik:
Thu Nov 24 15:17:10 2016 OpenVPN 2.3.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Nov 12 2015 Thu Nov 24 15:17:10 2016 library versions: OpenSSL 1.0.1t 3 May 2016, LZO 2.08 Thu Nov 24 15:17:10 2016 PLUGIN_INIT: POST /usr/lib/openvpn/openvpn-plugin-auth-pam.so '[/usr/lib/openvpn/openvpn-plugin-auth-pam.so] [login]' intercepted=PLUGIN_AUTH_USER_PASS_VERIFY Thu Nov 24 15:17:10 2016 Diffie-Hellman initialized with 1024 bit key Thu Nov 24 15:17:10 2016 WARNING: POTENTIALLY DANGEROUS OPTION --client-cert-not-required may accept clients which do not present a certificate Thu Nov 24 15:17:10 2016 Socket Buffers: R=[212992->425984] S=[212992->425984] Thu Nov 24 15:17:10 2016 TUN/TAP device tun0 opened Thu Nov 24 15:17:10 2016 TUN/TAP TX queue length set to 100 Thu Nov 24 15:17:10 2016 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0 Thu Nov 24 15:17:10 2016 /sbin/ip link set dev tun0 up mtu 1500 Thu Nov 24 15:17:10 2016 /sbin/ip addr add dev tun0 10.5.0.1/24 broadcast 10.5.0.255 Thu Nov 24 15:17:10 2016 GID set to nogroup Thu Nov 24 15:17:10 2016 UID set to nobody Thu Nov 24 15:17:10 2016 UDPv4 link local (bound): [undef] Thu Nov 24 15:17:10 2016 UDPv4 link remote: [undef] Thu Nov 24 15:17:10 2016 MULTI: multi_init called, r=256 v=256 Thu Nov 24 15:17:10 2016 IFCONFIG POOL: base=10.5.0.2 size=252, ipv6=0 Thu Nov 24 15:17:10 2016 Initialization Sequence Completed
Powyżej wynik poprawnie uruchomionego serwera. Taki sposób pozwala ustalić czy konfiguracja jest odpowiednia i nie zawiera błędów (typu literówki itp.) przez, które serwer nie może wystartować. Jeśli serwer wystartował i zobaczymy powyższy wynik to teraz jak tylko się połączymy z serwerem będziemy widzieć co się dzieje (czyli np. błędy). Pozwoli to szybciej ustalić co jest przyczyną problemów w połączeniu. Jeżeli wszystko jest OK to zamykamy serwer wciskając CTRL+C, a następnie uruchamiamy usługę OpenVPN komendą
/etc/init.d/openvpn start
Użytkownicy w OpenVPN to użytkownicy dodani do systemu. Czyli jeżeli wydamy polecenie:
adduser jakis_uzytkownik
To z serwerem OpenVPN połączymy się przy życiu nazwy i hasła użytkownika jakis_uzytkownik. OpenVPN korzysta z kont systemowych.
Gdyby ktoś miał problem z tym, że OpenVPN nie uruchamia plików server.conf przy komendzie service openvpn restart to wcześniej należy użyć:
update-rc.d openvpn enable
wtedy zrestartować usługę
service openvpn restart
Teraz restart usługi openvpn powinien automatycznie uruchomić wszystkie pliki conf.
Dalsze części/kontynuacja w linkach poniżej czyli routing oraz konfiguracja klienta.
Konfiguracja routingu (OpenVpn to LAN, LAN to OpenVPN)
OpenVPN – dostęp do LAN / sieci lokalnej oraz z LAN do OpenVPN
Konfiguracja klienta
OpenVPN – łączenie z serwerem
Jesteś geniuszem. Serdeczne dzięki za ten opis. Przerzuciłem pół internetu a tu taki kwiatek po polsku. Piwo dla Ciebie.