Warum ein extra OpenVPN Server wenn man z.B. eine FritzBox hat welche VPN bietet?
Nun bisher war ich mit dem FritzBox VPN zufrieden an einem DSL 16K Anschluß.
Mit dem neuen Anschluß DSL Hybrid mit 100/40mBit merkt man schnell wie unglaublich langsam der AVM VPN Tunnel ist.
Weiter kommt hinzu das es nicht möglich ist z.B. unter Windows OpenVPN und den komischen FritzBox VPN Client gleichzeitig auch nur installiert zu haben.
Es gibt zwar noch den ShrewSoft VPN Manager welcher auch IPSec (AVM VPN) kann, aber das Tool ist auch schon uralt.

Warum OpenVPN im Bridging Mode?
Nun wem das erstmal nichts sagt der wird es auch nicht brauchen.
Aber dennoch mal zwei Links die die Sache verdeutlichen:
http://www.heise.de/netze/artikel/Bridge-Modus-224072.html
https://www.grc.com/vpn/routing.htm

Ich nehme als Grundlage eine Debian Testing Maschine installiert von einer Netinstall CD in VirtualBox.
Als erstes müssen die nötigen Pakete nachinstalliert werden:

aptitude install openvpn bridge-utils

Danach bereiten wir ein paar Ordner vor für die spätere Schlüssel Erstellung von OpenVPN:

cd /etc/openvpn
mkdir easy-rsa
mkdir easy-rsa/keys
cp -R /usr/share/easy-rsa/* easy-rsa/

Als nächstes editieren wir die Datei /etc/openvpn/easy-rsa/vars. Passt folgende Variablen für euch an:

export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="mail@domain"
export KEY_EMAIL=mail@domain

So nun erstellen wir schonmal die Zertifikate damit das erledigt ist.
Als erstes den Key für TLS Auth:

openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key

Vorbereitungen:

cd easy-rsa/
touch keys/index.txt
echo 01 > keys/serial
. ./vars  # set environment variables
./clean-all

CERTIFICATE AUTHORITY (CA) CERTIFICATE/KEY:

./build-ca

BUILD AN INTERMEDIATE CERTIFICATE AUTHORITY CERTIFICATE/KEY:

./build-key-server server

BUILD DIFFIE-HELLMAN PARAMETERS:

./build-dh

Client Keys:

./build-key clientname

Die ganzen Schlüssel die sich nun im Keys Verzeichniss befinden haben folgende Aufgabe:

  • ca.key (geheimer Master/Root-Schlüssel) --> verbleibt alleinig auf dem VPN-Server
  • ca.crt (öffentliches Master/Root-Zertifikat) --> benötigen VPN-Server- wie Clients
  • dh2048.pem (Diffie-Hellman-Parameter) --> verbleibt alleinig auf dem VPN-Server
  • server.crt (öffentliches Server-Zertifikat) --> verbleibt alleinig auf dem VPN-Server
  • server.key (geheimer Server-Schlüssel) --> verbleibt alleinig auf dem VPN-Server
  • clientname.crt (öffentliches Client1-Zertifikat) --> verbleibt alleinig auf dem VPN-Client1
  • clientname.key (geheimer Client1-Schlüssel) --> verbleibt alleinig auf dem VPN-Client1
  • ta.key (geheimer Pre-Shared-Key) --> benötigen VPN-Server- wie Clients

Will man später einen weiteren Client anlegen ist das ganz einfach:

cd /etc/openvpn/easy-rsa/
. ./vars
./build-key clientname2

Soweit zu den Vorbereitungen.
Als nächstes müssen wir jetzt die Brücke anlegen.
Es gibt verschiedene Ansätze das zu tun.
In der OpenVPN Doku wird mit zwei scripten gearbeitet für bridge start/stop.
Ich habe mich entschieden das ganze schon direkt beim booten des Systems erledigen zu lassen und vorhandene Konfigs zu nutzen anstatt neue anzulegen.
Was die einzelnen Zeilen angeht werde ich das nicht weiter erklären.
Wer sich also nicht zurechtfindet sollte folgende Seite konsultieren:
http://manpages.debian.org/cgi-bin/man.cgi?query=interfaces&sektion=5&apropos=0&manpath=Debian+unstable+sid&locale=
Also nutzen wir /etc/network/interfaces, in diesem Fall mit statischer IP:

auto lo br0
iface lo inet loopback
iface eth0 inet manual
iface br0 inet static
   address 192.168.1.10
   netmask 255.255.255.0
   network 192.168.1.0
   gateway 192.168.1.1
   dns-nameserver 192.168.1.1
   broadcast 192.168.1.255
   bridge_ports eth0
   pre-up openvpn --mktun --dev tap0
   post-up brctl addif br0 tap0
   pre-down brctl delif br0 tap0
   post-down openvpn --rmtun --dev tap0

So jetzt wird es Zeit für einen reboot.
Danach sollte ifconfig dann soetwas ausgeben:

br0: flags=4163  mtu 1500
        inet 192.168.1.10  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 08:00:27:7e:e0:d9  txqueuelen 0  (Ethernet)
        RX packets 23386  bytes 24268483 (23.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6194  bytes 1616304 (1.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163  mtu 1500
        ether 08:00:27:7e:e0:d9  txqueuelen 1000  (Ethernet)
        RX packets 851563  bytes 2865968346 (2.6 GiB)
        RX errors 0  dropped 39  overruns 0  frame 2
        TX packets 6193  bytes 1616202 (1.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 0  (Lokale Schleife)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Fertig ist die Brücke.

Nun legen wir noch eine Konfig Datei für unseren Server an mit vim /etc/openvpn/bridge:

port 1194
proto udp
dev tap0

# Merkt sich welche IP der Client hatte sodass er sie immer wieder bekommt
ifconfig-pool-persist /etc/openvpn/ipp.txt
# x.x.x.11 - x.x.x.15 DHCP Pool für die Clients
server-bridge 192.168.1.10 255.255.255.0 192.168.1.11 192.168.1.15
push dhcp-option DNS 192.168.1.10
push redirect-gateway def1

# Clients können sich untereinander sehen
client-to-client

cipher AES-256-CBC
keepalive 10 120
comp-lzo
persist-key
persist-tun

ca       /etc/openvpn/easy-rsa/keys/ca.crt
cert     /etc/openvpn/easy-rsa/keys/server.crt
key      /etc/openvpn/easy-rsa/keys/server.key
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
dh       /etc/openvpn/easy-rsa/keys/dh2048.pem

#log /var/log/openvpn.log
verb 3
status /var/log/openvpn-status.log

Und fahren den Server hoch:

openvpn --config /etc/openvpn/bridge

Diesen Teil kann man auch unter /etc/rc.local eintragen damit es direkt beim booten passiert wenn alles rund läuft. Dann allerding mit dem Zusatz --daemon

Solltet Ihr Iptables laufen haben müsst Ihr noch folgende Regeln anlegen:

iptables -A INPUT -i tap0 -j ACCEPT
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT

So jetzt noch ein Beispiel für eine Client Konfig für einen Windows Rechner:

client
dev tap
proto udp
cipher AES-256-CBC
remote euredyndns 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3

#### Windows Part
ca "keys\\ca.crt"
tls-auth "keys\\ta.key" 1
cert "keys\\clientname.crt"
key "keys\\clientname.key"

route-method exe
route-delay 2

Und fertig ist euer OpenVPN Server im Bridging Mode.
Was noch erwähnt werden sollte ist die Subnet Problematik.
Solltet ihr den VPN Server oft nutzen müssen an verschiedenen Standorten solltet Ihr euer eigenes Subnet umstellen auf einen Bereich der möglichst selten genutzt werden wird, wie z.B. 192.168.123.x. Wie hier im Beispiel mit 192.168.1.x was sehr häufig vorkommt habt ihr dann routing Probleme wenn Ihr euch aus einem identischen Subnet einwählt.