Kurztipp: Custom Cronjobs mit OPNsense

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.

Kurztipp: Custom Cronjobs mit OPNsense 1

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.

 

Kurztipp: Custom Cronjobs mit OPNsense 2

 

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.

Kurztipp: Custom Cronjobs mit OPNsense 3

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.

Kurztipp: Custom Cronjobs mit OPNsense 4

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:

Kurztipp: Custom Cronjobs mit OPNsense 5

 

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.

Kurztipp: Custom Cronjobs mit OPNsense 6

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

6 Gedanken zu „Kurztipp: Custom Cronjobs mit OPNsense“

  1. 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 !!!

  2. 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

  3. 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?

  4. 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Tags: