3.1 Extensiones
LOG
Hemos visto algunas extensiones simples de IPTables, como ACCEPT, DROP y REJECT. Junto con ellas, existen extensiones adicionales, como la posibilidad de “loguear” las coincidencias. Para esto, se usa la extensión LOG, que envía los avisos de coincidencias encontradas hacia el servicio de logging del sistema (syslog).
Por ejemplo,
# iptables -A INPUT -i eth0 -p tcp --dport 25 -j LOG
hará que cualquier conexión al puerto 25 por TCP sea logueada. En el log de sistema, aparecerá lo siguiente (en mi caso):
Feb 22 08:49:36 pumba kernel: IN=eth0 OUT= MAC=00:80:ad:71:fb:26:00:00:86:4d:d3:b2:08:00 SRC=192.168.1.2 DST=192.168.1.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=47613 DF PROTO=TCP SPT=32771 DPT=25 WINDOW=5840 RES=0x00 SYN URGP=0
Esto indica que se realizó, al menos, una conexión hacia el puerto 25. Nótese que además se indican las banderas TCP (SYN).
Se puede además agregar una leyenda adicional, generalmente usada para distinguir la regla, o bien para facilitar la lectura de los logs.
# iptables -A INPUT -i eth0 -p tcp --dport 25 -j LOG --log-prefix "Conexion al puerto 25"
MASQUERADE
Otra, ya vista, fue MASQUERADE (o MASQ), usada para nat. Visto en el articulo pasado.
MARK
Esta extensión permite marcar los paquetes, permitiendo alterar el método de enrutamiento, pudiendo ser usado por otros subsistemas para cambiar su comportamiento.
TOS
Existe otra, llamada TOS (type of service). La orientación de esta extensión es proveer la alteración de paquetes (o sea, mangle) de acuerdo al servicio a prestar, priorizando el trafico proveniente de distintas partes. Por ejemplo, minimizar los tiempos de espera (Minimize Delay). Es usada con las cadenas PREROUTING y POSTROUTING.
Por ejemplo, para minimizar la demora en el servicio telnet
# iptables -t mangle -A PREROUTING -p tcp --dport telnet -j TOS --set-tos Minimize-Delay
Los tipos de servicio pueden ser
- Minimizar los tiempos de espera (Minimize-Delay)
- Maximizar el flujo de salida (Maximize-Throughput)
- Maximizar la confiabilidad de la transmisión (Maximize-Reliability)
- Minimizar los costos de la transmisión (Minimize-Cost)
- Servicios normales (Normal-Service)
REDIRECT
Otra extensión es REDIRECT (redirigir). Su misión es alterar los paquetes, de manera de cambiar el puerto de destino, pero sin modificar opciones adicionales, como en el caso de mangle.
Por ejemplo
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3200
desvía los paquetes que llegan al puerto 80 para redirigirlos al puerto 3200. Es útil para Web servers, ya que se puede correr Apache en un puerto superior al 1024 (user ports) y desviar el tráfico desde el puerto 80 al puerto donde realmente está corriendo, de forma transparente.
SNAT y DNAT
Estas extensiones permiten realizar transformaciones de dirección (origen y destino, respectivamente) de los paquetes. DNAT indica que la dirección de destino debe ser modificada. SNAT, la dirección de origen.
Permiten, por ejemplo, redirigir el tráfico hacia un host específico
# iptables -t nat -A POSTROUTING -d 192.168.1.1 -p tcp --dport 80 -j SNAT --to 192.168.1.3
O permitir que el tráfico desde Internet sea enviado a una máquina dentro de la LAN
# iptables -t nat -A PREROUTING -d 10.200.1.18 -j DNAT --to 192.168.1.8
MIRROR
La extensión MIRROR permite intercambiar el origen y el destino y retransmitir el paquete de vuelta al emisor.
Por ejemplo
# iptables -A INPUT -i eth0 -p tcp --dport 3128 -j MIRROR
Extensiones adicionales para coincidencias
De acuerdo al manual de IPTables, las extensiones para coincidencias (matches) pueden ser cargadas de dos maneras :
- por protocolo (-p)
- por coincidencia (-m)
Cada uno de ellos puede cargar módulos adicionales, en el caso que así sea, o soportar extensiones adicionales.
Por ejemplo
# iptables -A INPUT -m tcp -j ACCEPT
es inválido.
Algunas de las extensiones por coincidencia (-m) son
- limit : este módulo permite hacer coincidir paquetes de acuerdo a una tasa limitada de transferencia
- state : indica el estado de la transmisión (ver Inspección de Estado, a continuación)
- ttl : tiempo de vida del paquete
- owner : el propietario (UID, GID, PID) de la transmisión o paquete (solo usado en OUTPUT)
- tos : tipo de servicio
- length : largo del paquete
- mark : marca del paquete
- mac : MAC Address (dirección física de la tarjeta de red)
- unclean (experimental) : verifica la “limpieza” del paquete
Existen otras, pero son demasiado específicas (como ah y esp, usados específicamente con IPSec, otro paquete usado para enrutamiento).
3.2 Inspección de Estado
En el artículo anterior, se comentó acerca de la Inspección del Estado de la conexión. Ésta trata de interpretar todos los paquetes que provienen de una cierta conexión en particular, entendiendo así protocolos de alto nivel como NFS, HTTP y otros. Esta clase de comportamiento solo es posible examinando la cabecera de la información contenida dentro del paquete. Si, por ejemplo, un paquete es parte de una conexión, y calza con alguna de las coincidencias, entonces es procesado.
Las anteriores implementaciones no tenían esta característica. Así, por ejemplo, podía hacerse pasar un paquete como legítimo “a la fuerza”, siendo parte de una conexión arbitraria, como por ejemplo, Portscanning (”escaneo” o barrido de puertos).
Los estados en los cuales puede estar un paquete dentro de una transacción son
- NEW : un paquete que intenta iniciar una conexión
- RELATED : un paquete que es parte de una conexión
- INVALID : un paquete que no es parte de ninguna conexión
- ESTABLISHED : un paquete que, además de ser parte de una conexión, indica que es parte de una conexión establecida exitosa.
- RELATED+REPLY : un paquete que no es parte de alguna conexión existente, pero está relacionada con una. Generalmente asociados a ftp-data y ftp-control.
Por ejemplo, para permitir el FORWARD entre dos interfaces, sólo por conexiones nuevas, ya establecidas y relacionadas:
# iptables -A FORWARD -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
3.3 Cadenas de Usuario
En el articulo pasado dijimos que IPTables tenia 3 tablas (nat, filter y mangle), además de las cadenas INPUT, OUTPUT....
Una de las utilidades mas prácticas es que se puede crear cadenas de usuario (user chains) para coincidencias mas complejas y ciertamente útiles.
Para un ejemplo simple, supongamos que se desea aceptar el tráfico para ssh desde dos hosts y denegar el resto. Se puede lograr con
# iptables -A INPUT -s [direccion1] -p tcp --dport ssh -j ACCEPT# iptables -A INPUT -s [direccion2] -p tcp --dport ssh -j ACCEPT# iptables -A INPUT -p tcp --dport 22 -j DROP
Si se necesita una regla adicional, como por ejemplo, el puerto 80, para estos mismos hosts, son 3 comandos más. Así, suma y sigue cuando se requieren puertos adicionales bajo la misma regla.
Para ahorrar tecleos, se puede crear una regla de usuario, con un nombre arbitrario (menos los nombres de las cadenas ya existentes)
# iptables -N control# iptables -A control -s [direccion1] -j ACCEPT# iptables -A control -s [direccion2] -j ACCEPT# iptables -A control -j DROP
Y luego, para agregar a las reglas de entrada
# iptables -A INPUT -p tcp --dport ssh -j control
La opción “-j control” permite que las cadena recién creada se ejecute al momento que la coincidencia ocurra. En este caso, permitir el trafico TCP por el puerto 22, pero la acción a realizar es la cadena de usuario “control”, verificando que se permita el trafico desde dos direcciones únicamente, denegando la conexión desde el resto.
Así, se puede tener reglas mas complejas, para mayor control.
3.4 Acciones por defecto
Las cadenas básicas pueden tener acciones por defecto. Para eso se usa -P. No funciona con las cadenas de usuario.
Por ejemplo
# iptables -P INPUT DROP
indica que todas las conexiones en la cadena INPUT serán descartadas.