
Estoy luchando con un problema de firewall en mi servidor Centos.
Tengo la siguiente configuración que, cuando la uso con un reinicio del servicio iptables e intento conectarme por ssh al servidor con PuTTY, no puedo acceder al servidor; solo aparece un error de tiempo de espera de conexión.
Sin embargo, cuando dejo la línea REJECT final, puedo hacerlo.
Abrí los puertos para ssh, es decir, el puerto 22. ¿Qué estoy haciendo mal? ¿Estoy cometiendo un error de novato? Cualquier ayuda sería apreciada.
*filter
:INPUT ACCEPT [5:9090]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3:372]
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 10050 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 10051 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 10051 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 10050 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -m comment --comment \" ssh port\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT -m comment --comment \" email\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT -m comment --comment \" DNS large queries\"
-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT -m comment --comment \" DNS small queries\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -m comment --comment \" Apache\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT -m comment --comment \" POP3\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -m comment --comment \" Apache ssl\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 953 -j ACCEPT -m comment --comment \" DNS Internal\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT -m comment --comment \" imaps\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3128 -j ACCEPT -m comment --comment \" Squid\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT -m comment --comment \" MySQL\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT -m comment --comment \" Jenkins\"
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9090 -j ACCEPT -m comment --comment \" Pmta\"
-A INPUT -m set --match-set blacklist src -j DROP -m comment --comment \"IPSET drop ips on blacklist\"
-A INPUT -p tcp --dport 8080 -j SET --add-set blacklist src
-A INPUT -i ${PREFIX} -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP -m comment --comment \"Deny all null packets\"
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP -m comment --comment \"Deny all recon packets\"
-A INPUT -p tcp --tcp-flags ALL FIN -j DROP -m comment --comment \"nmap FIN stealth scan\"
-A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP -m comment --comment \"SYN + FIN\"
-A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP -m comment --comment \"SYN + RST\"
-A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP -m comment --comment \"FIN + RST\"
-A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP -m comment --comment \"FIN + URG + PSH\"
-A INPUT -p tcp --tcp-flags ALL URG,ACK,PSH,RST,SYN,FIN -j DROP -m comment --comment \"XMAS\"
-A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP -m comment --comment \"FIN without ACK\"
-A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP -m comment --comment \"PSH without ACK\"
-A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP -m comment --comment \"URG without ACK\"
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP -m comment --comment \"Deny SYN flood attack\"
-A INPUT -m state --state ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT -m comment --comment \"Accept traffic with ESTABLISHED flag set (limit - DDoS prevent)\"
-A INPUT -m state --state RELATED -m limit --limit 50/second --limit-burst 50 -j ACCEPT -m comment --comment \"Accept traffic with RELATED flag set (limit - DDoS prevent)\"
-A INPUT -m state --state INVALID -j DROP -m comment --comment \"Deny traffic with the INVALID flag set\"
-A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW -m limit --limit 30/minute --limit-burst 200 -j ACCEPT -m comment --comment \"Protection DDoS attacks\"
-A INPUT -j REJECT -m comment --comment \"Close up firewall. All else blocked.\"
COMMIT
Respuesta1
Está utilizando el módulo reciente para mantener dinámicamente una lista de direcciones IP para cada intento de conexión al puerto 22 y rechazar las IP que intentan conectarse más de 4 veces en un minuto o que usan TTL cambiantes (nota: esta última verificación podría causar problemas a las conexiones legítimas). también en algunos casos).
Sin embargo, lo está haciendo mal porque no los está agregando a ninguna parte de una lista utilizando una regla anterior que contenía una --set
opción. Por lo tanto, su regla que utiliza el --update
objetivo devuelve falso cada vez que está probando con una lista vacía llamada SSH
y los paquetes eventualmente se descartan mediante su última regla, por lo que ACK
el servidor descarta el último paquete del protocolo de enlace de tres vías.
En su lugar, estás buscando algo como esto:
-A INPUT -m recent --update --name SSH --seconds 60 --hitcount 5 --rttl -j DROP
-A INPUT -i <iface> -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
Estas deberían ser las únicas reglas relacionadas con SSH, y iptables las debe analizar en este orden cuando encuentre una coincidencia (es decir, elimine la regla con el comentario "puerto ssh" y asegúrese de que se respete el orden).
También una nota global: está intentando rechazar patrones de ataque TCP comunes, pero lo hace después de muchas reglas. Deberías mover esto arriba: significa pruebas inútiles antes de descartar paquetes. Cree cadenas personalizadas para mayor claridad si es necesario.