Ethernet Bridging mit OpenVPN

Submitted by admin on So, 03.09.2017 - 10:35

Problemstellung

Es sollen über eine Internetverbindung zwei Standorte mit Ethernet verbunden werden. Ein Grund für eine solche Aufgabe kann sein, dass nicht-IP Protokolle (z.B. DECnet oder Novell IPX) über Ethernet übertragen werden sollen.

Lösung

OpenVPN unterstützt auch Layer 2 Protokolle. Unter FreeBSD 11 ist das vergleichsweise einfach zu implementieren und es läuft dort stabil.

Sicherheitsüberlegungen

Passwörter sind grundsätzlich unsicher, weil diese "irgendwie" auf das Remote System übertragen werden müssen, aus diesem Grund sollten Zertifikate für die Authentifizierung verwendet werden, weil dabei nicht mit shared Secrets  außerhalb der Anwendung hantiert werden muss.

FreeBSD Einstellungen

/boot/loader.conf

FreeBSD muss ein paar Module laden, damit OpenVPN funktioniert.

console="comconsole"
comconsole_speed="115200"
glxsb_load="YES"
if_tap_load="YES"

Die console Configs werden nur gebraucht, wenn die Konsole an einer seriellen Schnittstelle hängt, wie es bei den hier verwendeten PCengines Alix Boards der Fall ist. Das Modul glxsb wird verwendet, um die Hardware Cryptoengine der CPU auf dem Alix Board verwenden zu können. Das Modul if_tap ist dagegen Voraussetzung dafür, dass OpenVPN in dieser Installation funktioniert.

/etc/rc.conf

In der rc.conf werden die Startparameter für OpenVPN sowie das tap0 Interface gesetzt.

openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/openvpn.conf"

cloned_interfaces="tap0"
ifconfig_vr2="up"
ifconfig_tap0="up"

Skripte

Auf Betriebssystem-Ebene werden Skripte für die Bridge Einrichtung benötigt, die von OpenVPN genutzt werden. Die Skripte werden auf Server und Client verwendet.

up.sh

#!/bin/sh

/sbin/ifconfig bridge0 create
/sbin/ifconfig bridge0 addm vr2 addm $dev up
/sbin/ifconfig $dev up

down.sh

#!/bin/sh

/sbin/ifconfig bridge0 deletem $dev
/sbin/ifconfig bridge0 destroy
/sbin/ifconfig $dev destroy

Die Sktipte müssen noch mit chmod 755 ausfürbar gemacht werden.

Server

Aufgrund der OpenVPN Architektur wird bei dieser Konfiguration zwischen Server und Client unterschieden. Bei einem Layer 2 VPN sollte dennoch nur eine Point-to-Point Verbindung implementiert werden, auch wenn OpenVPN Point-to-Multipoint unterstützt.

openvpn.conf

cd /usr/local/etc/openvpn
mode server
tls-server
local 192.168.1.162
port 1194
float
proto udp
dev-type tap
dev tap0
cipher AES-128-CBC
keepalive 10 30
persist-key
persist-tun
verb 5
remote-cert-tls client
route-nopull
mute-replay-warnings
client-to-client

dh dh2048.pem
auth sha256
server-bridge

script-security 2
up /usr/local/etc/openvpn/up.sh
down /usr/local/etc/openvpn/down.sh

key server.key
cert server.crt
ca ca.crt
tls-auth tls-key 0

 

Client

Die Config für den Client unterscheidet sich nur in Details von der Serverkonfiguration.

openvpn.conf

cd /usr/local/etc/openvpn
tls-client
remote alix2 1194
float
nobind
proto udp
dev-type tap
dev tap0
cipher AES-128-CBC
keepalive 10 30
persist-key
persist-tun
verb 5
remote-cert-tls server
mute-replay-warnings
pull

auth sha256
dh dh2048.pem
script-security 2
up /usr/local/etc/openvpn/up.sh
down /usr/local/etc/openvpn/down.sh

key client.key
cert client.crt
ca ca.crt
tls-auth tls-key 1

 

Zertifikate

Bei den Zertifikaten ist beachten, dass X509v3 Key Usage und X509v3 Extended Key Usage von OpenVPN überprüft werden. Ansonsten startet die Verbindung nicht.

Firewall

Grundsätzlich funktioniert OpenVPN auch über IP-NAT. Der Client sollte den Server über den Hostnamen ansprechen. Die Domain sollte im Internet mit DNSSEC gesichert sein, ansonsten sind DNS Spoofing Angriffe möglich. Der Server sollte ebenfalls DNS Zugang haben, so dass z.B. OCSP funktioniert.

Der Client muss im Internet folgende Ports erreichen können:

  • 53/UDP für DNS
  • 1194/UDP für den OpenVPN Server

 

Der Server muss über das Internet mit folgenden Ports erreichbar sein:

  • 53/UDP für DNS
  • 1194/UDP für die OpenVPN Verbindung