Upcoming Maintenance Alert:

The UBNT Community will be upgraded at 5pm MDT on April 25th. During this time the community forums will be set to read-only status.

Learn more

×
Reply
New Member
Posts: 10
Registered: ‎02-02-2017
Kudos: 4

[German HowTo] OpenVPN Server mit Client Zertifikaten

[ Edited ]

Hallo zusammen,

 

nachdem einige hier um ein HowTo in deutscher Sprache gebeten haben, möchte ich dies hier entsprechend anbieten. Der Inhalt bezieht sich auf einen OpenVPN-Server auf dem USG mit Client-Zertifikaten (anstatt Passwort-Login) und der Einstellung, dass jedeweder Internet-Traffic über den Tunnel gesendet wird.

 

Also starten wir mit dem Login per SSH (Putty bei Windows) auf dem USG. Nach dem erfolgreichen Login laden wir uns zuerst das easyrsa-Paket.

 

sudo bash
curl -O http://ftp.us.debian.org/debian/pool/main/e/easy-rsa/easy-rsa_2.2.2-1~bpo70+1_all.deb
sudo dpkg -i easy-rsa_2.2.2-1~bpo70+1_all.deb

Somit ist easyrsa installiert und wir können uns die benötigten Zertifikate mit folgenden Befehlen generieren.

 

Zuerst die CA und das Server Zertifikat.

 

cd /usr/share/easy-rsa
. vars
./build-ca
./build-key-server server
./build-dh

Der letzte Befehl kann durchaus länger dauern... Smiley Wink

 

Da wir uns nicht per USER/PASS anmelden wollen, generieren wir danach das erste Client-Zertifikat. Dies für jeden benötigten User wiederholt.

 

./build-key foo

Danach erstellen wir ein persistentes Verzeichnis, welches auch den Reboot des USG übersteht.

 

mkdir /config/auth/keys/

Und kopieren die generierten Zertifikate dorthin.

 

cp keys/* /config/auth/keys/

Nun erstellen wir auf dem Host des Unifi-Controllers, bei Ubuntu unter folgedem Pfad, die Datei  "config.gateway.json".

 

vi /usr/lib/unifi/data/sites/default/config.gateway.json

Beachtet, dass falls Ihr Eure Site anders benannt habt, es auch ein anderer Name als "default" sein kann!

 

Diese füllen wir nun mit folgendem Inhalt.

 

{
"firewall": {
    "name": {
      "WAN_LOCAL": {"rule": {"20": {"action": "accept","description": "Allow OpenVPN clients in","destination": {"port": "1194"},"log": "disable","protocol": "udp"}}}
    }},
"interfaces":
    {"openvpn": {
      "vtun0": {
        "encryption": "aes256",
        "mode": "server",
        "openvpn-option": ["--keepalive 8 30","--comp-lzo","--duplicate-cn","--user nobody --group nogroup",
          "--verb 1","--proto udp","--port 1194","--push redirect-gateway def1",
          "--push dhcp-option DNS 208.67.220.220","--push dhcp-option DNS 208.67.222.222"
        ],
        "server": {"subnet": "172.16.0.0/24"},
        "tls": {
          "ca-cert-file": "/config/auth/keys/ca.crt",
          "cert-file": "/config/auth/keys/server.crt",
          "dh-file": "/config/auth/keys/dh2048.pem",
          "key-file": "/config/auth/keys/server.key"
        }
      }
    }
    },
"service": {"nat": {"rule": {"5010": {"description": "Masquerade for WAN","outbound-interface": "pppoe0","type": "masquerade"}}}}
}

 

Beachtet: Am Ende der Konfig (beim Masquerading) ist bei mir das WAN-Interface "pppeo0" als Schnittstelle ins Internet genutzt, da ich als Modem einen gebridgten Draytek verwende und der USG den Dial-in übernimmt. Solltet ihr eine Fritz als Gateway verwenden, sollte "pppeo0" durch "eth0" ersetzt werden! Die von mir gepushten DNS-Server sind von OpenDNS, man kann aber auch durchaus einen eigenen DNS setzen, falls man z.B. pihole als Werbeblocker im Heimnetz nutzt.

 

Nun bringt man den USG durch irgendeine Änderung im Unifi-Controller dazu, neu zu provisionieren. Der lädt sich somit unserer erstellte json-Datei. Somit sind wir serverseitig fertig.

 

Danach erstellen wir uns eine Clientdatei, als Bespiel foo.ovpn.

 

client
float
dev tun
remote INETADRESSE 1194 udp
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-CBC
comp-lzo
verb 5
<ca>
-----BEGIN CERTIFICATE----- 

/config/auth/keys/ca.crt -----END CERTIFICATE----- </ca> <cert> -----BEGIN CERTIFICATE------ /config/auth/keys/foo.crt ----END CERTIFICATE----- </cert> <key> -----BEGIN PRIVATE KEY----- /config/auth/keys/foo.key -----END PRIVATE KEY----- </key>

Unter INETADRESSE tragt Ihr euren DNS-Host, die IP oder den DynDNS eurer USG ein. Zwischen den Blöcken tragt ihr entsprechend den Inhalt der in fett makierten Pfade ein, also den Inhalt unserer zuvor erstellte Zertifikate. Immer nur das, was zwischen dem "BEGIN"..."END" steht.

 

Den Inhalt könnt Ihr euch mit Putty auf der USG wie folgt anzeigen lassen.

 

cat /config/auth/keys/ca.crt

 

Für jeden von Euch erzeugten User sind die letzten beiden Blöcke dann natürlich verschieden! Der erste Block ist die CA und ist bei jedem Client gleich!

 

Die .ovpn-Datei könnt ihr jetzt z.B. über iTunes auf ein iPhone übertragen und mit der OpenVPN-App importieren.

 

Mit dieser Konfig sind keine weiteren Firewall-Regeln nötig.

 

Somit sollte dem Tunnel nach Hause nichts mehr im Wege stehen. Smiley Happy

 

Dieses HowTo wurde nach besten Wissen und Gewissen von mir erstellt, allerdings übernehme ich keinerlei Haftung für evtl. Schäden, welche dadurch entstehen. 

 

Dank geht an alle, welche hier im Board die Denkanstösse für dieses HowTo gegeben haben.

 

Thx to all members of this board, who gives the impressions to make this HowTo.

 

New Member
Posts: 41
Registered: ‎12-30-2016
Kudos: 9

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

Vielen Dank - werde ich am Wochenende mal ausprobieren. Ein paar fragen:

 

- Leitet die USG den Verkehr auf die anderen VLANS? Das 172.16.0.0/24 subnet ist das VPN subnet?

- In meinen Fall habe ich mein DNS auf der Synology (192.168.1.100) - kann ich Deine OpenDNS Eintraege mit meiner internen austauschen und funktioniert das dann auch (kann ich meinen Netwerkdrucker ueber DNS ansprechen?)

- Kann ich mehrere client-Zertifikate anlegen (ein Zertifikat pro Benutzer) und wie loesche ich Zugang eines Benutzers?

New Member
Posts: 10
Registered: ‎02-02-2017
Kudos: 4

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

Das 172.16.0.0/24 ist das VPN-Subnetz. Ja, das Routig in andere VLANs funktioniert, habe hier eine ähnliche Konstellation mit dem DNS im anderen VLAN.


Man kann mehrere Clients anlegen, dazu wie in der Anleitung angegeben einfach für foo einen anderen Namen nehmen. Zum Löschen musst Du das Zertifikat widerrufen. Das kannst Du im easyrsa-Ordner mit

 

./revoke-full CLIENTNAME

Danach nochmal den Keys-Ordner, wie in der Anleitung, rüberkopieren.

New Member
Posts: 41
Registered: ‎12-30-2016
Kudos: 9

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

Vielen Dank nochmals - habe das ganze gerade konfiguriert und VPN funktioniert einwandfrei.

 

Gibt es eventuell eine Moeglichkeit dass VPN Verbindungen im Unifi dashboard als Events oder Alerts gelogged werden koennen?

 

Im messages log sehe ich die folgenden Warnungen - kann man diese eventuell abschalten?

Mar 17 19:26:07 Gatekeeper openvpn[13319]: WARNING: you are using user/group/chroot/setcon without persist-tun -- this may cause restarts to fail
Mar 17 19:26:07 Gatekeeper openvpn[13319]: WARNING: you are using user/group/chroot/setcon without persist-key -- this may cause restarts to fail
Mar 17 19:26:07 Gatekeeper openvpn[13319]: WARNING: using --duplicate-cn and --client-config-dir together is probably not what you want
New Member
Posts: 3
Registered: ‎01-23-2017

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

Vielen Dank - Echt ein Super HowTo. Auch ich werde dies am Wochenende gleich testen.

Momentan nutze ich immer noch die OpenVPN Lösung auf meiner Syno.

 

Würde denn die möglich bestehen dieses HowTo zu übersetzten in OpenVPN SidetoSide,

zwischen 2x USGs. Leider kommt bei mir die GUI mit IPsec nicht in Frage weil die Einwahl

momentan noch ein Speedport übernimmt, der lässt esp etc. nicht durch.

 

OpenVPN via GUI lässt sich auch nicht kon􀃗gurien, da die USG danach in den Prov Loop geht.

 

Mit dieser Anleitung habe ich bereits die Verbindung zwischen 2 USG´s aufbauen können.

Nur nicht permanent. Da ich es nicht in eine json 􀃗le übersetzt bekomme.

 

Folgende Anleitung per SSH Schritt für Schritt ausgeführt funktioniert temporär Super.

 

generate vpn openvpn-key /con􀃗g/auth/secret
USG1
con􀃗gure
set interfaces openvpn vtun0
set interfaces openvpn vtun0 mode site-to-site
set interfaces openvpn vtun0 local-port 1294
set interfaces openvpn vtun0 remote-port 1294
set interfaces openvpn vtun0 local-address 10.99.99.1
set interfaces openvpn vtun0 remote-address 10.99.99.2
set interfaces openvpn vtun0 remote-host dyn2
set interfaces openvpn vtun0 shared-secret-key-􀃗le /con􀃗g/auth/secret
set interfaces openvpn vtun0 openvpn-option "--comp-lzo"
set interfaces openvpn vtun0 openvpn-option "--f􀃘oat"
set interfaces openvpn vtun0 openvpn-option "--ping 10"
set interfaces openvpn vtun0 openvpn-option "--ping-restart 20"
set interfaces openvpn vtun0 openvpn-option "--ping-timer-rem"
set interfaces openvpn vtun0 openvpn-option "--persist-tun"
set interfaces openvpn vtun0 openvpn-option "--persist-key"
set interfaces openvpn vtun0 openvpn-option "--user nobody"
set interfaces openvpn vtun0 openvpn-option "--group nogroup"
set protocols static interface-route 192.168.1.0/24 next-hop-interface vtun0
commit
save
exit
USG2
con􀃗gure
set interfaces openvpn vtun0
set interfaces openvpn vtun0 mode site-to-site
set interfaces openvpn vtun0 local-port 1294
set interfaces openvpn vtun0 remote-port 1294
set interfaces openvpn vtun0 local-address 10.99.99.2
set interfaces openvpn vtun0 remote-address 10.99.99.1
set interfaces openvpn vtun0 remote-host dyn1
set interfaces openvpn vtun0 shared-secret-key-􀃗le /con􀃗g/auth/secret
set interfaces openvpn vtun0 openvpn-option "--comp-lzo"
set interfaces openvpn vtun0 openvpn-option "--􀃘oat"
set interfaces openvpn vtun0 openvpn-option "--ping 10"
set interfaces openvpn vtun0 openvpn-option "--ping-restart 20"
set interfaces openvpn vtun0 openvpn-option "--ping-timer-rem"
set interfaces openvpn vtun0 openvpn-option "--persist-tun"
set interfaces openvpn vtun0 openvpn-option "--persist-key"
set interfaces openvpn vtun0 openvpn-option "--user nobody"
set interfaces openvpn vtun0 openvpn-option "--group nogroup"
set protocols static interface-route 10.10.10.0/24 next-hop-interface vtun0
commit
save
exit

In die json File habe ich folgendes übernommen:

USG1
openvpn vtun0 {
local-address 10.99.99.1 {
}
local-port 1294
mode site-to-site
openvpn-option --comp-lzo
openvpn-option --􀃘oat
openvpn-option "--ping 10"
openvpn-option "--ping-restart 20"
openvpn-option --ping-timer-rem
openvpn-option --persist-tun
openvpn-option -—persist-key
openvpn-option "--user nobody"
openvpn-option "--group nogroup"
remote-address 10.99.99.2
remote-host dyndns1.de
remote-port 1294
shared-secret-key-􀃗le /con􀃗g/auth/secret
}
}
USG2
openvpn vtun0 {
local-address 10.99.99.2 {
}
local-port 1294
mode site-to-site
openvpn-option --comp-lzo
openvpn-option --􀃘oat
openvpn-option "--ping 10"
openvpn-option "--ping-restart 20"
openvpn-option --ping-timer-rem
openvpn-option --persist-tun
openvpn-option -—persist-key
openvpn-option "--user nobody"
openvpn-option "--group nogroup"
remote-address 10.99.99.1remote-host dyndns2.de
remote-port 1294
shared-secret-key-􀃗le /con􀃗g/auth/secret
}
}

 

Wie müsste die json File nun tasächlich aussehen?

Vielen Dank vorab, für einen Schubs in die richtige Richtung.

New Member
Posts: 10
Registered: ‎02-02-2017
Kudos: 4

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

[ Edited ]
Vielen Dank nochmals - habe das ganze gerade konfiguriert und VPN funktioniert einwandfrei.
 
Gibt es eventuell eine Moeglichkeit dass VPN Verbindungen im Unifi dashboard als Events oder Alerts gelogged werden koennen?
 
Im messages log sehe ich die folgenden Warnungen - kann man diese eventuell abschalten?
Mar 17 19:26:07 Gatekeeper openvpn[13319]: WARNING: you are using user/group/chroot/setcon without persist-tun -- this may cause restarts to fail
Mar 17 19:26:07 Gatekeeper openvpn[13319]: WARNING: you are using user/group/chroot/setcon without persist-key -- this may cause restarts to fail
Mar 17 19:26:07 Gatekeeper openvpn[13319]: WARNING: using --duplicate-cn and --client-config-dir together is probably not what you want

 

Im Dashboard sieht man die Medlungen bislang nicht, dafür müssen die OpenVPN-Unterstützung erst dort einbauen.

 

Deine Warnungen kommen daher, dass Du "diplicate-cn" und "client-config-dir" gesetzt hast. Dies kann zur Folgen haben, dass Du Dich z.B. mit zwei Geräten unter dem selben Namen gleichzeitig anmelden kannst, falls aber dem Client eine statische IP in "client-config-dir" zugewiesen wird, diese dann doppelt vergeben wird!

 

Also sollte eins raus. Entweder Mehrfachanmeldungen zur gleichen Zeit, oder nur eine Anmeldung pro Client zeitgleich, dafür aber dann extra Konfigs pro Client. 

New Member
Posts: 10
Registered: ‎02-02-2017
Kudos: 4

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

[ Edited ]

@agentsmith1983Hast Du schon versucht, das in das Format wie in meiner Beispiel-Konfig zu bringen?

New Member
Posts: 3
Registered: ‎01-23-2017

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

Nein noch nicht, aber ich werde mir die Syntaxe von deiner Config mal genauer anschauen.

Und bei mir einbauen. Ich teste das am Wochenende nochmal etwas genauer.

mfg

New Member
Posts: 3
Registered: ‎01-23-2017

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

@dermichaHabe die gesamte config jetzt soweit übertragen. Getestet mal lieber noch nicht.

Da ich mir mit der Schlusszeile nicht sicher bin.

 

Das wäre jetzt der Inhalt für JSON

{
	"firewall": {
		"name": {
			"WAN_LOCAL": {
				"rule": {
					"20": {
						"action": "accept",
						"description": "Allow OpenVPN clients in",
						"destination": {
							"port": "1294"
						},
						"log": "disable",
						"protocol": "udp"
					}
				}
			}
		}
	},
	"interfaces": {
		"openvpn": {
			"vtun0": {
				"mode": "site-to-site",
				"local-port": "1294",
				"remote-port": "1294",
				"local-address": "10.99.99.1",
				"remote-address": "10.99.99.2",
				"remote-host": "dyn2",
				"shared-secret-key-file": "/config/auth/secret",
				"openvpn-option": ["--comp-lzo", "--float", "--ping 10",
					"--ping-restart 20", "--ping-timer-rem", "--persist-tun", "--persist-key",
					"--user nobody", "--group nogroup"
				]
			}
		}
	},
	"protocols": {
		"static interface-route": "192.168.1.0/24 next-hop-interface vtun0"
	}
}

Bei dem letzten Stück bin ich mir etwas unsicher ob man das so machen kann?

 

},
	"protocols": {
		"static interface-route": "192.168.1.0/24 next-hop-interface vtun0"
	}
}
New Member
Posts: 2
Registered: ‎12-30-2016

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

eachtet: Am Ende der Konfig (beim Masquerading) ist bei mir das WAN-Interface "pppeo0" als Schnittstelle ins Internet genutzt, da ich als Modem einen gebridgten Draytek verwende und der USG den Dial-in übernimmt. Solltet ihr eine Fritz als Gateway verwenden, sollte "pppeo0" durch "eth0" ersetzt werden! Die von mir gepushten DNS-Server sind von OpenDNS, man kann aber auch durchaus einen eigenen DNS setzen, falls man z.B. pihole als Werbeblocker im Heimnetz nutzt.

 

Was muss hier eingetragen werden, wenn das direkt an einem Kabelmodem hängt?

ETH0?

 

Danke

New Member
Posts: 1
Registered: ‎07-13-2017

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

Ja eth0 passt, bei den Kabel Anbietern sollte man aufpassen, was für Anschluss geschalten ist. Bei einem DS-Lite Anschluss kann es probleme geben. Besser es ist ein klassicher ipv4 Anschluss. Gruß

Highlighted
New Member
Posts: 2
Registered: ‎12-30-2016

Re: [German HowTo] OpenVPN Server mit Client Zertifikaten

"firewall": {
    "name": {
      "WAN_LOCAL": {"rule": {"20": {"action": "accept","description": "Allow OpenVPN clients in","destination": {"port": "1194"},"log": "disable","protocol": "udp"}}}
    }},
"interfaces":
    {"openvpn": {
      "vtun0": {
        "encryption": "aes256",
        "mode": "server",
        "openvpn-option": ["--keepalive 8 30","--comp-lzo","--duplicate-cn","--user nobody --group nogroup",
          "--verb 1","--proto udp","--port 1194","--push redirect-gateway def1",
          "--push dhcp-option DNS 208.67.220.220","--push dhcp-option DNS 208.67.222.222"
        ],
        "server": {"subnet": "172.16.0.0/24"},
        "tls": {
          "ca-cert-file": "/config/auth/keys/ca.crt",
          "cert-file": "/config/auth/keys/server.crt",
          "dh-file": "/config/auth/keys/dh2048.pem",
          "key-file": "/config/auth/keys/server.key"
        }
      }
    }
    },
"service": {"nat": {"rule": {"5010": {"description": "Masquerade for WAN","outbound-interface": "pppoe0","type": "masquerade"}}}}
}

 

Beachtet: Am Ende der Konfig (beim Masquerading) ist bei mir das WAN-Interface "pppeo0" als Schnittstelle ins Internet genutzt, da ich als Modem einen gebridgten Draytek verwende und der USG den Dial-in übernimmt. Solltet ihr eine Fritz als Gateway verwenden, sollte "pppeo0" durch "eth0" ersetzt werden! Die von mir gepushten DNS-Server sind von OpenDNS, man kann aber auch durchaus einen eigenen DNS setzen, falls man z.B. pihole als Werbeblocker im Heimnetz nutzt.

 

Der DNS wird doch vom Provider geliefert, muss man dies aus der Anleitung einstellen oder was muss man einstellen um diesen vom Provider zu nehmen?

 

Danke

Reply