Ändern Sie alle Regeln in iptables, wenn Sie die IP-Adresse ändern

Ändern Sie alle Regeln in iptables, wenn Sie die IP-Adresse ändern

Ich habe ein Netzwerk-Gateway-System, das iptables verwendet, um Datenverkehr zu/von einem internen Netzwerk zuzulassen/zu verweigern. Ich muss iptablesje nach den Anforderungen der Entitäten im internen Netzwerk manuell Regeln hinzufügen und entfernen, einschließlich der NAT-Zuweisung ihres Datenverkehrs. Vertrauenswürdige Entitäten im internen Netzwerk können das Hinzufügen und Entfernen von Regeln nach Bedarf anfordern. Das Endergebnis ist eine Reihe von Regeln in den natund filterTabellen, einschließlich POSTROUTINGRegeln mit SNATZielen, die die Quell-IP auf die des Gateway-Systems festlegen, und Regeln in anderen Tabellen mit der externen Gateway-IP-Adresse als dst.

Ich möchte die IP des Gateway-Systems im laufenden Betrieb festlegen können. Dies hätte natürlich störende Folgen für TCP-Sitzungen usw., aber das wollen wir außen vor lassen. Das System behandelt diese Probleme mit anderen Mechanismen.

Das Problem besteht darin, dass eine unbekannte Anzahl von Regeln in den Firewall-Tabellen immer noch auf diese alte Quell-IP-Adresse verweisen.

Gibt es eine Möglichkeit, alle diese Regeln einfach zu ändern, um die neue IP-Adresse anstelle der alten zu verwenden?Natürlich kann ich auch einige ausgefallene Skripte mit sed/awk oder Ähnlichem akzeptieren, wenn Sie mehr ein Bash-Zauberer sind als ich ...

Antwort1

Wenn der per SNAT verarbeitete Datenverkehr immer die IP-Adresse der ausgehenden Schnittstelle verwendet, ersetzen Sie es -j SNATdurch -j MASQUERADE. Dadurch wird dasselbe Conntrack-basierte SNAT verwendet, die Ersatzquelladresse wird jedoch automatisch ausgewählt.

iptables-saveSie können iptables-Regeln mithilfe von und massenweise bearbeiten iptables-restore:

  • So bearbeiten Sie beispielsweise den Regelsatz interaktiv (insbesondere, wenn Ihr Editor über eine gute Suchen-und-Ersetzen-Funktion verfügt):

    iptables-save > /tmp/rules
    vim /tmp/rules
    iptables-restore < /tmp/rules
    

    Verwenden von „vipe“ von moreutils:

    iptables-save | vipe | iptables-restore
    
  • So ersetzen Sie eine exakte IP-Adresse massenhaft durch eine andere (denken Sie daran, dass es .sich in regulären Ausdrücken um ein Platzhalterzeichen handelt und verwenden Sie es, \bum sicherzustellen, dass „12.34“ nicht versehentlich mit „112.34“ übereinstimmt):

    iptables-save | sed 's/\b12\.34\.56\.78\b/12.34.56.99/g' | iptables-restore
    

Aber meiner Meinung nach,beliebigDas Bearbeiten von iptables-Regeln (einschließlich der skriptbasierten "iptables -A"-Einrichtung) ist ein schlechter Ansatz. Behalten Sie stattdessen eineiptables.rules Datei(im iptables-save-Format) als „Quelle“ und laden Sie den Regelsatz immer aus dieser Datei. Dann können Sie eine Art Makro-/Vorlagensprache verwenden, um die IP-Adresse einmal zu definieren und überall darauf zu verweisen – ähnlich wie beim Bereitstellen von Konfigurationsdateien über Salt/Ansible (falls diese noch jemand verwendet).

  • Zum Beispiel (tun Sie das nicht wirklich, es gerät zu schnell in eine unkontrollierbare Situation):

    cat /etc/iptables.rules | sed 's/%CUST_IP%/12.34.56.78/g' | iptables-restore
    
  • Ich würde auch vorschlagen, einen Blick auf Ferm zu werfen, das eine alternative Syntax für iptables-Regeln implementiert – im Allgemeinen etwas besser lesbar, aber auch über integrierte Makros verfügt, sodass Sie @def $cust_ipeinmal darauf verweisen können und es überall verwenden können.

    domain (ip ip6) {
        @def dns_host4 = 10.10.0.53;
        @def ntp_host4 = 10.10.0.123;
    
        table filter {
            chain FORWARD {
                daddr ($dns_host4 $ntp_host4) accept;
            }
        }
    
        table nat {
            chain PREROUTING {
                proto (tcp udp) dport 53 DNAT to-destination $dns_host4;
                proto udp dport 123 DNAT to-destination $ntp_host4;
            }
        }
    }
    

    Dies funktioniert ähnlich wie iptables-restore – anstatt Änderungen live vorzunehmen, bearbeiten Sie /etc/ferm.confund führen Sie aus, fermum den gesamten Regelsatz neu zu laden, wenn Sie fertig sind. Wenn sich eine IP-Adresse ändert, bearbeiten Sie einfach das @def-Makro in ferm.conf und laden Sie neu.

    (Außerdem ist es gut, sich daran zu gewöhnen, wenn Sie letztendlich zu nftables wechseln, da es ziemlich genau wie Ferm funktioniert – natürlich ist die Syntax etwas anders, aber es hat auch $macros und Sie bearbeiten /etc/nftables.conf und laden das Ganze auf einmal neu.)

Antwort2

Ich würde iptables in Kombination mit ipset vorschlagen.

In iptables hätten Sie Ihre Regel, aber fügen Sie dann --match-set setname src hinzu

iptables -I PREROUTING -s whatever ... --match-set setname src
iptables -I PREROUTING -s whatever ... --match-set setname dst

Um die Regel dann zu deaktivieren, entfernen Sie die IP-Adresse aus dem Set mit dem Namen „Setname“. Um sie zu aktivieren, fügen Sie einfach eine IP-Adresse zu Setname hinzu.

Dann bleiben iptables gleich und Sie fügen einfach Einträge zu setname hinzu bzw. entfernen sie

Jede Regel hätte je nach Bedarf einen anderen Namen.

verwandte Informationen