La idea de crear un “torniquete” en un firewall, es permitir que el trafico que sale de tu máquina salga al exterior y obtenga respuesta, sin embargo cualquier trafico entrante que no ha sido generado por usted, sea denegado. En la práctica, permite comunicacion con origen “unidireccional”.
La regla es simple y es ideal para quienes tienen maquinas linux como estacion de trabajo y no quieren que nadie intente ingresar a ellos, pero tampoco tienen ningún servicio a la escucha (servidores web, ftp, ssh, etc).
Las lineas son simples
iptables -F
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
Con eso quedas tras un torniquete.
¿Y si tengo un SSH funcionando?
Simple,
iptables -F
iptables -P INPUT DROP
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
Con eso permites el acceso desde el exterior al puerto 22 (Puerto por defecto SSH)
Explicación Humana
Iptables verifica el estado de las conexiones, por lo tanto deja solo pasar las conexiones ya establecidas desde el interior al exterior y las conexiones nuevas que sean especificadas en forma explicita, como en el ejemplo SSH.
Explicación Marciana
Las conexiones TCP, UDP entre otras, poseen flags de conexión previa ( tcp => syn, synack y ACK ), basandose en propiedades como esta, el módulo state verifica la conexión segun su estado (obvio).
La política por defecto de OUTPUT es ACCEPT, por lo tanto cuando un cliente intenta establecer una conexión nueva desde el interior o un desktop, esta es permitida. Una vez establecida la conexión, las respuestas son acceptadas porque asi está especificado en la regla. Por el contrario, cuando una persona intenta establecer una conexión nueva desde el exterior hacia la máquina, esta es denegada, porque la politica por defecto INPUT es DROP.
Observación
Esto está pensado para el usuario simple que no tiene mucha experiencia en iptables, que no corre servicios en su maquina de trabajo local y quiere poner un firewall simple sin complicarse demasiado con reglas y estar abriendo puertos.
Estas reglas deben ser puestas dentro de un SCRIPT y este programado para que arranque cada vez que inicie el equipo.