FreeBSD - IPsec Server
Vorwort
FreeBSD lässt sich hervorragend als IPsec Server für sichere Verbindungen einsetzen. In diesem Tutorial zeige ich den Einsatz von sogenannte “Roadwarrior” Clients welche eine gesicherte Verbindung zu einem IPsec Server aufbauen und über das virtuelle Netzwerk miteinander kommunizieren.
IPsec (Kurzform für Internet Protocol Security) ist eine Protokoll-Suite, die eine gesicherte Kommunikation über potentiell unsichere IP-Netze wie das Internet ermöglichen soll.
Durch diese Konfiguration kann sich z.B. ein Aussendienstmitarbeiter mit dem Firmennetzwerk verbinden. Folgende Komponenten werden benötigt:
- FreeBSD (Server Betriebsystem)
- Strongswan (IPsec Server)
Ausgangslage
Dies ist eine schematische Darstellung der verwendeten IPsec Lösung. Es wird ein Server oder auch eine VM benötigt, welche mit einer öffentliche IP Adresse ausgerüstet ist. Dies wird benötigt, damit die Clients auf den Server zugreifen können.
Software installieren
Über PKG installieren wir die benötigte Software. Wer möchte kann dies natürlich auch über die Ports selber bauen:
$ pkg install strongswan
Dienste aktivieren
HINWEIS: Es gibt mehrere Firewalls für FreeBSD aber ich beschränke mich hier in diesem Tutorial auf PF.
Da wir den Traffic für das virtuelle Netz “10.10.10.0/24” routen müssen, damit die Verbindungen funktionieren, aktivieren wir die Dienste von PF und Strongswan.
/etc/rc.conf:
pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
strongswan_enable="YES"
Firewall
Die Firewall ist sehr einfach gehalten. Wir öffnen nur die folgenden Ports:
- TCP 22/SSH
- UDP 500 und 4500
HINWEIS: Das Interface “wan” muss in der Konfiguration angepasst werden! Wichtig ist die Zeile mit “nat on”, da nur so die Verbindung wieder den Weg ins Internet zurück findet.
/etc/pf.conf:
# ---
# FreeBSD 11 Firewall
# ---
# --- INTERFACES
wan = vtnet0
# --- PORTS
ports_host_open_default = "{ 22 }"
ports_host_open_vpn = "{ 500, 4500 }"
# --- GENERAL
set skip on lo0
scrub in on $wan all fragment reassemble
# --- NAT
nat on $wan from 10.10.10.0/24 to any -> $wan
# --- START PF RULE
block in
pass out
antispoof for $wan inet
pass in quick on $wan inet proto icmp all icmp-type echoreq
pass in quick on $wan proto tcp from any to $wan port $ports_host_open_default
pass in quick on $wan proto udp from any to $wan port $ports_host_open_vpn
CA erstellen
Wir erstellen uns eine eigene CA für die Zertifikate:
$ ipsec pki --gen --type rsa --size 4096 --outform pem > server-root-key.pem
$ chmod 600 server-root-key.pem
$ ipsec pki --self --ca --lifetime 3650 \
--in server-root-key.pem \
--type rsa --dn "C=US, O=VPN Server, CN=VPN Server Root CA" \
--outform pem > server-root-ca.pem
$ ipsec pki --gen --type rsa --size 4096 --outform pem > vpn-server-key.pem
$ ipsec pki --pub --in vpn-server-key.pem \
--type rsa | ipsec pki --issue --lifetime 1825 \
--cacert server-root-ca.pem \
--cakey server-root-key.pem \
--dn "C=US, O=VPN Server, CN=server_name_or_ip" \
--san server_name_or_ip \
--flag serverAuth --flag ikeIntermediate \
--outform pem > vpn-server-cert.pem
Danach kopieren wir die Dateien an den richtigen Ort.
Strongswan
Die Anpassungen von Strongswan werden in folgenden Dateien gemacht:
/usr/local/etc/ipsec.conf:
config setup
uniqueids = no
cachecrls = yes
conn ikev2-vpn
auto = add
compress = no
dpdaction = clear
dpddelay = 300s
forceencaps = yes
fragmentation = yes
keyexchange = ikev2
rekey = no
# SERVER
leftid = 108.X.X.X
leftcert = /usr/local/etc/ipsec.d/certs/vpn-server-cert.pem
leftsendcert = ifasked
leftsubnet = 0.0.0.0/0
# CLIENTS
rightid=%any
rightauth=eap-mschapv2
rightdns=8.8.8.8,8.8.4.4
rightsourceip=10.10.10.0/24
rightsendcert = ifasked
eap_identity=%identity
Die DNS Server können natürlich angepasst werden.
/usr/local/etc/ipsec.secrets:
108.X.X.X : RSA "/usr/local/etc/ipsec.d/private/vpn-server-key.pem"
sysadmin %any% : EAP "superPW1234"
Weitere Parameter können im Wiki von Strongswan nachgeschaut werden. Nach einem Reboot, sollte man sich mit dem IPsec Server verbinden können.