Jak można przypuszczać, po ilości wpisów, na warsztat trafił FreeBSD. Tym razem zainstalowałem na nim OpenVPN i skonfigurowałem do bezpiecznego korzystania. Czyli serwer udostępnia nam internet, a cały ruch między naszym urządzeniem a serwerem jest szyfrowany.
Niestety, jak zwykle opierałem się na 3 różnych tutorialach… bo w pierwszym nie działa coś tam, drugi nie opiera się na PF – ale rozwiazuje inny problem, a trzeci daje konfigurację do PF. Jednym słowem, jak zwykle – masakra.
Zaczynamy od podstaw, instalujemy openvpn:
pkg install openvpn
Dodajemy katalogi i kopiujemy co potrzebujemy:
mkdir /usr/local/etc/openvpn
cp /usr/local/share/examples/openvpn/sample-config-files/server.conf \
/usr/local/etc/openvpn/openvpn.conf
cp -r /usr/local/share/easy-rsa /usr/local/etc/openvpn/easy-rsa
cd /usr/local/etc/openvpn/easy-rsa
Edytujemy plik „vars”. Zmieniamy wartości:
set_var EASYRSA_REQ_COUNTRY ""
set_var EASYRSA_REQ_PROVINCE ""
set_var EASYRSA_REQ_CITY ""
set_var EASYRSA_REQ_ORG ""
set_var EASYRSA_REQ_EMAIL ""
set_var EASYRSA_REQ_OU ""
#aktualnie rekomendowany jest taki rozmiar – masz paranoję, ustaw większy do 4096
set_var EASYRSA_KEY_SIZE 2048
#jak długo mają być ważne certyfikaty? Domyślnie 10 lat.
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 3650
Przystępujemy do generowania certyfikatów:
./easyrsa.real init-pki
#Zostaniemy poproszeni o stworzenie hasła, można zostawić puste - ale lepiej dodać jakieś hasło. W końcu chodzi o bezpieczeństwo:
./easyrsa.real build-ca
#certyfikat serwera, tutaj bez hasła :) - po co nam :D
./easyrsa.real build-server-full openvpn-server nopass
#certyfikat dla klienta, są dwie opcje 1, bez hasła:
./easyrsa.real build-client-full <name> nopass
#2. z hasłem
./easyrsa.real build-client-full <name>
#odpalamy poniższą komendę i idziemy po kawę - zajmie to chwilę.
./easyrsa.real gen-dh
#w openvpn 2.4+ (czyli obecnej wersji), wymagane jest jeszcze:
openvpn --genkey --secret ta.key
A więc mamy wygenerowane klucze dla serwera, dla klienta oraz dodatkowe zabezpieczające. Skopiujmy je w jakieś miejsce aby było „prosto” 🙂
mkdir /usr/local/etc/openvpn/keys
cp pki/dh.pem \
pki/ca.crt \
ta.key \
pki/issued/openvpn-server.crt \
pki/private/openvpn-server.key \
/usr/local/etc/openvpn/keys
mkdir /usr/local/etc/openvpn/keys/
cp pki/dh.pem \
pki/ca.crt \
ta.key \
pki/issued/<name>.crt \
pki/private/<name>.key \
/usr/local/etc/openvpn/keys/<name>
Mamy całość kluczy skopiowane. Myślę, że nie muszę tłumaczyć, że „<name>
” zastępujemy przez nazwę użytkownika?
A więc konfiguracja!
cd /usr/local/etc/openvpn
ee openvpn.conf
Zmieniamy/dodajemy/odkomentowujemy:
#wskazujemy pliki certyfikatów
ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/openvpn-server.crt
key /usr/local/etc/openvpn/keys/openvpn-server.key
dh /usr/local/etc/openvpn/keys/dh.pem
tls-auth /usr/local/etc/openvpn/keys/ta.key 0 #notka - 0 dla serwera; 1 - dla klienta
#włączamy kompresję lzo
comp-lzo
#ustawiamy użytkowników
user nobody
group nobody
#gdzie logować
log /var/log/openvpn.log
log-append /var/log/openvpn.log
# bramkę
push "redirect-gateway def1 bypass-dhcp"
# dodatkowe zabezpieczenie
remote-cert-tls client
Do rc.conf dodajemy
openvpn_enable="YES"
openvpn_if="tun"
Kolejne komendy:
sysctl net.inet.ip.forwarding=1
echo 'net.inet.ip.forwarding=1' >> /etc/sysctl.conf
Do /etc/pf.conf dodajemy
vpnclients = "10.8.0.0/24"
wanint = "em0"
vpnint = "tun0"
nat on $wanint inet from $vpnclients to any -> $wanint
pass in proto udp from any to any port 1194
pass in on $vpnint from any to any
I teraz powinno wystartować:
service openvpn start
Można przystąpić do konfiguracji po stronie użytkownika. Zastosuję „network-manager-openvpn-gnome” do tego zadania.
W pierwszej kolejności kopiujemy pliki na komputer klienta. Można to zrobić za pomocą rsync/scp/ftp czy w inny sposób – ale lepiej użyć szyfrowania jakiegoś.
Bramka: IP servera
Certyfikat CA: ca.crt Certyfikat Użytkownika:<name>
.crt Klucz prywatny Użytkownik:<name>
.key Hasło klucza Użytkownik: - puste lub hasło które było podane przy tworzeniu certyfikatu. Zaawansowane: Ogólne: - kompresja LZO (adaptive) Zabezpieczenia: - Szyfr: Domyślny lub ten który ustawiliśmy na serwerze Uwierzytelnianie TLS: - Sprawdzenie poprawności podpisu użytkonika certyfikatu partnera (serwera) - wybieramy "Serwer" - Dodatkowe uwierzytelnianie lub szyfrowanie TLS: - Tryb: uwierzytelnianie TLS - Plik klucza: ta.key - Kierunek klucza: 1
OK, Zapisujemy i testujemy – powinno całość działać.
BONUS!
Skrypt do generowania zestawu dla użytkownika.
Założenia: kopiujemy je do katalogu root
#!/usr/local/bin/bash # Make sure only root can run our script if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi if [[ -z $1 ]]; then echo "Please add parametere (user key name)" exit 1 fi cd /usr/local/etc/openvpn/easy-rsa #./easyrsa.real init-pki ./easyrsa.real build-client-full $1 nopass mkdir -p /root/openvpn/$1 cp pki/ca.crt /root/openvpn/$1/ cp pki/issued/"$1".crt /root/openvpn/$1/ cp pki/private/"$1".key /root/openvpn/$1/ cp /usr/local/etc/openvpn/keys/ta.key /root/openvpn/$1/ echo "client proto udp remote ADRES_IP port 1194 dev tun nobind comp-lzo cipher AES-256-CBC remote-cert-tls server auth-nocache key-direction 1 <tls-auth> $(</usr/local/etc/openvpn/keys/ta.key) </tls-auth> <ca> $(</usr/local/etc/openvpn/easy-rsa/pki/ca.crt) </ca> <cert> $(</usr/local/etc/openvpn/easy-rsa/pki/issued/"$1".crt) </cert> <key> $(</usr/local/etc/openvpn/easy-rsa/pki/private/"$1".key) </key>" > /root/openvpn/"$1"/"$1".ovpn echo "Generate finished"