Respuestas:
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 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.
¡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-persistent
hacerlo 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 save
para actualizar las reglas persistentes.
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)