Quiero hacer algunas reglas simples de iptables para negar todas las conexiones entrantes y permitir salientes. ¿Cómo puedo hacer eso?
17
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.
Si está trabajando de forma remota a través de SSH, es posible que desee agregar esto (lo
-I
inserta antes de todas las demás reglasINPUT
):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.
fuente
¡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:
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:
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-persistent
hacerlo para que las reglas se restablezcan después del reinicio. Las reglas no se guardan automáticamente al apagar, por lo tanto, ejecutenetfilter-persistent save
para actualizar las reglas persistentes.fuente
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
state
mó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 DROP
para guardar su tráfico saliente (no enviará baliza de rechazo)fuente