(permitir tráfico entrante en puertos específicos) |
(bloquear tráfico) |
||
| Línea 96: | Línea 96: | ||
Tenemos permitido específicamente el tráfico tcp en los puertos ssh y web, pero como no tenemos bloqueado nada, todo el tráfico puede aun entrar. | Tenemos permitido específicamente el tráfico tcp en los puertos ssh y web, pero como no tenemos bloqueado nada, todo el tráfico puede aun entrar. | ||
| + | |||
| + | |||
| + | == Bloquear trafico == | ||
| + | |||
| + | Una vez que se toma la decisión de aceptar un paquete, ninguna regla más le afecta. Como las reglas que permiten el tráfico web y ssh vienen de antes, ya que nuestra regla de bloquear el tráfico viene después, podemos aun aceptar el tráfico que queramos. Todo lo que necesitamos hacer es poner la rela para bloquear todo el tráfico. | ||
| + | |||
| + | sudo iptables -A INPUT -j DROP | ||
| + | sudo iptables -L | ||
| + | |||
| + | Chain INPUT (policy ACCEPT) | ||
| + | target prot opt source destination | ||
| + | ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED | ||
| + | ACCEPT tcp -- anywhere anywhere tcp dpt:ssh | ||
| + | ACCEPT tcp -- anywhere anywhere tcp dpt:www | ||
| + | DROP all -- anywhere anywhere | ||
| + | |||
| + | Como no hemos espeficificado un interfaz o protocolo, cualquier tráfico de cualquier puerto en cualquier interfaz está bloqueado, excepto para web y ssh. | ||
== Enmascaramiento IP == | == Enmascaramiento IP == | ||
| |
Uno o más colaboradores están trabajando actualmente en extender esta página. Es posible que, a causa de ello, haya lagunas de contenido, deficiencias de formato o texto en otros idiomas. Por favor, antes de realizar correcciones mayores o reescrituras, contacta con ellos en su página de usuario o en la página de discusión del artículo para poder coordinar la redacción. |
El kernel Linux incluye el subsistema Netfilter, que es usado para manipular o decidir el destino del tráfico de red entre o a través de su red. Todas las soluciones firewall Linux modernas utilizan este sistema para el filtrado de paquetes.
El sistema de filtrado de paquetes del núcleo resulta de poca ayuda a los administradores si no se tiene una interfaz de usuario para gestionarlo. Éste es el proposito de Iptables. Cuando un paquete llega a su servidor, éste es gestionado por el subsistema Netfilter para aceptarlo, manipularlo o rechazarlo basándose en las reglas suministradas a éste via iptables. Así, iptables es todo lo que necesita para manejar su cortafuegos si está familiarizado con él, pero existen muchos interfaces de usuario disponibles para simplificar esta tarea., por ejemplo Firestarter
Contenido |
Escribiendo
sudo iptables -L
se listan las actuales reglas en iptables. Si acabas de instalar un servidor, aun no tendrás normas, así que deberías ver:
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Aquí se muestra una explicación de algunas de las opciones básicas que verás en éste artículo. No te preocupes si no entiendes todo ahora, pero recuerda vovler y mirar ésta lista si encuentras nuevas opciones después
Podemos también permitir sesiones establecidas para recibir el tráfico:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Se podría empezar por el bloqueo de tráfico, pero deberías estar trabajando a través de SSH, por lo que necesitas permitir SSH antes de bloquear todo lo demás.
Para permitir el tráfico SSH por el puerto por defecto (22), puedes decirle a iptables que permita a todo el tráfico TCP entrante por ese puerto.
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
Refiéndonos a la lista anterior, puedes ver que ésto le dice a iptables:
Vamos comprobar las reglas: (solo se muestra la primera linea, tu verás más)
sudo iptables -L
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Ahora, vamos a permitir todo el tráfico entrante
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Comprobando nuestras reglas, tenemos:
sudo iptables -L
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:www
Tenemos permitido específicamente el tráfico tcp en los puertos ssh y web, pero como no tenemos bloqueado nada, todo el tráfico puede aun entrar.
Una vez que se toma la decisión de aceptar un paquete, ninguna regla más le afecta. Como las reglas que permiten el tráfico web y ssh vienen de antes, ya que nuestra regla de bloquear el tráfico viene después, podemos aun aceptar el tráfico que queramos. Todo lo que necesitamos hacer es poner la rela para bloquear todo el tráfico.
sudo iptables -A INPUT -j DROP sudo iptables -L
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:www DROP all -- anywhere anywhere
Como no hemos espeficificado un interfaz o protocolo, cualquier tráfico de cualquier puerto en cualquier interfaz está bloqueado, excepto para web y ssh.
El propósito del Enmascaramiento IP (IP Masquerading) es permitir que máquinas con direcciones IP privadas no enrutables de una red accedan a Internet a través de la máquina que realiza el enmascaramiento. Se debe manipular el tráfico que va de su red privada con destino a Internet, para que las respuestas puedan encaminarse adecuadamente a la máquina que hizo la petición. Para ello, el núcleo debe modificar la dirección IP fuente de cada paquete de forma que las respuestas se encaminen hacia ella, en lugar de encaminarla hacia la dirección IP privada que hizo la petición, lo que resulta imposible en Internet. Linux usa Seguimiento de Conexión (Connection Tracking, conntrack) para llevar la cuenta de qué conexiones pertenencen a qué máquinas, y reencaminar adecuadamente cada paquete de retorno. El tráfico que sale de su red privada es, por consiguiente, «enmascarada» dando la sensación de que se ha originado en la máquina Ubuntu que hace de pasarela. Este proceso se denomina Compartición de Conexiones de Internet (Internet Connection Sharing) en la documentación de Microsoft.
Esto se puede conseguir con una sóla regla de iptables, que puede variar ligeramente en función de la configuración de su red:
sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE
La orden anterior supone que su espacio de direcciones privadas es 192.168.0.0/16 y que el dispositivo que conecta con Internet es ppp0. La sintaxis se descompone de la siguiente forma:
Cada cadena en la tabla de filtrado (la tabla predeterminada, y donde ocurren la mayoría de los filtrados de paquetes) tiene una política predeterminada de ACCEPT, pero si está creando un firewall además de un dispositivo de pasarela, debería establecer las políticas a DROP o REJECT, en cuyo caso necesitará habilitar su tráfico enmascarado a través de la cadena FORWARD para que la regla anterior funcione:
sudo iptables -A FORWARD -s 192.168.0.0/16 -o ppp0 -j ACCEPT sudo iptables -A FORWARD -d 192.168.0.0/16 -m state --state ESTABLISHED,RELATED -i ppp0 -j ACCEPT
Las órdenes anteriores permitirán todas las conexiones que vayan de su red local a Internet, así como el retorno a la máquina que las inició de todo el tráfico relacionado con esas conexiones.
Hay muchas herramientas disponibles que pueden ayudarle a construir un completo firewall sin necesidad de conocer iptables en profundidad. Para los que se inclinan por una solución gráfica, Firestarter es muy popular y fácil de usar, y fwbuilder es muy potente y tiene un aspecto familiar para aquellos administradores que hayan usado herramientas comerciales de firewall como Checkpoint FireWall-1. Si prefiere una utilidad de línea de órdenes con archivos de configuración en texto plano, Shorewall es una solución muy potente para ayudarle a configurar un firewall avanzado para cualquier red. Si su red es relativamente simple, o no dispone de red, ipkungfu le proporcionará un firewall funcional con desde el principio sin necesidad de configuración, y le permitirá crear fácilmente un firewall más avanzado editando archivos de configuración sencillos y bien documentados. Otra herramienta interesante es fireflier, diseñado para ser una aplicación firewall de escritorio. Está formada por un servidor (fireflier-server) y una selección de clientes GUI (GTK o QT), y se comporta de manera muy similar a muchas aplicaciones interactivas de firewall para Windows.
Los registros del firewall son esenciales para reconocer ataques, corregir problemas en las reglas de su firewall, y observar actividades inusuales en su red. Debe incluir reglas de registro en su firewall para poder activarlos, y las reglas de registro deben aparecer antes de cualquier otra regla final aplicable (una regla con un objetivo que decide el destino del paquete, como ACCEPT, DROP o REJECT). Por ejemplo,
sudo iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j LOG --log-prefix "NEW_HTTP_CONN: "
Una petición al puerto 80 desde la máquina local, por tanto, podría generar un registro en dmesg con el siguiente aspecto:
[4304885.870000] NEW_HTTP_CONN: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=58288 DF PROTO=TCP SPT=53981 DPT=80 WINDOW=32767 RES=0x00 SYN URGP=0
El registro anterior también aparecerá en /var/log/messages, /var/log/syslog y /var/log/kern.log. Este comportamiento se puede cambiar editando apropiadamente el archivo /etc/syslog.conf, o instalando y configurando ulogd y utilizando el objetivo ULOG en lugar del LOG. El demonio ulogd es un servidor en espacio de usuario, que escucha las instrucciones de registro que provienen del núcleo y que sean específicamente para firewalls, y puede registrar cualquier archivo que desee, o incluso a una base de datos PostgreSQL o MySQL. Se puede simplificar la interpretación del significado de los registros del firewall usando una herramienta de análisis de registros como fwanalog, fwlogwatch o lire.