2008-09-20 6 views
36

Necesito consultar las reglas existentes, así como también poder agregar y eliminar reglas fácilmente. No he encontrado ninguna API para hacer esto. ¿Hay algo que me estoy perdiendo?¿Cómo puedo gestionar programáticamente las reglas de iptables sobre la marcha?

Lo más cerca que he llegado a una solución es usar iptables-save | iptables-xml para consultar y llamar manualmente el comando de iptables para agregar/eliminar reglas. Otra solución que he considerado es simplemente regenerar todo el conjunto de reglas de la base de datos de mi aplicación y vaciar toda la cadena, y luego volver a aplicarla. Pero quiero evitar esto ya que no quiero soltar ningún paquete, a menos que haya una manera de hacerlo atómicamente. Me pregunto si hay una mejor manera.

Una API en C sería genial; sin embargo, como estoy planeando convertir esto en un programa suid independiente, las bibliotecas que hacen esto en CUALQUIER idioma también están bien.

+0

Aparentemente es posible pasar de XML a iptables-restore 'xsltproc iptables.xslt my-iptables.xml | iptables-restore'. Ver la página de manual de 'iptables-xml'. – CMCDragonkai

Respuesta

3

deliberadamente no hay API para administrar estas reglas. Se supone que no debes querer hacerlo. O algo.

Si necesita reglas que sean suficientemente dinámica que se preocupan por el rendimiento de ejecución/sbin/iptables, hay otras maneras de hacerlo:

  • usar algo como el "reciente" encuentro o SET IP coincidente , puede agregar/eliminar direcciones IP de listas negras/blancas sin cambiar el conjunto de reglas.
  • Puede pasar paquetes al espacio de usuario para el filtrado utilizando NFQUEUE
+4

Me parece tonto que no haya API para esto. Realmente no me importa el rendimiento como tal, pero llamar a iptables parece una manera horriblemente hacky de hacer las cosas. – Ycros

+0

Hmm, podría usar ipsets, y desde una perspectiva de rendimiento es una muy buena idea. Desafortunadamente tendré que rodar mi propio kernel, y esto no es posible ya que algunos de los lugares que este software se ejecutará en máquinas virtuales donde no puedo meterme con el núcleo fácilmente. Y todavía no proporcionan una buena API. – Ycros

+0

ipt_recent es un destino de coincidencia de iptables estándar que le permite agregar/eliminar dinámicamente direcciones IP de un conjunto al escribir en un archivo en/proc sin cambiar las reglas. Por otro lado, no está diseñado para grandes conjuntos de IP y parece tener un límite máximo fijo. – MarkR

0

derecho de MarkR, no se supone que para hacer esto. La forma más fácil es llamar a iptables desde el script o escribir la configuración de iptables y 'restaurarla'.

Aún así, si lo desea, lea la fuente de iptables. iptables usa coincidencias y tablas como objetos compartidos. Puedes usar la fuente o ellos.

El netfilter de Linux también tiene algunos archivos de inclusión en/usr/include/netfilter *. Estas son funciones de bajo nivel. Es lo que usa iptables. Esto es lo más cercano a una API que uno puede obtener sin iptables.

Pero esta API es 'desordenada'. Tenga en cuenta que fue diseñado para ser utilizado solo por iptables. No está muy bien documentado, puede atacar problemas muy específicos, la API puede cambiar bastante rápido sin ninguna advertencia, por lo que una actualización romperá su código, etc.

+2

Puedo aceptar que usar API internas es malo, pero ¿por qué es tan malo que deliberadamente no incluyan una API pública? Podría hacer una restauración si puedo hacer una restauración de una sola cadena, tendré que hacer algunas pruebas. – Ycros

+0

Sí, puede restaurar una sola cadena. :-) –

+0

Allí, en la respuesta. – terminus

4

Por lo que tengo entendido (aunque ninguna referencia parece mencionar it), iptables-restore es atómico. Al final, cuando se lee la línea COMMIT, iptables llama al iptc_commit en (que en una interfaz interna no debe usar), que luego llama al setsockopt(SO_SET_REPLACE) con sus nuevos conjuntos de reglas.

Eso suena tan atómico como se puede obtener: con una llamada al kernel. Sin embargo, las partes más conocedoras están invitadas a disputar esto. :-)

Editar: Puedo confirmar que su descripción es correcta. iptables-restore se realiza como una operación atómica en el kernel.

Para ser aún más específico la operación "solo" es atómica por CPU. Como almacenamos todo el blob de reglas por CPU (debido a las optimizaciones de caché).

16

Desde el netfilter FAQ:

La respuesta lamentablemente es: Nº

Ahora usted podría pensar 'pero ¿qué pasa con libiptc?'. Como se ha señalado numerosas veces en la (s) lista (s) de correo, libiptc era NUNCA destinado a ser utilizado como una interfaz pública. No garantizamos una interfaz estable, y está previsto eliminarla en la próxima encarnación del filtrado de paquetes de Linux. libiptc es demasiado bajo-capa para ser utilizado razonablemente de todos modos.

Somos conscientes de que existe una falta fundamental de dicha API, y estamos trabajando para mejorar esa situación. Hasta entonces, se recomienda utilizar el sistema() o abrir un conducto en stdin de iptables-restore. Este último le dará un mejor rendimiento.

+0

Me pregunto por qué las preguntas frecuentes no abordan el tema de la atomicidad. Debería; Me he tomado la molestia de ver la implementación de iptables-restore solo para asegurarme de que sea atómica. Aquí es importante para el OP, y también tuve un proyecto que lo requería. –

+1

Esta publicación de la lista de distribución de netfilter dice que iptables-restore es atomic: http://www.mail-archive.com/[email protected]/msg00456.html –

+0

Para los más valientes que aún desean hacer esto, hay algo de información aquí: http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO-4.html#ss4.2 – Roman

12

Usar iptables-save e iptables-restore para consultar y regenerar reglas es la forma más fácil de hacerlo. Estos solían, una vez, ser guiones de shell, pero ahora son programas en C que funcionan de manera muy eficiente.

Sin embargo, debo señalar que hay una herramienta que puede usar que hará que el mantenimiento de iptables sea mucho más fácil. La mayoría de los conjuntos de reglas dinámicas son realmente la misma regla repiten muchas veces, como por ejemplo:

iptables -A INPUT -s 1.1.1.1 -p tcp -m --dport 22 -j ACCEPT 
iptables -A INPUT -s 2.2.2.0/24 -p tcp -m --dport 22 -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport 22 -j REJECT 

En lugar de reemplazar esas reglas cada vez que quiera cambiar los puertos que puedan acceder al puerto 22 (útil para la opinión, golpeo de puertos), se puede usa ipsets. Viz:

ipset -N ssh_allowed nethash 
iptables -A ssh_allowed -m set --set ssh_allowed src -p tcp -m --dport 22 -j ACCEPT 
ipset -A ssh_allowed 1.1.1.1 
ipset -A ssh_allowed 2.2.2.0/24 

Los conjuntos pueden contener direcciones IP, redes, puertos, direcciones MAC y tienen tiempos de espera en sus registros. (¿Alguna vez quisiste agregar algo por solo una hora?).

Incluso existe una forma atómica de intercambiar un conjunto por otro, por lo que una actualización significa crear un nuevo conjunto temporal y luego cambiarlo por el nombre del conjunto existente.

+0

Sí, la respuesta más alta menciona ipsets, pero como dije en un comentario allí, requiere un módulo kernel que no está en Ubuntu por defecto, y no es algo que pueda instalar en ninguna de las máquinas virtuales que uso. – Ycros

+1

Sí, informé de ese error en enero '07. https://bugs.launchpad.net/ubuntu/+source/ipset/+bug/79182 – Jerub

+2

Ubuntu soporta ipset adecuadamente ahora. – Jerub

1

Esta mañana me desperté y descubrí que se estaba recibiendo un ataque de denegación de servicio (DOS) desde Rusia. Me estaban golpeando desde docenas de bloques de IP. Deben tener una gran cantidad de IP o algún tipo de lista de proxy/servicio. Cada vez que bloqueaba una IP, aparecía otra. Finalmente, busqué un script y descubrí que necesitaba escribir mi propia solución. Lo siguiente es un poco agresivo, pero estaban ejecutando mi TOP LOAD LEVEL a más de 200.

Aquí hay un script rápido que escribí para bloquear el DOS en tiempo real.

cat **"output of the logs"** | php ipchains.php **"something unique in the logs"** 

==> Script PHP:

<?php 

$ip_arr = array(); 

while(1) 
{ 
    $line = trim(fgets(STDIN)); // reads one line from STDIN 
    $ip = trim(strtok($line, " ")); 

    if(!array_key_exists($ip, $ip_arr)) 
     $ip_arr[$ip] = 0; 

    $regex = sprintf("/%s/", $argv[1]); 

    $cnt = preg_match_all($regex, $line); 

    if($cnt < 1) continue; 

    $ip_arr[$ip] += 1; 

    if($ip_arr[$ip] == 1 ) 
    { 
//  printf("%s\n", $argv[1]); 
//  printf("%d\n", $cnt); 
//  printf("%s\n", $line); 

     printf("-A BLOCK1 -s %s/24 -j DROP\n", $ip); 

     $cmd = sprintf("/sbin/iptables -I BLOCK1 -d %s/24 -j DROP", $ip); 
     system($cmd); 
    } 
} 

?> 

Supuestos:

1) BLOCK1 is a Chain already created. 
2) BLOCK1 is a Chain that is run/called from the INPUT CHAIN 
3) Periodically you will need to run "ipchains -S BLOCK1" and put output in /etc/sysconfig file. 
4) You are familiar with PHP 
5) You understand web log line items/fields and output. 
0

Este es un ejemplo del uso de golpe y iptables para bloquear dinámicamente hackers que abusan de sshd en CentOS . En este caso, configuré sshd para no permitir el inicio de sesión con contraseña (permite las claves). Miro en/var/log/secure para las entradas de "Bye Bye", que es la forma educada de sshd de decir f-off ...

IP=$(awk '/Bye Bye/{print $9}' /var/log/secure | 
    sed 's/://g' |sort -u | head -n 1) 

[[ "$IP" < "123" ]] || { 

    echo "Found $IP - blocking it..." >> /var/log/hacker.log 

    /sbin/iptables -A INPUT -s $IP -j DROP 

    service iptables save 

    sed -i "/$IP/d" /var/log/secure 

} 

Ejecuto esto en un ciclo cada segundo o minuto, o lo que sea que me haga feliz. Probé el valor de $ IP para verificar que encontrara un valor útil, si es así invoco iptables para soltarlo, y utilizo sed para purgar el archivo de registro de $ IP para que la entrada no se vuelva a agregar.

Hago un pequeño preprocesamiento (no se muestra) a la lista blanca algunas direcciones IP importantes que siempre son válidas y que podrían haber tenido problemas para conectarse (debido a un error del usuario).

De vez en cuando, ordeno la lista de filtros de iptables y creo rangos de IP a partir de ellos (usando una secuencia de comandos diferente, y cuando se marcan, suelen ser rangos de IP de india, china y rusia). Por lo tanto, mi conjunto de reglas de filtro iptables en general se mantiene entre 50 y 500 entradas; ipset en realidad no mejora mucho en una lista tan corta.

+1

¿Cuál es la importancia del número 123? Si desea verificar que tiene una dirección IP válida al examinar el valor del primer octeto, podría ser cualquier cosa hasta 223, creo. – tripleee

+0

Esto no es una prueba de ningún octeto. Si al analizar/var/log/secure termina con un campo vacío o dañado, pruebe el valor para no ejecutar el comando iptables. El valor '123' fue bastante arbitrario. Al probar esto un poco más, encontré que probablemente debería reemplazar '123' con '1' para incluir un rango completo de IP, sin embargo. Cuando se prueba una IP menor que '123', será cierta para las direcciones IP en el rango de 2.0.0.0 a 255.255.255.255, por lo que no bloqueará las IP en el rango 1.x.x.x. Cuando la prueba de IP es menor que '1', coincide con 0.0.0.1 a 255.255.255.255. – Andrew

5

Puede considerar el uso de rfw que es la API REST para iptables. Está serializando comandos de iptables de varias fuentes potencialmente concurrentes y ejecuta iptables sobre la marcha de forma remota.

rfw está diseñado para sistemas distribuidos que intentan actualizar las reglas de firewall en varias casillas, pero también se puede ejecutar en una sola máquina en la interfaz de host local. Luego permite evitar la sobrecarga de SSL y autenticación, ya que se puede ejecutar en HTTP sin formato en este caso.

comando de la muestra:

PUT /drop/input/eth0/11.22.33.44 

que corresponde a:

iptables -I INPUT -i eth0 -s 11.22.33.44 -j DROP 

Puede insertar y eliminar reglas, así como la consulta de estado actual para obtener las reglas existentes en formato JSON:

GET /list/input 

Descargo de responsabilidad: Comencé ese proyecto. Es de código abierto bajo la licencia de MIT.

+0

Si se trata de HTTP, ¿eso no lo hace peligroso para un firewall? –

+0

Como se indicó anteriormente, el valor predeterminado es HTTPS. Existe una opción para deshabilitar SSL y usar HTTP simple, útil cuando se ejecuta en localhost en un entorno de usuario único. –

+0

Cualquier cosa que manipule el firewall "programáticamente"/de forma remota y/o automática es peligroso. Sin embargo, una seguridad adecuada puede mitigar esto, es decir, los sso tokens/2fa detrás de una puerta de enlace api (como kong) cubrirían en gran medida las necesidades de seguridad. –

Cuestiones relacionadas