Linux
在 iptables 防火牆配置中找不到錯誤
我正在努力解決我的 Centos 伺服器上的防火牆問題。
我有以下配置,當我將它與服務 iptables restart 一起使用時,我嘗試使用 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
您正在使用最近的模組動態維護每個連接嘗試到埠 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 攻擊模式,但您是在遵循很多規則之後才這樣做的。你應該把它移到最上面:這意味著在實際丟棄數據包之前進行無用的測試。如果需要,請創建自定義鏈以確保清晰。