¿Negar todas las conexiones entrantes con iptables?

17

Quiero hacer algunas reglas simples de iptables para negar todas las conexiones entrantes y permitir salientes. ¿Cómo puedo hacer eso?

polígloto
fuente

Respuestas:

25

Pruebe esto con acceso de root:

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Tenga en cuenta que esto cortará brutalmente todas las conexiones en ejecución ; esto incluye cosas como la conexión SSH que puede usar para administrar el servidor. Solo use esto si tiene acceso a una consola local.

Vea la respuesta de Miphix para saber cómo agregar una excepción para SSH.

Yohann
fuente
2
Cuando hago la primera línea de tu regla, me desconecté de SSH
holms
77
La pregunta es "negar todas las conexiones entrantes" y no "negar todas las conexiones entrantes excepto SSH" :)
Yohann
Leí la advertencia de @holms sobre la primera regla demasiado tarde ...
DenisKolodin
Tenga en cuenta que esto no tiene ningún efecto sobre el tráfico ipv6. Lea mi respuesta a continuación si tiene habilitado ipv6.
bhelm
13

Si está trabajando de forma remota a través de SSH, es posible que desee agregar esto (lo -Iinserta antes de todas las demás reglas INPUT):

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

Si su servicio SSH está escuchando en otro puerto, tendrá que usar ese puerto en lugar de 22.

De lo contrario, podría perder accidentalmente el acceso.

Miphix
fuente
2

¡Tenga en cuenta que las otras respuestas no cubren IPv6! Si su sistema acepta tráfico IPv6, no se aplicará una sola regla de iptables al tráfico ipv6.

en lugar de usar iptables / ip6tables directamente, recomiendo usar iptables-restore y save. Estas herramientas permiten especificar una configuración de iptables con múltiples reglas y cargarla fácilmente con un comando.

crear un archivo (lo llamé iptables.rules) con el siguiente contenido:

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# commit changes
COMMIT

Tenga en cuenta que he agregado algunos ejemplos adicionales si desea permitir ICMP y el tráfico a puertos específicos.

ahora puedes cargarlo con estos comandos:

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

Ahora sus reglas cubren también ipv6 y son fáciles de administrar.

Nota adicional para los usuarios de Debian: si está satisfecho con sus reglas, puede apt install iptables-persistenthacerlo para que las reglas se restablezcan después del reinicio. Las reglas no se guardan automáticamente al apagar, por lo tanto, ejecute netfilter-persistent savepara actualizar las reglas persistentes.

bhelm
fuente
1

Ambas respuestas anteriores de alguna manera son correctas, pero no son lo suficientemente precisas para originar la respuesta. (Lo siento, no tengo suficiente reputación para agregar comentarios, por lo que escribo una respuesta completa).

En mi caso, me encontré con un servidor apache sobrecargado, sobrecargado con trabajos cron, uso excesivo de la CPU. Los límites de los hilos se almacenaron en la base de datos SQL, pero cumplí con el límite de sus conexiones. Quería limitar las conexiones de Apache entrantes del host local (esta parte es opcional), pero mantener todas las demás conexiones posibles. Incluidos los que realmente se establecieron.

Lo hice con comando

sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT

Significa: para cada paquete tcp entrante en el puerto 80, cargue el statemódulo y, si este es el primer paquete (conexión entrante), rechazarlo. Para localhost puedes usar-s 127.0.0.0/8

Y para el uso en el mundo real, en algunos casos puede agregar 'NO VÁLIDO' a los estados NEW,INVALID, ya que uno puede enviar paquetes "maliciosos", intentando saltear su regla. Y también reemplace con -j DROPpara guardar su tráfico saliente (no enviará baliza de rechazo)

Offenso
fuente