Firewall mínimo para servidor web
Acabo de configurar un VPS como servidor web, y estas son las reglas iptables con las que empiezo todo firewall, a partir de aquí voy añadiendo todos los servicios adicionales que se necesiten.
#!/bin/bash # Limpiar todas las reglas. iptables -F iptables -t nat -F iptables -t mangle -F # Creamos tabla para reglas de seguridad eth0 iptables -N security_eth0 iptables -F security_eth0 iptables -A INPUT -i eth0 -j security_eth0 # Admitimos todos los paquetes en interface loopback. iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Aceptamos todos los paquetes de conexiones ya establecidas iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Permitir todas conexiones HTTP entrantes iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW -j ACCEPT # Permitir todas conexiones SSH entrantes iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -j ACCEPT # Permitir conexiones SSH salientes (DESACTIVADO) # iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW -j ACCEPT # Permitir icmp (ping,....) iptables -A INPUT -p icmp -j ACCEPT iptables -A OUTPUT -p icmp -j ACCEPT # Permitir acceso DNS saliente iptables -A OUTPUT -p udp -o eth0 --dport 53 --sport 1024:65535 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 --dport 1024:65535 -j ACCEPT # Por defecto descartamos los paquetes no aceptados explicitamente iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # # Medidas de seguridad para paquetes entrantes eth0 # # echo 1 > /proc/sys/net/ipv4/tcp_syncookies # Descomentar la siguiente linea para desactivar la tabla security_eth0 # iptables -A security_eth0 -j RETURN # Ignoramos paquetes nuevos que no tengan flag SYN activado iptables -A security_eth0 -p tcp ! --syn -m state --state NEW -j DROP # Ignoramos paquetes invalidos iptables -A security_eth0 -m state --state INVALID -j DROP # Descartar paqueter fragmentados iptables -A security_eth0 -f -j DROP # Descartar paquetes XMAS iptables -A security_eth0 -p tcp --tcp-flags ALL ALL -j DROP # Descartart paquetes NULL iptables -A security_eth0 -p tcp --tcp-flags ALL NONE -j DROP # Descartar ip falsas (spoofing) iptables -A security_eth0 -s 0.0.0.0/8 -j DROP iptables -A security_eth0 -s 127.0.0.0/8 -j DROP iptables -A security_eth0 -s 10.0.0.0/8 -j DROP iptables -A security_eth0 -s 172.16.0.0/12 -j DROP iptables -A security_eth0 -s 192.168.0.0/16 -j DROP iptables -A security_eth0 -s 224.0.0.0/3 -j DROP
Este script bloquea todo tráfico entrante y saliente, excepto conexiones entrantes a los puertos html y ssh, el protocolo icmp, y las consultas DNS salientes. También crea la tabla security_eth0, donde se filtran todos los paquetes entrantes por eth0, para realizar algunos chequeos de seguridad.
Si no quieres añadir el script directamente a init.d, puedes introducir las reglas manualmente en el shell, y luego usar iptables-persistent para salvarlas.
$ sudo apt-get install iptables-persistent
Durante la instalación preguntará si quieres salvar las reglas de iptables, responde si, y serán salvadas en /etc/iptables/rules.v4 para ipv4, y /etc/iptables/rules.v6 para ipv6. Por último iniciamos el servicio:
$ sudo service iptables-persistent start