OpenVPN Access Server LAN model UCARP-based failover: Was ein Name für die Hochverfügbarkeitslösung. Nur kann die irgendwie nur eine IP schwenken. Meine OpenVPN-Router haben aber zwei: Eine öffentliche und eine im internen VPN-Transfernetz. Da muss also eine Lösung her…

Für diejenigen wo den Access Server jetzt nicht so genau kennen: Der OpenVPN Access Server ist eine schicke und vor allem kostengünstige Lösung für OpenVPN. Wer also keine Eigenbau-Bastel-Lösung sucht sollte sich den Access Server genauer anschauen. Das Teil ist von den Entwicklern von OpenVPN selbst. Es lohnt sich. Infos auf der Homepage dazu: https://openvpn.net.

UCARP-based failover

Aber zurück zur eigentlichen Frage: Der Access Server bietet als eingebaute Hochverfügbarkeitslösung einen UCARP basierten Failover Mechanismus an. Hierbei entstehen keine zusätzlichen Lizenzkosten, das ist quasi bereits mit im Paket dabei. Ausführliche Infos dazu: https://openvpn.net/vpn-server-resources/setting-up-high-availability-failover-mode/. Funktionieren tut das nach dem üblichen Schema: Jeder Node hat seine eigene IP und dank UCARP hat einer der beiden noch die Rollen-IP zugewiesen welche im Internet allgemein bekannt ist. Im Falle eins Problems schwenkt diese IP einfach auf den anderen Node und dieser übernimmt.

Jetzt bin ich bei so Sachen wie VPN-Routern aber eher konservativ orientiert: Neben der öffentlichen IP haben meine Router noch ein zweites Beinchen in ein VPN-Transfernetz über welches hinter der Firewall die eigentlichen internen Zielsysteme erreicht werden können. Um die Routingtabellen einfach und vor allem funktionierend zu halten wäre es schön wenn ich hier ebenfalls eine zweite, interne Rollen-IP zuweisen könnte. Leider bietet der Access Server in seiner Einstellungsmakse nur eine öffentliche IP an.

+------------------+
|Node-1            |
|                  |
|public: xx.xx.xx.1|
|internal: 10.0.0.1|
+--+---------------+
   ^
   | Role-IP: xx.xx.xx.100
   v
+--+---------------+
|Node-2            |
|                  |
|public: xx.xx.xx.2|
|internal: 10.0.0.2|
+------------------+

Wie in der obigen Abbildung gezeigt: Den Access Server auf einem Linux mit mehr als nur einer Netzwerkkarte zu installieren: Funktioniert. Die öffentliche Rollen-IP xx.xx.xx.100 wie in obigem Beispiel kann sauber geschwenkt werden. Nur fehlt mir jetzt noch so etwas wie die 10.0.0.100 im internen Netzwerk welche ebenfalls mit schwenkt.

Das geht zwar jetzt nicht direkt im Webfrontend, aber unter der Haube an der Befehlszeile des Access Servers lässt sich hier etwas passendes einrichten. Die genaue Lösung dazu ist mir in den Sinn gekommen als ich folgende Doku durchgearbeitet habe: https://openvpn.net/vpn-server-resources/advanced-option-settings-on-the-command-line/#UCARPVRRP_failover_advanced_settings. Sehr iteressant ist ucarp.extra_parms und die Möglichkeit dem Cluster eigene up und down Skirpte zu setzen.

Die Lösung

Na da lässt sich doch was machen: Rasch zwei Skripte gmn-ucarp_active und gmn-ucarp_standby angelegt. Alles was die Skripte tun ist der internen Netzwerkkarte, in diesem Beispiel die ens192, eine weitere IP zuzuweien. Oder wieder zu löschen falls dieser Server in standby wechselt. Davor wird jedoch noch rasch, ich will ja das Rad nicht zwei mal erfinden, noch die originalen active und standby Skripte des Access Servers aufgerufen.

#!/bin/bash

#
# Erweitertes UCARP Skript für AS: Ruft originales auf und verwaltet
# die Rollen-IP im VPN-Netz.
#

set +x
/usr/local/openvpn_as/scripts/ucarp_active "$@"
/bin/ip a a 10.0.0.100/24 dev ens192:1 label ens192:1
exit 0
#!/bin/bash

#
# Erweitertes UCARP Skript für AS: Ruft originales auf und verwaltet
# die Rollen-IP im VPN-Netz.
#

set +x
/usr/local/openvpn_as/scripts/ucarp_standby "$@"
/bin/ip a d 10.0.0.100/24 dev ens192
exit 0

Wie zu sehen, das Skript ist wirklich kurz: Im wesentlichen das Access Server eigenen Skript starten, der internen Netzwerkkarte rasch via dem üblichen ip Befehl eine weitere Adresse hinzugefügt. Oder eben gelöscht. Jetzt muss man den Access Server lediglich noch dazu bringen diese Skripte zu verwenden. Dafür steht aber das passende Beispiel gleich noch mit in obiger Doku drin:

/usr/local/openvpn_as/scripts/sacli --key "ucarp.extra_parms" --value "--upscript /usr/local/openvpn_as_gmn/bin/ucarpActive.sh --downscript /usr/local/openvpn_as_gmn/bin/ucarpStandby.sh" ConfigPut

Die Pfade im obigen Befehl müssen natürlich noch entsprechend angepasst werden. Und siehe da, mein OpenVPN Access Server schwenkt neben der öffentlichen IP auch gleich noch die interne sauber mit.

Und zum Schluss hier der Link zur man page von ucarp: http://manpages.ubuntu.com/manpages/trusty/man8/ucarp.8.html. Hier finden sich weitere Infos zu --upscript und --downscript.