2009-08-28 8 views
11

Ich muss eingehende und ausgehende Datenverkehr zu/von einer Linux-Box aus einem C++ - Programm steuern. Ich könnte iptables aus meinem Programm heraus aufrufen, aber ich würde lieber den mittleren Mann ausschneiden und auf die Kernel-API-Funktionen selbst zugreifen.iptables C++ Steuerelement

Ich glaube, ich muss libnfnetlink verwenden, jedoch konnte ich keine API-Dokumentation oder Beispielprogramme finden.

Die Regeln, die ich erstellen muss, sind ziemlich einfach - Dinge wie das Fallenlassen von Paketen mit einem Zielport gleich X usw. Ich habe nicht vor, eine vollständige Firewall-Anwendung zu schreiben.

Kann jemand einen besseren Ansatz vorschlagen oder einen Link zu einigen Dokumentationen oder Beispiel-Apps bereitstellen? Ich würde es eher vermeiden, den iptables-Code zu lesen, aber ich denke, dass ich möglicherweise muss, wenn ich keine besseren Ressourcen finden kann.

+0

Dies ist eine Kopie von http://stackoverflow.com/questions/109553/how-can- i-programmatically-manage-iptables-rules-on-the-fly – Claris

+0

Wenn Sie sich Sorgen um Popen/vfork overhead machen, können Sie einen anderen Prozess verwenden, um alle iptables-Änderungen zu stacken und sie mit iptables-restore ab und zu zu übernehmen. – anttir

Antwort

9

Ein Jahr zurück hatte ich die gleiche Anforderung und sondierte herum. Aber nach dem Kontakt mit einigen Open-Source-Kernel-Jungs ist das, was ich kennen gelernt habe -

Die Kernel-APIs von iptables sind nicht externalisiert, heißt es, sie sind keine dokumentierten APIs. In diesem Sinne können die APIs jeden Moment wechseln. Sie sollten nur vom iptables-Tool verwendet werden. Sie sollten nicht von den Anwendungsentwicklern verwendet werden.

-satish

+3

Wie Mark sagte, niemand kann Sie davon abhalten, es zu benutzen, da es Open Source ist. Seien Sie jedoch vorsichtig, da sich die APIs bei Bedarf ändern können. Dann muss Ihre Anwendung Änderungen im Verhalten der APIs vornehmen. – Satish

+0

+1 interessante Info. Ich denke, Thomi wird viel Popen machen ("iptables ...") – neuro

+0

sehr interessant - danke für die Info! – Thomi

0

Warum nicht einfach die Quelle zu Iptables bekommen und es tun, wie sie es tun? Da es Open Source ist ....

+3

weil ich eine stabile Schnittstelle brauche - keine, die sich jederzeit ändern kann. – Thomi

1

Sie sollten normalerweise nicht benötigen IP-Tabellen Regeln auf einer regelmäßigen Basis (das heißt häufig zur Laufzeit) zu ändern. Daher sollte/sbin/iptables in Ordnung sein.

Wenn Sie dies versuchen, müssen Sie wahrscheinlich ein alternatives Match- oder Target-Modul mit eigener Intelligenz suchen oder NFQUEUE verwenden, um die Pakete in ein Userspace-Programm einzuordnen, das seine eigene Entscheidung treffen kann auf Kriterien, die sich so oft ändern können, wie es will (Vorsicht beim Senden von zu vielen Paketen in den Benutzerbereich, es ist ein mögliches Leistungsproblem)