我正在努力解决 Centos 服务器上的防火墙问题。
我有以下配置,当我将它与服务 iptables 重启一起使用并尝试使用 putty ssh 到服务器时,我无法访问服务器 - 我只是收到连接超时错误。
然而,当我省略最后的 REJECT 行时,我可以。
我已经打开了 ssh 端口,即端口 22。我做错了什么?我是不是犯了一个新手错误?任何帮助我都会很感激。
*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
答案1
您正在使用最近的模块动态维护到端口 22 的每个连接尝试的 IP 地址列表,并拒绝在一分钟内尝试连接超过 4 次或使用更改的 TTL 的 IP(注意:最后一次检查在某些情况下也会给合法连接带来麻烦)。
但是,您做错了,因为您没有使用包含选项的前一个规则将它们添加到列表中的任何位置--set
。因此,使用目标的规则--update
每次都会返回 false,因为您正在针对名为的空列表进行测试,并且数据包最终会被您的最后一条规则丢弃,因此三次握手的SSH
最后一个数据包会被服务器丢弃。ACK
你正在寻找类似的东西:
-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
这应该是唯一与 SSH 相关的规则,并且在找到匹配项时按此顺序由 iptables 进行解析(即删除带有注释“ssh port”的规则并确保遵守顺序)。
还有一个全局注意事项,您尝试拒绝常见的 TCP 攻击模式,但您是在制定大量规则之后才这样做的。您应该将其移到顶部:这意味着在实际丢弃数据包之前进行无用的测试。如果需要,请创建自定义链以提高清晰度。