Skip to main content
  1. Posts/

Fortigate Debugging - Objekt Referenzen

Im zweiten Teil meiner Fortigate Debugging Reihe befassen wir uns damit, wie man über die CLI herausfindet, welche Teile der Konfiguration ein bestimmtes Objekt referenzieren.

Objekte, wie zum Beispiel Adressen oder Interfaces, lassen sich auf der CLI mit Hilfe des delete Befehls löschen. Damit das Kommando allerdings wie gewünscht funktioniert, müssen zuvor alle Referenzen gelöscht werden, die auf das entsprechende Element verweisen. Versucht man ein noch referenziertes Objekt zu löschen, bricht der Befehl mit einer Fehlermeldung ab. Dies ist in folgendem Beispiel zu sehen, in welchem ich versuche, das Addressobjekt all zu entfernen:

FortiGate-VM64 (VDOM) # config firewall address

FortiGate-VM64 (address) # delete all
The entry is used by other 2 entries
Command fail. Return code -23

Die Meldung gibt an, wie viele Referenzen noch auf das zu löschende Objekt zeigen. Wo genau das Objekt verwendet wird, gibt der Fehler dagegen nicht an. Hierzu ist das separate Kommando diagnose sys cmdb refcnt show zu verwenden. Der folgende Block zeigt den Befehl in Aktion. Dabei lasse ich mir alle Referenzen anzeigen, welche auf das Addressobjekt all verweisen.

FortiGate-VM64 (VDOM) # diagnose sys cmdb refcnt show firewall.address.name all
entry used by child table dstaddr:name 'all' of table firewall.policy:policyid '43'
entry used by child table dstaddr:name 'all' of table firewall.policy:policyid '44'

Dem Kommando sind zwei Parameter zu übergeben. Der erste Teil ist im Beispiel grün markiert und gibt an, um was für eine Art von Objekt es sich handelt. Der Aufbau dieses Parameters orientiert sich an der Struktur einer Fortigate Konfiguration. Im Beispiel suche ich alle Verweise auf ein bestimmtes Adressobjekt. Diese werden über die CLI mittels dem config firewall address Befehl konfiguriert. Den config Teil können wir ignorieren, weshalb der Parameter mit firewall.address beginnt. Den Suffix .name müssen wir anhängen, da wir das Objekt anhand seines Namens identifizieren. Dieser Name ist der zweite Parameter und im Beispiel orange eingefärbt.

Auch die Ausgabe des Kommandos ist nach diesem Konzept aufgebaut. firewall.policy gibt an, dass die Adresse von einer Policy referenziert wird. Diese lassen sich mit dem show firewall policy Befehl einsehen. Der policyid 43 Part identifiziert mittels der ID die genau Regel, welche das Objekt verwendet.

FortiGate-VM64 (VDOM) # show firewall policy 43
config firewall policy
    edit 43
        set name "Lena"
        set uuid 183c9bf8-7b2c-51eb-f1f1-70cc3adbac2e
        set srcintf "any"
        # Tatsächlich ist als Destination Adresse "all" gesetzt
        set dstintf "any"
        set srcaddr "H.192.168.178.1"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "HTTP" "HTTPS"
        set logtraffic all
        set comments "Web Traffic erlauben"
    next
end

Da das Kommando nicht besonders intuitiv ist, zeige ich nachfolgend ein weiteres Beispiel. In diesem Fall möchte ich herausfinden, welche Referenzen auf das Interface mit dem Namen aggr1 existieren. Interfaces lassen sich über die CLI mit dem config system interface Befehl konfigurieren und ich möchte das Objekt erneut über seinen Namen identifizieren. Daraus ergibt sich system.interface.name als erster Parameter:

FortiGate-VM64 (VDOM) # diagnose sys cmdb refcnt show system.interface.name aggr1
entry used by table system.interface:name 'aggr1.vlan127'
entry used by table system.interface:name 'aggr1.vlan409'

FortiGate-VM64 (VDOM) # show system interface aggr1.vlan127
config system interface
    edit "aggr1.vlan127"
        set vdom "VDOM"
        set allowaccess ping
        set description "Server Netzwerk"
        set snmp-index 127
        set interface "aggr1"
        set vlanid 127
    next
end

Sobald alle Referenzen aufgelöst sind, sollte sich das gewünschte Objekt normal löschen lassen.

⚠️ Achtung: Anhand der Ausgabe ist es nicht immer direkt ersichtlich, welche Konfiguration genau editiert werden muss, um die Referenz aufzulösen. In solch einem Fall ist es hilfreich, die gesamte Konfiguration nach dem Namen zu durchsuchen. Diese Suche sollte jedoch immer auf einem vollständigen Konfigurationsbackup durchgeführt werden. Das CLI Kommando show full-configuration | grep sollte dagegen explizit vermieden werden. Fortigate Konfigurationen besitzen diverse versteckte Menüs, welche selbst bei einem show full-configuration nicht angezeigt werden. Dementsprechend liefert grep in solchen Fällen keine Ergebnisse zurück. In einem Konfigurationsbackup sind dagegen alle Menüs vorhanden.