linux - puerto - ¿Cómo puedo administrar programáticamente las reglas de iptables sobre la marcha?
iptables permitir todo a una ip (8)
De las preguntas frecuentes de netfilter :
Desafortunadamente, la respuesta es no.
Ahora puedes pensar ''¿pero qué pasa con libiptc?''. Como se ha señalado numerosas veces en la (s) lista (s) de correo, libiptc NUNCA debe usarse 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 muy conscientes de que hay una falta fundamental para tal 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.
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?
Lo más cerca que he llegado a una solución es usando iptables-save | iptables-xml
iptables-save | iptables-xml
para consultar y llamar manualmente al comando 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.
Deliberadamente no hay API para administrar estas reglas. Se supone que no debes querer hacerlo. O algo.
Si necesita reglas que sean lo suficientemente dinámicas para preocuparse por el rendimiento de ejecutar / sbin / iptables, existen otras maneras de hacerlo:
- Usando algo como la coincidencia "reciente" o la coincidencia de conjuntos de IP, puede agregar / eliminar direcciones IP de listas negras / blancas sin cambiar el conjunto de reglas.
- Puede pasar paquetes al espacio de usuario para filtrar usando NFQUEUE
Esta mañana me desperté y descubrí que recibía 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"**
==> PHP Script:
<?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 );
}
}
?>
Suposiciones
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.
Este es un ejemplo del uso de bash e iptables para bloquear dinámicamente a los 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
}
Corro esto en un bucle 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 de algunas direcciones IP importantes que siempre son válidas y que pueden haber tenido problemas para conectarse (debido a un error del usuario).
De vez en cuando, clasifico la lista de filtros de iptables y creo rangos de IP a partir de ellos (usando un script 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.
MarkR tiene razón, se supone que no debes 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.
Por lo que yo entiendo (aunque ninguna referencia parece mencionarlo), iptables-restore
es atómico. Al final, cuando se lee la línea COMMIT
, iptables
llama a iptc_commit
en libiptc
(que en una interfaz interna no debes usar), que luego llama a setsockopt(SO_SET_REPLACE)
con tus 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é).
Puede considerar usar rfw que es la API REST para iptables. Está serializando los comandos de iptables de varias fuentes potencialmente concurrentes y ejecuta de forma remota iptables sobre la marcha.
rfw está diseñado para sistemas distribuidos que intentan actualizar las reglas de firewall en múltiples cuadros, 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 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 consultar el 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.
Usar iptables-save e iptables-restore para consultar y regenerar reglas es la manera 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ámicos son realmente la misma regla repetida muchas veces, como:
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 desee cambiar qué puertos pueden acceder al puerto 22 (útil para, por ejemplo, tocar el puerto), puede usar ipsets. Verbigracia:
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.