El comando iptables-restore se emplea para volver a cargar en el ncleo el conjunto
de reglas guardado con iptables-save. Sin embargo, por ahora carga toda la informacin desde la entrada estndar y no desde un fichero. La sintaxis es: 36 Chapter 5. Salvando y restaurando grandes conjuntos de reglas iptables-restore [-c] [-n] El argumento -c reestablece los contadores de bytes y paquetes y es la opcin que debes usar cuando quieras volver a cargar los valores guardados con iptables-save de estos contadores. La opcin tambin puede escribirse en su forma extendida: --counters. El argumento -n le indica a iptables-restore que no sobreescriba las reglas existentes en la tabla o tablas en que est escribiendo. El comportamiento por defecto de iptables-restore es eliminar cualquier regla preexistente. La opcin en su "versin larga" sera: --noflush. Para cargar conjuntos de reglas con el comando iptables-restore tenemos varias alternativas, aunque veremos la ms simple y ms utilizada. cat /etc/iptables-save | iptables-restore -c Simplificando: con llo imprimiremos en la salida estndar (la pantalla) el contenido del conjunto de reglas existente en el fichero/etc/iptables-save y a continuacin esa salida se dirigir al comando iptables-restore, que captar el conjunto de reglas y lo cargar en el ncleo, incluyendo los valores de los contadores de bytes y paquetes. sta es la forma ms sencilla de comenzar a usar el comando, aunque el ejemplo anterior se puede modificar hasta la saciedad, con diferentes posibilidades de redireccionamiento de la salida. Sin embargo, sto se sale del objetivo de ste captulo y prefiero dejar al lector que experimente por su cuenta. El conjunto de reglas debera ahora estar cargado correctamente en el ncleo y todo debera funcionar. Si no es as, probablemente has cometido algn fallo al escribir los comandos, o habrs encontrado un "bug". 37 Chapter 6. Cmo se escribe una regla En este captulo se desarrollar en profundidad cmo escribir tus propias reglas. Una regla puede definirse como las instrucciones que seguir el cortafuegos al bloquear o permitir diferentes conexiones y paquetes en una cadena especfica. Cada lnea que escribas y aadas a una cadena se debe considerar una regla. Tambin repasaremos las comparaciones bsicas que tienes disponibles y cmo utilizarlas, as como los diferentes objetivos disponibles y cmo puedes crear nuevos objetivos (es decir, nuevas sub-cadenas). 6.1. Conceptos Bsicos Como ya se ha dicho, cada regla es una lnea que lee el ncleo para saber qu hacer con un paquete. Si todos los criterios (o comparaciones) se cumplen, entonces se ejecuta la instruccin objetivo (o salto). Normalmente deberas escribir tus reglas con una estructura similar a sta: iptables [-t tabla] comando [comparacin (match)] [objetivo/salto (target/jump)] En ningn sitio se especifica que la instruccin objetivo (el salto) deba ser la ltima funcin de la lnea. Sin embargo, deberas seguir esta estructura para conseguir que sea lo ms legible posible. De todas formas, la mayora de las reglas que veas se han escrito de esta forma. As pues, si lees un script de otra persona, lo ms seguro es que reconozcas la estructura y entiendas fcilmente la regla. Si quieres utilizar cualquier otra tabla que no sea la estndar, puedes especificarla en la parte que dice [tabla]. Sin embargo, no es necesario especificar qu tabla usar, puesto que por defecto iptables utiliza la tabla filter (filtro) para incluir todos los comandos. Tampoco es preciso que especifiques la tabla justo en ese punto de la regla. La verdad es que puede estar casi en cualquier parte de la lnea. De todas formas, est ms o menos aceptado que se especifique la tabla al principio. Eso s, debes tener en cuenta que el comando debera ser siempre lo primero, o a lo sumo justo detrs de la especificacin de la tabla. Se emplea el "comando" para decirle al programa qu hacer, como por ejemplo insertar o aadir una regla al final de una cadena, o borrar una regla. Veremos sto en detalle ms adelante. La comparacin es la parte de la regla enviada al ncleo que especifica el carcter concreto del paquete, lo cual lo diferencia de todos los dems paquetes. Aqu es dnde se puede determinar de qu direccin IP viene el paquete, de qu interfaz de red, la IP destino, el puerto, el protocolo o cualquier cosa. Hay un montn de comparaciones diferentes que pueden emplearse y que se vern en detalle en este captulo. 38 Chapter 6. Cmo se escribe una regla Por ltimo tenemos el objetivo del paquete. Si todas las comparaciones se cumplen para un paquete, le decimos al ncleo qu hacer con l. Por ejemplo, podemos hacer que enve el paquete a otra cadena que hayamos creado y que es parte de esta tabla. Podemos hacer que deseche el paquete y no haga nada ms con l, o podemos enviar una respuesta especfica al remitente. Tambin estudiaremos los detalles en este captulo. 6.2. Tablas La opcin -t especifica qu tabla utilizar. Por defecto se emplea la tabla filter, aunque se puede usar cualquiera de las siguientes tablas (ten en cuenta que este es un corto resumen del captulo Atravesando tablas y cadenas): Table 6-1. Tablas Tabla Descripcin nat La tabla nat se emplea principalmente para la traduccin de direcciones de red (Network Address Translation). Los paquetes que son filtrados por esta tabla acaban con sus IPs modificadas, de acuerdo con nuestras reglas (las de la tabla). De todos los paquetes de un mismo flujo, slo el primero pasa por esta tabla: asumiendo que se permite el paso del primer paquete de un flujo, al resto de paquetes del ese flujo se les aplican automticamente las mismas acciones realizadas con el primer paquete (sus IPs son "NAT-eadas" o filtradas por la tabla NAT; o se enmascaran; ...). En otras palabras, slo el primer paquete pasa por la tabla NAT y al resto del flujo se le trata exactamente igual sin necesidad de pasar por la tabla. Esta es la razn principal por la que no deberas hacer ningn filtrado en esta tabla, y lo comentaremos en detalle ms adelante. La cadena PREROUTING se emplea para modificar los paquetes en cuanto llegan al cortafuegos. La cadena OUTPUT se utiliza para modificar los paquetes generados localmente (es decir, en el cortafuegos) antes de tomar la decisin de enrutado (direccionamiento). Por ltimo la cadena POSTROUTING se usa para modificar los paquetes que estn a punto de abandonar el cortafuegos. 39 Chapter 6. Cmo se escribe una regla Tabla Descripcin mangle Esta tabla se emplea principalmente para "retocar" paquetes. Entre otras cosas, se puede cambiar el contenido de diferentes paquetes y el de sus cabeceras. Por ejemplo, se pueden cambiar los campos TTL, TOS o MARK. Se debe tener en cuenta, sin embargo, que modificar el campo MARK no es realmente un cambio del paquete, pero se establece su valor para el paquete dentro del espacio del ncleo. Otras reglas o programas pueden usar ese valor ms adelante para filtrar o efectuar un enrutado avanzado; tc es un ejemplo. La tabla consta de cinco cadenas: PREROUTING, POSTROUTING, OUTPUT, INPUT y FORWARD. PREROUTING se emplea para modificar los paquetes en cuanto llegan al cortafuegos y antes de que alcancen la decisin de enrutado. POSTROUTING se emplea para modificar los paquetes en cuanto las decisiones de enrutado se han tomado. OUTPUT se emplea para modificar los paquetes generados localmente, antes de que alcancen la decisin de enrutado. INPUT se emplea para modificar paquetes que se han redirigido al ordenador local, pero antes de que la aplicacin del espacio de usuario llegue a ver la informacin. FORWARD se emplea para modificar paquetes que acaban de pasar por la primera decisin de enrutado, pero antes de que lleguen a la ltima decisin de enrutado. Ten en cuenta que esta tabla no puede emplearse para cualquier tipo de traduccin de direcciones de red (Network Address Translation) o enmascaramiento (Masquerading): la tabla nat es la que tiene esa funcin. filter La tabla filter se debera emplear exclusivamente para filtrar paquetes. Por ejemplo, se pueden DROP (desechar), LOG (aadir a un registro de sucesos), ACCEPT (aceptar) o REJECT (rechazar) paquetes sin problemas, igual que en el resto de tablas. Tenemos tres cadenas en esta tabla: la primera (FORWARD) se usa para todos los paquetes que no se generan localmente y que no estn destinados a nuestra mquina (el cortafuegos, en otras palabras). INPUT se emplea en todos los paquetes que se destinan a nuestra mquina (el cortafuegos), mientras que OUTPUT se emplea para todos los paquetes generados localmente. Todo lo anterior debera haber aclarado los conceptos bsicos sobre las tres tablas diferentes que hay disponibles. Deben usarse para propsitos completamente diferentes y adems deberas saber cmo utilizar cada una de las cadenas existentes. Si no comprendes cmo se usan, es fcil que introduzcas un agujero en el cortafuegos que tarde o temprano descubrir y explotar alguien. Ya se han discutido en profundidad las tablas y cadenas en Atravesando tablas y cadenas. Si no lo entiendes a la perfeccin, te recomiendo que vuelvas a leerlo hasta que lo comprendas totalmente. 6.3. Comandos En esta seccin trataremos los distintos comandos y qu se puede hacer con ellos. Un comando le indica a iptables qu hacer con el resto de la regla que enviamos al analizador. Normalmente desearemos aadir o eliminar algo en una tabla determinada. En iptables estn disponibles los siguientes comandos: Table 6-2. Comandos Comando -A, --append 40 Chapter 6. Cmo se escribe una regla Ejemplo iptables -A INPUT ... Descripcin Este comando aade la regla al final de la cadena. La regla siempre se pondr la ltima en el conjunto de reglas y lgicamente se comprobar la ltima, a no ser que posteriormente aadas ms reglas con este mismo comando. Comando -D, --delete Ejemplo iptables -D INPUT --dport 80 -j DROP, iptables -D INPUT 1 Descripcin Este comando borra una regla de la cadena. Esto puede hacerse de dos maneras: bien introduciendo la regla completa a comparar (como en el ejemplo anterior), bien especificando el nmero de regla que deseas eliminar. Si empleas el primer mtodo, debers escribir exactamente lo mismo que haya en la cadena a borrar. Si empleas el segundo mtodo, debers sealar el nmero exacto que tiene la regla en la cadena: las reglas estn numeradas progresivamente desde la primera, empezando con el nmero 1. Comando -R, --replace Ejemplo iptables -R INPUT 1 -s 192.168.0.1 -j DROP Descripcin Este comando sustituye la entrada existente en la lnea especificada. Funciona de la misma forma que el comando --delete, pero en lugar de eliminar completamente la entrada, la sustituye por una nueva. El uso ms habitual de este comando puede ser la experimentacin con iptables. Comando -I, --insert Ejemplo iptables -I INPUT 1 --dport 80 -j ACCEPT Descripcin Se inserta una regla en la posicin de la cadena que especifiquemos. En el ejemplo anterior se insertar en la posicin no 1 en la cadena INPUT, por lo que a partir de entonces ser la primera regla en esa cadena. Comando -L, --list Ejemplo iptables -L INPUT Descripcin Este comando ofrece una lista de todas las entradas de la cadena especificada. En el ejemplo la lista mostrar todas las entradas de la cadena INPUT. Sin embargo est permitido no especificar ninguna cadena en particular, con lo cual el comando listar todas las cadenas de la tabla especificada (para especificar tablas, lee la seccin Tablas). El resultado final depende de otras opciones enviadas al analizador, como pueden ser -n, -v, etc. Comando -F, --flush Ejemplo iptables -F INPUT Descripcin Este comando elimina todas las reglas de una cadena, comenzando desde la que se ha especificado. Es equivalente a borrar cada regla una a una, pero bastante ms rpido. Se puede emplear sin opciones, con lo que borrar todas las reglas de todas las cadenas en la tabla especificada. Comando -Z, --zero Ejemplo iptables -Z INPUT 41 Chapter 6. Cmo se escribe una regla Descripcin Este comando obliga a comenzar desde cero a todos los contadores de una cadena especificada, o de todas las cadenas de una tabla. Si has utilizado la opcin -v del comando -L, probablemente habrs visto el contador de paquetes al principio de cada campo. Para "poner a cero" este contador, utiliza la opcin -Z. Esta funcin hace lo mismo que -L, salvo que -Z no hace ningn listado de las reglas. Si se emplean juntas -L y -Z (lo cual es correcto), las cadenas sern listadas primero y luego los contadores se reiniciarn (se pondrn a cero). Comando -N, --new-chain Ejemplo iptables -N allowed Descripcin Este comando hace que el ncleo cree una nueva cadena con el nombre especificado en la cadena especificada. En el ejemplo anterior se crea una cadena llamada allowed. Ten en cuenta que no puede haber ninguna cadena ni ningn objetivo con el mismo nombre. Comando -X, --delete-chain Ejemplo iptables -X allowed Descripcin Este comando borra de la tabla la cadena especificada. Para que funcione, no debe haber ninguna regla que est relacionada con la cadena que se va a borrar. En otras palabras, debers borrar o cambiar todas las reglas que tengan algn vnculo con esa cadena antes de borrarla. Si se usa el comando sin opciones, todas las cadenas creadas por el usuario sern eliminadas y slo permanecern aquellas que pertenezcan a la tabla especificada, es decir, aquellas que se instalan con iptables. A modo de ejemplo, si escribimos iptables --delete-chain -t filter lo que conseguiremos ser eliminar todas las cadenas "de usuario" de la tabla filter, permaneciendo las cadenas por defecto de esta tabla; si, en cambio, escribimos iptables --delete-chain, iptables considera que especificamos la tabla por defecto (la tabla filter), con lo cual el resultado ser exactamente el mismo que en el ejemplo anterior. Comando -P, --policy Ejemplo iptables -P INPUT DROP Descripcin Este comando hace que el ncleo establezca la poltica u objetivo por defecto en una cadena. Todos los paquetes que no coincidan con ninguna regla emplearn esa poltica de la cadena. Los objetivos permitidos son: DROP y ACCEPT (pueden haber ms; envame un correo si es as). Comando -E, --rename-chain Ejemplo iptables -E allowed disallowed Descripcin El comando -E hace que iptables cambie el nombre de una cadena del primer al segundo nombre. En el ejemplo anterior cambiaramos el nombre de la cadena de allowed (permitido) a disallowed (no permitido). Ten en cuenta que sto no afecta a la forma de actuar de la tabla, sino que es simplemente un cambio cosmtico. Siempre deberas escribir una lnea completa de comando, a no ser que slo quieras ver la ayuda de iptables o conocer la versin del comando. Para mostrar la versin, emplea la opcin -v y para la ayuda, usa la opcin -h. Vamos, como siempre. Ahora vamos a ver unas cuantas opciones que pueden usarse con varios comandos. Observars que se 42 Chapter 6. Cmo se escribe una regla indica con qu comandos se pueden emplear y qu resultados ofrecen. Ten en cuenta que no se incluye ninguna opcin que afecte a reglas o comparaciones. Estas otras opciones se vern en profundidad ms adelante. Table 6-3. Opciones Opcin -v, --verbose Comandos con los que se emplea --list, --append, --insert, --delete, --replace Descripcin Este comando ofrece una salida detallada (completa, descriptiva) y se emplea principalmente con el comando --list. En este caso se mostrar la direccin de la interfaz, las opciones de la regla y las mscaras TOS. Asmismo, tambin se incluyen los contadores de bytes y paquetes para cada regla. Estos contadores emplean las abreviaturas K (x1,000), M (x1,000,000) y G (x1,000,000,000). Para obtener el tamao exacto, puedes emplear la opcin -x, descrita ms adelante. Si se usa esta opcin con los comandos --append, --insert, --delete o --replace, el programa mostrar informacin detallada sobre cmo se ha interpretado la regla, si se ha insertado correctamente, etc. Opcin -x, --exact Comandos con los que se emplea --list Descripcin Esta opcin expande las numeraciones, o sea, no se emplean los mltiplos K, M o G, si no que se ven los paquetes y bytes exactos de los contadores de la regla en cuestin. Esta opcin slo es til con el comando --list y no tiene ningn inters en los dems comandos. Opcin -n, --numeric Comandos con los que se emplea --list Descripcin Esta opcin muestra valores numricos: las direcciones IP y los puertos se listarn con sus nmeros y no con sus nombres de servidor, red o aplicacin. Slo se utiliza con --list e ignora la opcin por defecto de traducir todos los valores numricos a servidores y nombres (donde sea posible). Opcin --line-numbers Comandos con los que se emplea --list Descripcin Empleando esta opcin con --list, cada regla se listar con su nmero de lnea. Puede ser conveniente saber qu nmero tiene cada regla al insertar reglas. Esta opcin slo tiene efecto con el comando --list. Opcin -c, --set-counters Comandos con los que se emplea --insert, --append, --replace 43 Chapter 6. Cmo se escribe una regla Descripcin Esta opcin se usa cuando se crea o modifica una regla de forma que se reinicializan sus contadores de paquetes y bytes. La sintaxis sera algo as: --set-counters 20 4000, lo cual le dira al ncleo que fijara el contador de paquetes a 20 y el contador de bytes a 4000. Opcin --modprobe Comandos con los que se emplea Todos Descripcin Esta opcin se emplea para indicarle a iptables qu mdulo utilizar al probar mdulos o al aadirlos al ncleo. Se puede usar por ejemplo cuando el comando modprobe no est en ningn directorio de la ruta de bsqueda. De esta forma el programa sabr qu hacer si se necesita un mdulo que no se ha cargado previamente. Esta opcin se puede utilizar con todos los comandos