Vor kurzem ist eine neue Version der Open-Source-Firewall-Distribution OPNsense erschienen. Getreu dem Motto “Probieren geht über Studieren” habe ich mich trotz der üblichen Warnungen – zunächst jedoch auf dem Standby-System – an das Upgrade gewagt.
Da der verbauten Hardware auch eine Netzwerk-Schnittstelle mit RealTek-Chipsatz ihr Unwesen treibt, ließ ich sicherheitshalber zunächst noch in der alten Version das Erweiterungspaket “os-realtek-re
” mit dem Inhalt “Realtek re(4) vendor driver” auf das System los. Tatsächlich war das Upgrade auf die nun aktuelle Version OPNsense 22.1 von Erfolg gekrönt, wobei direkt im Anschluss noch weitere Updates zu finden waren, so dass die aktuelle Fassung nun OPNsense 22.1.1_3 lautet. Nach kurzer Inaugenscheinnahme der wichtigsten Dienste schien alles in Ordnung zu sein, nur eine Warnung machte mich stutzig.
Und zwar nutzte ich bislang für die Aktualisierung des Dynamic-DNS-Service den gleichnamigen Dienst, der nun einerseits als “Dynamic DNS (legacy)” unter “Dienste” zu finden war, und der andererseits mit einer Warnung auf sich aufmerksam machte: “Please make sure to upgrade to os-ddclient before 22.7 is released as this plugin will be removed from our repository“.
OPNsense – neu heißt nicht besser
Da es somit ein neues Plugin zur Aktualisierung der eigenen IP-Adresse des DSL-Anschlusses gab, sollte die Installation und Neukonfiguration des “os-ddclient
“-Plugins genügen – so zumindest mein erster Gedanke. Leider stellte sich dies in der Praxis als nicht ohne Weiteres möglich heraus. Denn obwohl das neue Plugin neben etlichen vordefinierten Dynamic-DNS-Diensten eine Option “Benutzerdefiniert” anbietet, ist diese weniger flexibel als beim älteren Plugin.
So war es mit dem neuen Plugin nicht möglich, einen Request mit individuellen Parametern auf eine beliebige URL zu konfigurieren, da keines der Felder wie “Server” oder “Hostname” die Angabe einer simplen URL inklusive Parametern erlaubte. Da ich für das Update des Dynamic-DNS-Dienstes mittels PowerDNS-Server eine eigene, sehr einfache Methode ohne aufwendiges Protokoll nutze, ließ sich somit das neue “os-ddclient”-Plugin nicht verwenden.
Ein Cronjob muss her!
Eine einfache Lösung stellt die Nutzung eines Cronjobs dar. Darin genügt es, etwa mittels curl
die entsprechende URL inkl. der notwendigen Parameter aufzurufen, was dank Cron in regelmäßigen Abständen wiederholt wird. Tatsächlich setzt auch ddclient und somit das bislang verwendete Plugin auf einen Cronjob, der alle fünf Minuten gestartet wird, um zeitnah auf eine Änderung der heimischen IP-Adresse zu reagieren.
Zwar lassen sich Cronjobs zwar per Web-UI von OPNsense einrichten, dies beschränkt sich jedoch auf die Konfiguration der Zeiten, zu denen die Jobs gestartet werden sollen. Darüber hinaus ist einzig die Angabe von Parametern möglich, daneben können Cronjobs in einer Art von Vorkonfiguration eingerichtet werden, aber deaktiviert bleiben, so dass sie einfach zu einem späteren Zeitpunkt eingeschaltet werden können.
Der eigentliche Cronjob – im Jargon von OPNsense im Bereich “System” -> “Einstellungen” -> “Cron” -> “Job bearbeiten” bzw. beim Hinzufügen eines neuen Cronjobs unter “Befehl” zu finden, besteht jedoch aus vordefinierten Skripts bzw. Kommandos, die OPNsense standardmäßig anbietet, Beispiele dafür wären etwa Firmware-Updates, das Ausführen von Reboots, Restarts von Daemons oder auch SMART-Tests von Speichermedien.
Cronjobs definieren mittels Konsole
Um einen komplett neuen Cronjob zu definieren, auch wenn er nur aus einem einzigen Kommando wie besagtem curl-Request besteht, ist es hingegen notwendig, sich auf die Kommandozeile zu bemühen, was im Folgenden gezeigt wird.
Zunächst erfolgt der Login auf der Firewall, die hier den Namen “zarrentin” trägt. Nach dem eigentlichen Login steht der Zugang auf die Shell nach der Auswahl der entsprechenden Option bereit:
geschke@moabit:~$ ssh root@zarrentin Password: Last login: Fri Feb 18 16:44:19 2022 from 192.168.10.101 ---------------------------------------------- | Hello, this is OPNsense 22.1 | @@@@@@@@@@@@@@@ | | @@@@ @@@@ | Website: https://opnsense.org/ | @@@\\\ ///@@@ | Handbook: https://docs.opnsense.org/ | )))))))) (((((((( | Forums: https://forum.opnsense.org/ | @@@/// \\\@@@ | Code: https://github.com/opnsense | @@@@ @@@@ | Twitter: https://twitter.com/opnsense | @@@@@@@@@@@@@@@ ---------------------------------------------- *** zarrentin.geschke.net: OPNsense 22.1.1_3 (amd64/OpenSSL) *** LAN (re0) -> v4: 192.168.10.2/24 PFSYNC (em1) -> v4: 10.10.10.10/24 WAN_FritzBox (em0) -> v4: 192.168.2.10/24 [...more output...] 0) Logout 7) Ping host 1) Assign interfaces 8) Shell 2) Set interface IP address 9) pfTop 3) Reset the root password 10) Firewall log 4) Reset to factory defaults 11) Reload all services 5) Power off system 12) Update from console 6) Reboot system 13) Restore a backup Enter an option: 8 root@zarrentin:~ #
Die Definitionsdateien der Cronjobs befinden sich im Verzeichnis “/usr/local/opnsense/service/conf/actions.d/
“, insofern empfiehlt sich ein Wechsel dorthin:
root@zarrentin:~ # cd /usr/local/opnsense/service/conf/actions.d/ root@zarrentin:/usr/local/opnsense/service/conf/actions.d # ls actions_auth.conf actions_ids.conf actions_proxy.conf actions_captiveportal.conf actions_interface.conf actions_smart.conf actions_configd.conf actions_ipfw.conf actions_syslog.conf actions_cron.conf actions_ipsec.conf actions_system.conf actions_ddclient.conf actions_monit.conf actions_systemhealth.conf actions_dhcpd.conf actions_netflow.conf actions_template.conf actions_dns.conf actions_node_exporter.conf actions_unbound.conf actions_nut.conf actions_webgui.conf actions_dyndns.conf actions_openssh.conf actions_wireguard.conf actions_filter.conf actions_plugins.conf actions_firmware.conf actions_postfix.conf
In diesem Verzeichnis kann einfach eine neue Action bzw. ein neuer Cronjob hinzugefügt werden, der später in der Liste der “Befehle” erscheinen soll. Für das DNS-Update habe ich mittels Editor “vi” eine Datei “actions_dynamicdns.conf
” mit folgendem Inhalt angelegt:
root@zarrentin:/usr/local/opnsense/service/conf/actions.d # less actions_dynamicdns.conf [start] command:curl -s "https://ns1.xyzcdn.xyz/dynapi/api/update?key=<my_secret_key>&host=home&domain=gncdn.xyz" parameters: type:script message:Custom Dynamic DNS Update description:Custom Dynamic DNS Update home.gncdn.xyz
Die Parameter dürften selbsterklärend sein, tatsächlich ist dies auch eine Minimalkonfiguration, wie sich anhand der teils wesentlich längeren bzw. aufwändigeren Actions in diesem Verzeichnis sehen lässt. Das curl-Kommando ruft eine URL mit den entsprechenden Parametern auf und stößt damit das Update der IP-Adresse im DNS-Server an. Weitere Hinweise finden sich natürlich in der Dokumentation zu OPNsense.
Damit die neue Action in der Liste der zur Verfügung stehenden Cronjobs auftaucht, muss der configd-Service neu gestartet werden:
root@zarrentin:/usr/local/opnsense/service/conf/actions.d # service configd restart Stopping configd...done Starting configd.
Danach sollte unter “Befehl” der neue Eintrag wie in der Action-Datei unter “description:
” definiert zu finden sein und dort beim Anlegen ausgewählt werden:
Nach dem Anlegen findet sich der Cronjob auch in der Liste wieder – hier im Beispiel ist der neue Cronjob aktiviert, während derjenige, der sich auf das bisherige Dynamic-DNS-Plugin bezieht, deaktiviert wurde. Die Konfiguration des Zeitplans ist hierbei identisch, so dass die Ausführung alle fünf Minuten erfolgt.
Das war es auch schon, damit ist die Einrichtung eines neuen Cronjobs bereits erledigt. Eine kleine Warnung zum Schluss – beim Betrieb einer hochverfügbaren Lösung, d.h. zweier Firewalls, von denen eine als Master und eine als Backup dient, werden beim Synchronisieren der Konfiguration zwar die Einstellungen für die Cronjobs übernommen (d.h. Zeitplan, Befehl, Parameter), nicht jedoch die hinzugefügte Action-Datei. Diese muss ggf. manuell auf die Backup-Firewall kopiert bzw. dort ebenfalls angelegt werden.
Verwendete Quelle: Adding a cron job
Genial, das war genau das, wonach ich gesucht hatte – vielen Dank für die Anleitung. Top!
Really helpful !
Exakt gleiche Idee… Habe nach Custom Cron Job gesucht und genau das hier gefunden,
warum ich überhaupt nach dem Cron Job gesucht hab 🙂
Sehr gut !!!
Hello again…
Also noch eine Ergänzung die vielleicht dem ein oder anderen hilft.
Bei manchen Anbietern muss man die öffentliche IP mitgeben.
(Beispiel: netcup mit fernwerker/ownDynDNS)
set WANIP=`ifconfig igb0 | grep -E -o "inet ([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sed "s/inet //"`
curl -kX POST --data 'user=Max&password=Mustermann&domain=meinedomain.de&ipv4='$WANIP https://meinenetcupadresse.de/update.php
Klasse Tipp, danke.
Überlebt dieser Custom Cronjob denn dann ein Major Release, oder muss das neu eingerichtet werden?
Hallo zusammen,
versuche den Tipp von Gerry umzusetzen, aber bekomme es nicht zum laufen.
Wenn ich das richtig sehe dann kappt das alles nicht in einer Zeile.
Die Variable WANIP wird nicht gesetzt.
Hat jemand einen Tipp oder so laufend?
Hallo,
was passiert denn wenn du im Terminal folgendes eingibst…
set WANIP=`ifconfig igb0 | grep -E -o “inet ([0-9]{1,ifconfig3}[\.]){3}[0-9]{1,3}” | sed “s/inet //”`
echo $WANIP
Es sollte dann die öffentliche IP ausgegeben werden. Kommt ein Fehler oder nichts,
heisst dein WAN Netzwerkgerät wahrscheinlich anders.
Dann gibst du nur mal ifconfig ein…
Da siehst du dann all deine Netzwerkgeräte und IPs.
Hier findest du dann die öffentliche IP und dein WAN Gerätebezeichner.
Also wo bei mir igb0 steht muss dann dein Geräte Kürzel rein.