FreeBSD + OpenVPN + PF w jednym stały domku

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"

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Proszę dokończyć równanie: * Time limit is exhausted. Please reload CAPTCHA.