2009-08-28 20 views
11

Necesito controlar el tráfico entrante y saliente a/desde un cuadro linux desde dentro de un programa C++. Podría llamar al iptables desde mi programa, pero prefiero recortar al intermediario y acceder a las funciones API del núcleo yo mismo.control iptables C++

Creo que necesito usar libnfnetlink, sin embargo, no he podido encontrar ninguna documentación de API o programas de ejemplo.

Las reglas que necesito para construir son bastante simples, como lanzar paquetes con un puerto de destino igual a X, etc. NO tengo la intención de escribir una aplicación de firewall completa.

¿alguien puede sugerir un mejor enfoque o proporcionar un enlace a algunos documentos o aplicaciones de ejemplo? Prefiero evitar leer el código de iptables, pero supongo que tendré que hacerlo, si no puedo encontrar mejores recursos.

+0

Este es un duplicado de http://stackoverflow.com/questions/109553/how-can- i-programatically-manage-iptables-rules-on-the-fly – Claris

+0

Si te preocupa la sobrecarga de popen/vfork puedes usar otro proceso para apilar todos los cambios de iptables y confirmarlos de vez en cuando con iptables-restore. – anttir

Respuesta

9

Hace un año yo estaba teniendo el mismo requisito y probé alrededor. Pero después de contactar a algunos tipos de kernel de código abierto, esto es lo que supe:

Las API kernel de iptables no se externalizan, es decir, no son API documentadas. En el sentido, las API pueden cambiar en cualquier momento. Deben ser utilizados solo por la herramienta iptables. no deben ser utilizados por los desarrolladores de la aplicación.

-satish

+3

Como dijo Mark, nadie puede impedirte que lo uses, ya que es de código abierto. Pero, debe tener cuidado ya que las API pueden cambiar cuando surge la necesidad. Entonces su aplicación debe hacerse cargo de los cambios en el comportamiento de las API. – Satish

+0

+1 información de interés. Supongo que Thomi hará un montón de popen ("iptables ...") – neuro

+0

muy interesante, ¡gracias por la información! – Thomi

0

¿Por qué no acaba de obtener la fuente a iptables y hacerlo como lo hacen? Dado que es de código abierto ....

+3

porque necesito una interfaz estable, no una que pueda cambiar en cualquier momento. – Thomi

1

Normalmente no es necesario cambiar las reglas IP Tables sobre una base regular (es decir, con frecuencia en tiempo de ejecución). Por lo tanto, llamar a/sbin/iptables debería estar bien.

Si está intentando hacer esto, entonces probablemente necesite buscar una coincidencia alternativa o un módulo de destino que contenga su propia inteligencia, o use NFQUEUE para poner los paquetes en un programa de espacio de usuario que pueda tomar su propia decisión en los criterios que pueden cambiar tantas veces como quiera (tenga cuidado de enviar demasiados paquetes al espacio de usuario, es un posible problema de rendimiento)