OpenVPN server z logowaniem (auth-user-pass) [Debian]

openvpnOpisywał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 udp

na

# Protokół TCP lub UDP. 
proto tcp

Mikrotik 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

You can leave a response, or trackback from your own site.

One Response to “OpenVPN server z logowaniem (auth-user-pass) [Debian]”

  1. W pisze:

    Jesteś geniuszem. Serdeczne dzięki za ten opis. Przerzuciłem pół internetu a tu taki kwiatek po polsku. Piwo dla Ciebie.

Leave a Reply

You must be logged in to post a comment.

Powered by WordPress | Designed by: NewWpThemes | Provided by Free WordPress Themes