Actualizado el domingo, 19 junio, 2016
IPtables es un sistema de firewall vinculado al kernel de linux. Al contrario de lo que pueda parecer unas iptables no son como un servidor que lo iniciamos o detenemos, Ha habido alguna vulnerabilidad que a permitido un DdoS, pero siempre sera mas efectivo que las aplicaciones que escuchan en determinado puerto TCP. Iptables esta integrado con el kernel, es parte del sistema operativo. Podemos crear, modificar, borrar todo tipo de reglas, aquí propondremos unos ejemplos.
Reset iptables firewall rules
iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -F iptables -t nat -F
Ver el estado de tu firewall y listar reglas
Type the following command as root:
iptables -L -n -v iptables -n -L -v --line-numbers iptables -L INPUT -n -v iptables -L OUTPUT -n -v --line-numbers
Eliminar reglas de Firewall
iptables -L INPUT -n --line-numbers iptables -L OUTPUT -n --line-numbers iptables -L OUTPUT -n --line-numbers | less iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1
Se puede eliminar por número de regla
iptables -D INPUT 4
O especificar una regla que coincida
iptables -D INPUT -s 202.54.1.1 -j DROP
Establecer las políticas de firewall por defecto para eliminar todo el tráfico:
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -L -v -n
Sólo a bloquear el tráfico entrante
Para eliminar todos los paquetes entrantes / enviado, pero permitir el tráfico saliente, escriba:
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT iptables -L -v -n
Eliminar direcciones de red privada en la interfaz pública (Suponiendo eth1 como interfaz pública)
iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Bloquear IP:
iptables -A INPUT -s 192.168.1.5 -j DROP iptables -A INPUT -s 192.114.71.13 -j DROP
Guardar reglas:
iptables-save > /root/iptables.fw
En CentOS / RHEL / Fedora Linux,:
service iptables save
Restaurar reglas:
iptables-restore < /root/iptables.fw
Restaurar en CentOS / RHEL / Fedora Linux:
service iptables restart
Puedes recargar las reglas automáticamente al reiniciar el servidor:
vi /etc/rc.local
# Reload IPTABLES Rules automatically on restart /sbin/iptables-restore < /root/iptables.fw
En CentOS puedes guardar las reglas para recargarlas automáticamente:
/etc/sysconfig/iptables
Permitir todo el tráfico de loopback, y eliminar todo el tráfico a 127/8 que no usa lo0
iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
Eliminar cualquier paquete TCP que no se ha iniciado con el Flag SYN activo
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
Aceptar todas las conexiones entrantes establecidas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Eliminar cualquier paquete inválido que no pueda ser identificado
iptables -A INPUT -m state --state INVALID -j DROP Drop all inbound telnet traffic iptables -I INPUT -p tcp --dport 23 -j DROP Drop all outbound web traffic iptables -I OUTPUT -p tcp --dport 80 -j DROP Drop all outbound traffic to 192.168.0.1 iptables -I OUTPUT -p tcp --dest 192.168.0.1 -j DROP Allow all inbound web traffic iptables -I INPUT -p tcp --dport 80 -j ACCEPT Allow inbound port traffic for localhost iptables -I INPUT -s 12.0.0.1 -p tcp --dport 2003 -j ACCEPT Allow inbound HTTPS traffic from 10.2.2.4 iptables -I INPUT -s 10.2.2.4 -p tcp -m tcp --dport 443 -j DROP Deny outbound traffic to 192.2.4.0-192.2.4.255 iptables -I OUTPUT -d 192.2.4.6.0/24 -j DROP
Bloquear tráfico al dominio facebook.com, miramos la IP de facebook.com y luego su RANGO DE IPs
host -t a www.facebook.com whois 69.171.228.40 | grep CIDR
Creamos la regla para no permitir acceso
iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP
También por nombre de dominio, pero no es 100% efectivo.
iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP iptables -A OUTPUT -p tcp -d facebook.com -j DROP
Permitir conexiones entrantes al puerto 21 desde una la IP 11.22.33.44
iptables -A INPUT -p tcp -m state --state NEW --dport 21 --source 11.22.33.44
Permitir todo el tráfico entrante SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Permitir SSH saliente
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Permitir tráfico HTTP
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Permitir HTTPS saliente.
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
Combinar reglas con multipuerto
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
Denegar todas las conexiones entrantes al puerto 21.
iptables -A INPUT -p tcp -m state --state NEW --dport 21 -j DROP
Eliminar la primera regla de entrada
iptables -D INPUT 1
Bloquear o Permitir solicitud de ICMP Ping
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT /// A continuación sólo acepta tipo limitado de peticiones ICMP:
### ** assumed that default INPUT policy set to DROP ** ############# iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT iptables -A INPUT -p icmp –icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp –icmp-type time-exceeded -j ACCEPT
## ** all our server to respond to pings ** ## iptables -A INPUT -p icmp –icmp-type echo-request -j ACCEPT
Permitir ping de fuera hacia adentro
iptables -A INPUT -p icmp –icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp –icmp-type echo-reply -j ACCEPT
Permitir PING de dentro a fuera.
iptables -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT
Permitir tráfico DNS saliente.
iptables -A OUTPUT -p udp -o eth0 –dport 53 -j ACCEPT iptables -A INPUT -p udp -i eth0 –sport 53 -j ACCEPT
Abrir un rango de puertos de entrada
iptables -A INPUT -m state state NEW -m tcp -p tcp dport 7000:7010 -j ACCEPT
Abrir un rango de IPs
## only accept connection to tcp port 80 (Apache) if ip is between 192.168.1.100 and 192.168.1.200 ## iptables -A INPUT -p tcp destination-port 80 -m iprange src-range 192.168.1.100-192.168.1.200 -j ACCEPT
## nat example ## iptables -t nat -A POSTROUTING -j SNAT –to-source 192.168.1.20-192.168.1.25
%%% Restringir el número de conexiones concurrentes a un servidor por IP %%% Puedes utilizar el módulo connlimit para crear estas restricciones. Permitir 3 conexiones SSH por cliente:
iptables -A INPUT -p tcp syn dport 22 -m connlimit –connlimit-above 3 -j REJECT
Limitar el número de conexiones HTTP a 20:
iptables -p tcp syn dport 80 -m connlimit connlimit-above 20 connlimit-mask 24 -j DROP
Donde: * --connlimit-above 3 : Match if the number of existing connections is above 3. * --connlimit-mask 24 : Group hosts using the prefix length. For IPv4, this must be a number between (including) 0 and 32. %%% Eliminar o aceptar paquetes desde una MAC Address
iptables -A INPUT -m mac –mac-source 00:0F:EA:91:04:08 -j DROP
## *only accept traffic for TCP port # 22 from mac 00:0F:EA:91:04:07 * ## iptables -A INPUT -p tcpdestination-port 22 -m mac mac-source 00:0F:EA:91:04:07 -j ACCEPT
%%% Prevenir ataques DoS * -Limit 25/minute : Limita a sólo 25 conexiones por minuto. * -Limit-burst 100: Indica que el valor de limit/minute será forzado sólo después del número de conexiones en este nivel
iptables -A INPUT -p tcp dport 80 -m limit limit 25/minute –limit-burst 100 -j ACCEPT
%%% Permitir redirección de puertos. * Ejemplo puerto 422 redirigimos al 22, con lo que podemos tener conexiones al puerto 22 y al puerto 422 por ssh.
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 dport 422 -j DNAT to 192.168.102.37:22 iptables -A INPUT -i eth0 -p tcp dport 422 -m state state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcpsport 422 -m state state ESTABLISHED -j ACCEPT
Logar y eliminar paquetes:
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG –log-prefix «IP_SPOOF A: » iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Logar y eliminar paquetes limitando el número de entradas repetidas en el LOG
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit limit 5/m limit-burst 7 -j LOG –log-prefix «IP_SPOOF A: » iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Sacar en el log los paquetes caídos. * Primero creamos una cadena llamada LOGGING:
iptables -N LOGGING
Luego todas las conexiones entrantes vayan por la cadena LOGGING
iptables -A INPUT -j LOGGING
Logueamos paquetes con un log-prefix
iptables -A LOGGING -m limit limit 2/min -j LOG log-prefix «IPTables Packet Dropped: » –log-level 7
Y los bloqueamos:
iptables -A LOGGING -j DROP
%%% Listado de reglas ejemplo para puertos TCP/UDP comunes: * Replace ACCEPT with DROP to block port:
## open port ssh tcp port 22 ## iptables -A INPUT -m state state NEW -m tcp -p tcp dport 22 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state state NEW -p tcp dport 22 -j ACCEPT
## open cups (printing service) udp/tcp port 631 for LAN users ## iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp –dport 631 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp –dport 631 -j ACCEPT
## allow time sync via NTP for lan users (open udp port 123) ## iptables -A INPUT -s 192.168.1.0/24 -m statestate NEW -p udp dport 123 -j ACCEPT
## open tcp port 25 (smtp) for all ## iptables -A INPUT -m state state NEW -p tcp dport 25 -j ACCEPT
- open dns server ports for all ##
iptables -A INPUT -m state state NEW -p udp dport 53 -j ACCEPT iptables -A INPUT -m state state NEW -p tcpdport 53 -j ACCEPT
## open http/https (Apache) server port to all ## iptables -A INPUT -m state state NEW -p tcp dport 80 -j ACCEPT iptables -A INPUT -m state state NEW -p tcp dport 443 -j ACCEPT
## open tcp port 110 (pop3) for all ## iptables -A INPUT -m state state NEW -p tcp dport 110 -j ACCEPT
## open tcp port 143 (imap) for all ## iptables -A INPUT -m state state NEW -p tcp dport 143 -j ACCEPT
## open access to Samba file server for lan users only ## iptables -A INPUT -s 192.168.1.0/24 -m state state NEW -p tcp dport 137 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state state NEW -p tcp dport 138 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state state NEW -p tcp dport 139 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state state NEW -p tcp dport 445 -j ACCEPT
## open access to proxy server for lan users only ## iptables -A INPUT -s 192.168.1.0/24 -m state state NEW -p tcp dport 3128 -j ACCEPT
## open access to mysql server for lan users only ## iptables -I INPUT -p tcp –dport 3306 -j ACCEPT ///
Gracias por la info.