Ziel ist es, über die OPNsense-API ein Gateway hinzuzufügen, oder auch zu löschen, was seit Version 24.1 möglich ist (zuvor konnte man lediglich den Gateway-Status einsehen). Bisher ist die API-Dokumentation bzgl. der Gateways leider noch nicht aktualisiert worden (Stand 08.02.2024), daher hier eine entsprechende Kurzübersicht anhand von curl-Befehlen.
Vorab: Das ganze ist hier ausschliesslich für IPv6 dokumentiert und das Gateway wird auch im deaktivierten Zustand hinzugefügt, um mögliche Probleme zu vermeiden. Es lässt sich aber recht einfach auf IPv4 abändern (z.B. "inet" statt "inet6"). Alle Variablen sind GROSS geschrieben, diese wäre entsprechend der Umgebung anzupassen.
Über folgenden curl-Befehl kann man (nachdem die Credentials generiert und entsprechende Berechtigungen erteilt worden sind) ein Gateway über die OPNsense-API mittels "addGateway" hinzufügen:
curl -XPOST -k -u "KEY":"SECRET" \
-H "Content-Type: application/json" \
-d '{"gateway_item":{"disabled":"1","name":"GW-NAME","interface":"IF-NAME","ipprotocol":"inet6","gateway":"IPV6-GW-IP","defaultgw":"0","fargw":"0","monitor_disable":"1"}}' \
https://OPNSENSE-IP/api/routing/settings/addGateway
Das Gateway sollte nun deaktiviert in der Gateway-Übersicht der OPNsense vorhanden sein. Möchte man das Gateway über die API löschen, müssen wir zunächst die - bei der Erstellung automatisch generierte - UUID des gewünschten Gateways auslesen. Diese können wir anhand von "searchGateway" unter Angabe der Gateway-IP-Adresse auslesen:
curl --silent -k -u "KEY":"SECRET" \
https://OPNSENSE-IP/api/routing/settings/searchGateway \
| jq -r '.rows[] | select(.gateway=="IPV6-GW-IP") | .uuid'
Nachdem wir die UUID ausgelesen haben, können wir mittels der UUID auch das korrekte Gateway mittels "delGateway" löschen:
curl -XPOST -k -u "KEY":"SECRET" \
-H "Content-Type: application/json" \
-d '{"uuid":"UUID"}' \
https://OPNSENSE-IP/api/routing/settings/delGateway/UUID
Wichtig zu beachten wäre hier, dass die UUID des zu löschenden Gateways im Payload und zusätzlich am Ende der API-URL angegeben werden muss.
---
Vielen Dank an den User blurrrr für diese Anleitung!