iptables
es una herramienta poderosa de administración de firewall en Linux que permite configurar reglas para el filtrado y manipulación de paquetes de red. Está diseñada para controlar el tráfico de entrada, salida y reenvío entre redes. Se puede utilizar para definir reglas que determinen cómo deben manejarse los paquetes de red según diversos criterios, como direcciones IP, puertos y protocolos.
Estructura básica de iptables
La estructura general de un comando iptables
es la siguiente:
iptables [opciones] [cadena] [criterios de coincidencia] [objetivo]
- [opciones]: Controlan aspectos del comportamiento del comando.
- [cadena]: Define la tabla y la cadena donde se aplicarán las reglas (por ejemplo, INPUT, OUTPUT, FORWARD).
- [criterios de coincidencia]: Especifica las condiciones que deben cumplir los paquetes para que la regla se aplique.
- [objetivo]: Define la acción a realizar (ACCEPT, DROP, REJECT, etc.).
Tablas y Cadenas
iptables
trabaja con varias tablas que contienen diferentes cadenas, cada una con una función específica:
- Tablas principales:
- filter: Es la tabla por defecto, utilizada para filtrar el tráfico de red.
- nat: Maneja la traducción de direcciones de red (NAT).
- mangle: Modifica los encabezados de los paquetes.
- raw: Desactiva el seguimiento de conexiones para ciertos paquetes.
- Cadenas comunes:
- INPUT: Regula el tráfico entrante dirigido al propio sistema.
- OUTPUT: Controla el tráfico que sale desde el sistema.
- FORWARD: Gestiona el tráfico que pasa a través del sistema (por ejemplo, en un router).
- PREROUTING: Modifica los paquetes antes de ser enrutados.
- POSTROUTING: Modifica los paquetes después de ser enrutados.
Opciones más utilizadas de iptables
- -A: Añade una nueva regla al final de una cadena.
- -D: Elimina una regla de una cadena.
- -L: Lista las reglas actuales de una cadena.
- -F: Limpia todas las reglas de una cadena o tabla.
- -P: Establece la política por defecto para una cadena.
- -t: Especifica la tabla que se utilizará (por defecto es "filter").
- -i: Especifica la interfaz de red de entrada.
- -o: Define la interfaz de red de salida.
- -s: Establece la dirección IP de origen.
- -d: Define la dirección IP de destino.
- -p: Especifica el protocolo (TCP, UDP, ICMP).
- --sport: Define el puerto de origen.
- --dport: Define el puerto de destino.
- -j: Especifica el objetivo o acción (ACCEPT, DROP, REJECT, LOG).
Ejemplos de uso de iptables
1. Permitir tráfico SSH (puerto 22)
Para permitir el tráfico SSH entrante en un servidor, puedes usar:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Esta regla permite conexiones TCP en el puerto 22 (el puerto por defecto para SSH) desde cualquier dirección IP.
2. Bloquear todo el tráfico entrante
Si quieres bloquear todo el tráfico entrante excepto las conexiones que ya han sido establecidas:
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Aquí, la primera línea establece la política por defecto para la cadena INPUT en "DROP", mientras que la segunda permite las conexiones establecidas y relacionadas.
3. Permitir tráfico HTTP y HTTPS
Para permitir tráfico web en los puertos 80 (HTTP) y 443 (HTTPS):
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Esto permitirá el tráfico hacia un servidor web en los puertos típicos de HTTP y HTTPS.
4. Redireccionar tráfico en un servidor NAT
Si tu servidor actúa como un router y quieres redirigir todo el tráfico de una red local a través del servidor, usa la siguiente regla de NAT:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Esta regla aplica el enmascaramiento de direcciones IP en la interfaz "eth0", permitiendo que el tráfico de la red interna sea redirigido a Internet.
5. Bloquear una dirección IP específica
Para bloquear el tráfico desde una dirección IP específica, por ejemplo, 192.168.1.100:
iptables -A INPUT -s 192.168.1.100 -j DROP
Esto evitará que cualquier tráfico de esa dirección IP llegue al servidor.
6. Registrar intentos de acceso a un puerto bloqueado
Si deseas registrar intentos de acceso no autorizado en un puerto específico (por ejemplo, puerto 22):
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "
iptables -A INPUT -p tcp --dport 22 -j DROP
La primera línea registra los intentos de conexión al puerto SSH en el archivo de registro del sistema, mientras que la segunda línea bloquea esos intentos.
Guardar y restaurar configuraciones de iptables
Las reglas de iptables
no son persistentes por defecto, por lo que se deben guardar manualmente para que se mantengan después de un reinicio del sistema. Aquí es donde entran en juego herramientas como iptables-save
, iptables-restore
y métodos para hacer copias de seguridad de las reglas.
Uso de iptables-save
y iptables-restore
Guardar las reglas actuales con iptables-save
El comando iptables-save
exporta las reglas actuales de iptables
a un formato legible, que puede ser almacenado en un archivo para su posterior restauración.
Para guardar todas las reglas en un archivo, ejecuta:
iptables-save > /ruta/al/archivo/iptables.rules
Por ejemplo:
iptables-save > /etc/iptables.rules
Esto guardará las reglas actuales en el archivo /etc/iptables.rules
.
Restaurar las reglas con iptables-restore
Para restaurar las reglas desde un archivo previamente guardado con iptables-save
, utiliza iptables-restore
:
iptables-restore < /ruta/al/archivo/iptables.rules
Por ejemplo:
iptables-restore < /etc/iptables.rules
Este comando cargará las reglas desde el archivo y reemplazará las reglas actuales de iptables
.
Automatizar la restauración de reglas al inicio del sistema
Para asegurarte de que las reglas de iptables
se restauren automáticamente al reiniciar el sistema, puedes agregar el comando iptables-restore
a un script de inicio o al archivo /etc/rc.local
(si está disponible en tu distribución).
Por ejemplo, puedes agregar la siguiente línea al archivo /etc/rc.local
:
iptables-restore < /etc/iptables.rules
Asegúrate de que el archivo de reglas (/etc/iptables.rules
) sea accesible y legible por el sistema durante el inicio.
Copias de seguridad de las reglas de iptables
con iptables-backup
Aunque no existe un comando específico llamado iptables-backup
, puedes realizar copias de seguridad de las reglas de iptables
utilizando iptables-save
. Este método es esencialmente una forma de respaldar tus reglas actuales.
Crear una copia de seguridad
Para crear una copia de seguridad con marca de tiempo, puedes utilizar:
iptables-save > /ruta/de/respaldo/iptables-backup-$(date +%F).rules
Por ejemplo:
iptables-save > /backups/iptables-backup-$(date +%F).rules
Esto creará un archivo de respaldo con la fecha actual, facilitando el seguimiento de diferentes versiones de tus reglas de firewall.
Restaurar desde una copia de seguridad
Para restaurar las reglas desde una copia de seguridad específica, utiliza iptables-restore
de la misma manera:
iptables-restore < /ruta/de/respaldo/iptables-backup-YYYY-MM-DD.rules
Reemplaza YYYY-MM-DD
con la fecha correspondiente al archivo de respaldo que deseas restaurar.
Conclusión
iptables
es una herramienta robusta que permite el control total sobre el tráfico de red en un sistema Linux. Además de configurar reglas personalizadas para mantener la seguridad y gestionar el tráfico de tu red, es crucial entender cómo guardar, restaurar y respaldar estas reglas para asegurar que tu configuración se mantenga consistente y se pueda recuperar en caso de cambios no deseados o fallas del sistema.
Utilizando iptables-save
y iptables-restore
, puedes gestionar eficientemente tus reglas de firewall, asegurando que se apliquen automáticamente al iniciar el sistema y que puedas restaurarlas fácilmente desde copias de seguridad en caso necesario.