Implementar Cortafuegos con IpTables en Linux
Para los paranoicos, explico un modo muy simple de implementar iptables con el fin de cerrar todos los puertos que queramos de nuestro pc. Iptables es un sistema firewall muy potente incluido en el núcleo de Linux y que requiere una serie de conocimientos. Hay cientos de tutoriales en la red. Es aconsejable no setear iptables con cualquier script copiado de la red, puesto que iptables está capacitado para dejar tu sistema como se dice en román paladino abierto de piernas (desconozco si el script se hay puesto aquí es bueno o te valdrá a tí... esto es un wiki colectivo y cada red es diferente!!!). Podemos buscar otros scripts muy completos e información del funcionamiento de iptables en el manual del autoren bulma.net, aquí (inglés) y aquí (inglés), o preguntandole a google. No obstante me voy a centrar en alguien que puede ser un usuario normal y que desea lo siguiente:
- Cerrar todos los puertos de entrada
- Navegar por internet
- Permitir el acceso a internet de cualquier aplicación que él inicie.
- Permitir la libre navegación de la LAN de confianza si la tiene
En primer lugar instalamos el paquete iptables:
$ sudo apt-get install -test iptables
Ésto nos activará el servicio por defecto. Sólo queda implementar el script de iptables con nuestras reglas y hacer que se carguen al inicio.
El script que yo tengo, sin entrar en detalles viene a ser algo así, muy sencillo:
#!/bin/bash
#-s Especifica una dirección de origen
#-d Especifica una dirección de destino
#-p Especifica un prototocolo
#-i Especifica un interface de entrada
#-o Especifica un interface de salida
#-j Especifica la acción a ejecutar sobre el paquete
#--sport Puerto de origen
#--dport Puerto de destino
#Borrar todas las reglas
iptables -F
#Politica general.Cerramos todo.Dejamos entrar y salir lo solicitado
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
###OTRAS PROTECCIONES####
# Quitamos los pings.
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
# No respondemos a los broadcast.
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Para evitar el spoofing nos aseguramos de que la dirección
# origen del paquete viene del sitio correcto.
for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do
/bin/echo "1" > ${interface}
done
# Los ICMPs redirigidos que pueden alterar la tabla de rutas.
for interface in /proc/sys/net/ipv4/conf/*/accept_redirects; do
/bin/echo "0" > ${interface}
done
# No guardamos registros de los marcianos.
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
# Asegurar, aunque no tenga soporte el nucleo, q no hay forward.
/bin/echo "0" > /proc/sys/net/ipv4/ip_forward
###Reglas de los puertos####
# Permitimos que se conecten a nuestro servidor web.
#iptables -A INPUT -m state --state NEW -p TCP --dport 80 -j ACCEPT
#Abrimos ssh a la red.
#iptables -A INPUT -s 172.26.0.3 -p TCP --dport 22 -j ACCEPT
#iptables -A INPUT -s 172.26.0.4 -p TCP --dport 22 -j ACCEPT
#iptables -A INPUT -s 172.26.0.5 -p TCP --dport 22 -j ACCEPT
#iptables -A INPUT -p TCP --dport 22 -j ACCEPT
# Permitimos la comunicación con el servidor dns
iptables -A INPUT -p UDP --dport 53 -j ACCEPT
iptables -A INPUT -p TCP --dport 53 -j ACCEPT
#Permitimos uso de ftp.
#iptables -A INPUT -p TCP --dport 21 -j ACCEPT
#Permitimos acceso pop3.
#iptables -A INPUT -p TCP --dport 110 -j ACCEPT
# Permitimos uso de smtp
#iptables -A INPUT -p TCP --dport 25 -j ACCEPT
#Permitimos acceso imap.
#iptables -A INPUT -p TCP --dport 143 -j ACCEPT
#iptables -A INPUT -p UDP --dport 143 -j ACCEPT
#Permitimos todo el trafico de la LAN
iptables -A INPUT -s 172.26.0.2 -j ACCEPT
iptables -A INPUT -s 172.26.0.4 -j ACCEPT
iptables -A INPUT -s 172.26.0.5 -j ACCEPT
#Dejamos a localhost, para mysql, etc..
iptables -A INPUT -i lo -j ACCEPT
Lógicamente las líneas van juntas. Sólo se aplican las líneas no comentadas con # , las otras son para mi servidor.
El fichero se puede llamar por ejemplo firewall.sh , debemos darle permisos de ejecución:
$ chmod +x firewall.sh
Ahora si aplicamos el script de este modo:
$ sudo sh firewall.sh
podemos ver la salida de iptables haciendo:
$ sudo iptables -L
que viene a ser algo así:
root@platas:/home/herje # iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT all -- glorioso anywhere
ACCEPT all -- minime anywhere
ACCEPT all -- placebo anywhere
ACCEPT all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
root@platas:/home/herje #
Sólo falta hacer que las reglas se carguen al inicio, para ello copiamos el script en /etc/init.d y lo ponemos por default:
$ sudo cp firewall.sh /etc/init.d/
$ sudo update-rc.d firewall.sh defaults
Y listo con esto tenemos nuestro firewall funcionando.
Tomado de: www.guia-ubuntu.org
Comentarios