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.

image_debian

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.