iptables es un cortafuegos por defecto que viene preinstalado en la práctica mayoría de las distribuciones Linux a partir de la versión 2.4 del núcleo. Es una herramienta que gestiona las conexiones que entran, vienen o pasan por el sistema operativo. Por tanto, es considerado un firewall muy versátil que puede ser utilizado para gestionar todas las conexiones que se hagan en el ordenador.
iptables tiene soporte tanto para el protocolo IPv4 como para el protocolo IPv6. Para diferenciar cuál es cual, IPv4 usa el comando iptables y IPv6 utiliza el comando ip6tables.
¿Qué puede hacer iptables?
Para definir correctamente todas las reglas de las que nos provee iptables, haremos una pequeña introducción sobre los tipos de órdenes que maneja el cortafuegos. (Entre paréntesis viene la opción que usa cada tipo)
Tipo de paquetes de datos (- A)
- INPUT: Paquetes que llegan a nuestra máquina
- OUTPUT: Paquetes que salen de nuestra máquina
- FORWARD: Paquetes que pasan por nuestra máquina
- eth0, eth1, wlan0, ppp0... toda interfaz que tenga un sistema Linux
IP origen y destino de los paquetes (-s = source, -d = destination)
Puede ser una IP concreta o un rango de direcciones IP acompañado de su CIDR. Ejemplos:
- 192.168.1.33 (concreta)
- 172.16.1.0/24 (rango de IP)
Protocolo de los paquetes (-p = protocol)
- TCP,
- UDP
- ICMP
- PREROUTING (Filtrar antes de enrutar)
- POSTROUTING (Filtrar después de enrutar)
¿Cómo se usa iptables? ¿Qué configuraciones puedo hacer en el mismo?
iptables es utilizado, en su amplia mayoría de casos, para filtrar las conexiones que se realizan en ordenadores Linux que son utilizados como servidores y routeres entre redes. iptables puede:
- Denegar o aceptar conexiones:
- Parcialmente, desactivando y activando algunos puertos o protocolos, el tráfico ICMP de ping.
- Totalmente, habilitando o deshabilitando el acceso a equipos con una determinada dirección de red, subred, o dirección física MAC, y dando acceso total a todo, o quitándolo.
- Utilizar tablas NAT de enrutamiento para enrutar entre dos interfaces de red enchufadas en el sistema Linux. (NOTA: debes activar el ipforward del sistema para conseguir que funcione)
- Si se dispone de la aplicación de red Wireshark se puede monitorizar y listar aún mejor las entradas y salidas de iptables, además de que la propia aplicación dispone de tablas de listado.
- Firewall de un ordenador o servidor.
- Un modelo "global" de router y firewall. (O bien, podéis ir a la entrada de usar un CentOS como router y observar algunos ejemplos ya realizados para ver cómo se usa)
El modelo básico para hacer cualquier configuración es:
- Borramos las anteriores reglas y ponemos todo el iptables a 0: Antes de realizar ninguna instrucción, lo recomendable es borrar toda la
configuración anterior de iptables, para que no interfieran antiguas
restricciones con las nuevas.
- Si nuestro ordenador va a ser router entre redes, configurar la NAT: Configuraremos las tablas NAT de cero para que no haya ningún problema en la implementación.
- Abrir o cerrar puertos y protocolos específicos: Para "rizar más el rizo" en la configuración, en caso de que necesitemos hacerlo.
Ejemplos de uso de iptables
-------------------------------------------------------------------------------------------------------------------------------------
Como Firewall en un solo ordenador/servidor:
El escenario será el siguiente:
Tenemos un servidor, por el cual debido a recientes implementaciones (Como un servidor FTP o un servicio HTTP) queremos que el resto de ordenadores se conecten al mismo. Sin embargo, queremos también que no se tenga libre albedrío y queremos cerrar y abrir una serie de puertos.
Para este ejemplo, tenemos implementado un servidor HTTP y un FTP, y queremos rechazar las conexiones por TELNET y aceptar solamente las que entran por SSH. La red será 192.168.1.0/24 y nuestro servidor tiene como IP la primera del rango.Además, no queremos que un determinado ordenador se conecte, y como va todo el rato cambiando direcciones IP para sortear el baneo, hay que cerrarlo directamente por su dirección física, que es 01:23:45:ab:cd:ef
Para configurar correctamente el iptables, haremos los dos primeros pasos del modelo: Borrado de las reglas anteriores e implementación de las que queramos poner:
1. Borrado de las reglas anteriores
Borra las anteriores reglas de iptables.
# iptables -F
Igual que la anterior, pero más rematada.
# iptables -X
Pone el contador de paquetes totales del iptables a cero.
# iptables -Z
2. Establecemos las políticas de denegación y aceptación de puertos y servicios.
Comenzamos con aceptar los tipos de paquetes que manejará el firewall, que son de entrada y de salida.
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
Aceptamos la entrada de localhost.
# iptables -A INPUT -i lo -j ACCEPT
Comenzamos primeramente cerrando todos los puertos establecidos (Del 1 al 1024)
# iptables -A INPUT -i eth0 -p tcp --dport 1:1024 -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 1:1024 -j DROP
Ahora establecemos las políticas de entrada.
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 20 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
De forma auxiliar, también aceptamos los puertos esenciales para la conexión (DHCP y DNS)
DNS:
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p udp --dport 53 -j ACCEPT
DHCP:
# iptables -A OUTPUT -s 192.168.1.0/24 -p udp --dport 67 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p udp --dport 68 -j ACCEPT
Rechazamos el puerto de Telnet.
# iptables -A INPUT -i eth0 -p udp --dport 23 -j ACCEPT
Y para acabar, rechazamos la dirección física de ordenador tan molesto:
# iptables -A INPUT -m mac --mac-address 01:23:45:ab:cd:ef -j DROP
Por último, guardamos la configuración:
# iptables-save
-------------------------------------------------------------------------------------------------------------------------------------
Como Firewall principal entre dos redes.
El escenario actual será siguiente:
Tenemos un ordenador con un sistema Linux que sirve de firewall. El mismo sistema tiene 3 interfaces referentes a:
- eth0: Internet, salida directa.
- eth1: Una red que contenga X ordenadores y que necesita Internet.
Dirección de red: 192.168.0.0/24
Dirección IP en la interfaz: 192.168.0.1/24 - eth2: Un DMZ (Red desmilitarizada, con acceso total)
Dirección de red: 192.168.1.0/24
Dirección IP en la interfaz: 192.168.1.1/24
En eth2 queremos que se tenga acceso total, debido a su forma de ser una red desmilitarizada.
Para configurar correctamente el iptables, seguiremos un orden concreto: Borramos anteriores reglas, iniciamos la NAT y filtramos todo.
1. Borrado de las reglas definidas.
Borra las anteriores reglas de iptables.
# iptables -F
Igual que la anterior, pero más rematada.
# iptables -X
Borra las reglas establecidas en la tabla NAT.
# iptables -t NAT -F
Pone el contador de paquetes totales del iptables a cero.
# iptables -Z
2. Inicializamos las políticas de filtrado
# iptables -P INPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P PREROUTING ACCEPT
# iptables -P POSTROUTING ACCEPT
Aceptamos el tráfico de localhost, para que no nos dé error.
# iptables -A input -i lo -j ACCEPT
3. Iniciamos NAT
Después de poner el ip forward a 1, debemos implementar la siguiente regla:
# iptables -t NAT -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# iptables -t NAT -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
(A partir de aquí no tocaremos más la red 192.168.1.0/24, ya que lo que quería era acceso total)
4. Establecemos el resto de reglas de filtrado y denegación.
Primeramente rechazamos el tráfico de ambas redes al mismo firewall (para evitar que alguien toquetee)
# iptables -A INPUT -s 192.168.0.0/24 -i eth1 -j REJECT
# iptables -A INPUT -s 192.168.1.0/24 -i eth2 -j REJECT
En la red 192.168.0.0:
Aceptar el tráfico de HTTP y HTTPS.
# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 80 -j ACCEPT
# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 443 -j ACCEPT
Aceptar el tráfico de Telnet y SSH.
# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 22 -j ACCEPT
# iptables -A FORWARD -s 192.168.1.0/4 -p udp --dport 23 -j ACCEPT
Rechazamos el tráfico del puerto 6680.
# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 6680 -j DROP
# iptables -A FORWARD -s 192.168.1.0/4 -p udp --dport 6680 -j DROP
Después de realizar todas estas reglas, salvamos.
# iptables-save
-------------------------------------------------------------------------------------------------------------------------------------
Fuentes:
Experiencia propia.
Redes de Área local, aplicaciones y servicios Linux. Ministerio de Educación (Material docente)
Diversas entradas ya hechas de aquí manejando iptables.