En este capítulo se desarrollará en profundidad cómo 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 específica. Cada línea que escribas y añadas a una cadena se debe considerar una regla. También repasaremos las comparaciones básicas que tienes disponibles y cómo utilizarlas, así como los diferentes objetivos disponibles y cómo puedes crear nuevos objetivos (es decir, nuevas sub-cadenas).
Como ya se ha dicho, cada regla es una línea que lee el núcleo para saber qué hacer con un paquete. Si todos los criterios (o comparaciones) se cumplen, entonces se ejecuta la instrucción objetivo (o salto). Normalmente deberías escribir tus reglas con una estructura similar a ésta:
iptables [-t tabla] comando [comparación (match)] [objetivo/salto (target/jump)]
En ningún sitio se especifica que la instrucción objetivo (el salto) deba ser la última función de la línea. Sin embargo, deberías seguir esta estructura para conseguir que sea lo más legible posible. De todas formas, la mayoría de las reglas que veas se han escrito de esta forma. Así pues, si lees un script de otra persona, lo más seguro es que reconozcas la estructura y entiendas fácilmente la regla.
Si quieres utilizar cualquier otra tabla que no sea la estándar, 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 línea. De todas formas, está más o menos aceptado que se especifique la tabla al principio.
Eso sí, debes tener en cuenta que el comando debería ser siempre lo primero, o a lo sumo justo detrás de la especificación de la tabla. Se emplea el "comando" para decirle al programa qué hacer, como por ejemplo insertar o añadir una regla al final de una cadena, o borrar una regla. Veremos ésto en detalle más adelante.
La comparación es la parte de la regla enviada al núcleo que especifica el carácter concreto del paquete, lo cual lo diferencia de todos los demás paquetes. Aquí es dónde se puede determinar de qué dirección IP viene el paquete, de qué interfaz de red, la IP destino, el puerto, el protocolo o cualquier cosa. Hay un montón de comparaciones diferentes que pueden emplearse y que se verán en detalle en este capítulo.
Por último tenemos el objetivo del paquete. Si todas las comparaciones se cumplen para un paquete, le decimos al núcleo qué hacer con él. Por ejemplo, podemos hacer que envíe 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 más con él, o podemos enviar una respuesta específica al remitente. También estudiaremos los detalles en este capítulo.