
Ich habe ein Netzwerk-Gateway-System, das iptables verwendet, um Datenverkehr zu/von einem internen Netzwerk zuzulassen/zu verweigern. Ich muss iptables
je 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 nat
und filter
Tabellen, einschließlich POSTROUTING
Regeln mit SNAT
Zielen, 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 SNAT
durch -j MASQUERADE
. Dadurch wird dasselbe Conntrack-basierte SNAT verwendet, die Ersatzquelladresse wird jedoch automatisch ausgewählt.
iptables-save
Sie 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,\b
um 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_ip
einmal 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.conf
und führen Sie aus,ferm
um 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.