Linux
如何使用 iptables 臨時阻止一個 IP 地址在伺服器上造成過多的點擊?
這是我在這裡的第一個問題。
我製作了這個跟隨腳本來保護我的伺服器免受 Slowloris 和一些 DDOS 的攻擊。
#!/bin/sh # It does not allow more than 10 connections per IP on ports 80 and 443. And log it. # Except when the IP comes from 123.456.789.000 /sbin/iptables -A INPUT -p tcp --syn --dport 80 ! -s 123.456.789.000 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLOCK ATTACK: " --log-level 6 /sbin/iptables -A INPUT -p tcp --syn --dport 80 ! -s 123.456.789.000 -m connlimit --connlimit-above 10 -j REJECT --reject-with tcp-reset /sbin/iptables -A INPUT -p tcp --syn --dport 443 ! -s 123.456.789.000 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLOCK ATTACK HTTPS: " --log-level 6 /sbin/iptables -A INPUT -p tcp --syn --dport 443 ! -s 123.456.789.000 -m connlimit --connlimit-above 10 -j REJECT --reject-with tcp-reset
第一個問題:正確嗎?會按我的意願工作嗎?
第二個問題:如果–connlimit-above 10發生 3 次,我如何調整此 iptables 程式碼以臨時阻止 IP ?
注意:我知道fail2ban,但我想使用iptables。而且我想使用connlimit,而不僅僅是計算伺服器上的點擊次數。
我嘗試了幾種方法來做到這一點,Google搜尋太多,我失敗了:(
回答我自己的問題,經過大量工作和研究,我為 iptables 創建了這個腳本:
#!/bin/sh /sbin/iptables -N BLOCK_IP /sbin/iptables -N SYN_CHECK /sbin/iptables -N DOS_CHECK /sbin/iptables -N SYN_ATTACK /sbin/iptables -N DOS_ATTACK # # first checks if the IP is already blocked /sbin/iptables -A INPUT -j BLOCK_IP # drop if is blocked /sbin/iptables -A BLOCK_IP -p tcp -m multiport --dport 80,443 -m recent --name BlockedIP --rcheck --seconds 60 -j DROP /sbin/iptables -A BLOCK_IP -p udp -m multiport --dport 80,443 -m recent --name BlockedIP --rcheck --seconds 60 -j DROP # if already pass the time unblock the IP /sbin/iptables -A BLOCK_IP -p tcp -m multiport --dport 80,443 -m recent --name BlockedIP --remove -j RETURN /sbin/iptables -A BLOCK_IP -p udp -m multiport --dport 80,443 -m recent --name BlockedIP --remove -j RETURN # # check: if there is more than 20 simultaneous connections with SYN status - ignores IP Varnish Cache /sbin/iptables -A INPUT -p tcp -m multiport --dport 80,443 --syn ! -s 123.456.789.000 -m connlimit --connlimit-above 20 -j SYN_CHECK # check: hit and then connect frequency - ignores IP Varnish Cache /sbin/iptables -A INPUT -p tcp -m multiport --dport 80,443 ! -s 123.456.789.000 -m state --state NEW -j DOS_CHECK /sbin/iptables -A INPUT -p udp -m multiport --dport 80,443 ! -s 123.456.789.000 -m state --state NEW -j DOS_CHECK # # checks if the attack is frequently /sbin/iptables -A SYN_CHECK -m recent --update --seconds 10 --hitcount 20 --name RATE -j SYN_ATTACK /sbin/iptables -A DOS_CHECK -m recent --update --seconds 3 --hitcount 20 --name RATE -j DOS_ATTACK # if the attack is frequent blocks for 1 minute and generates log /sbin/iptables -A SYN_ATTACK -j LOG --log-prefix "BLOCK SYN ATTACK: " --log-level 6 /sbin/iptables -A SYN_ATTACK -m recent --set --name BlockedIP -j DROP /sbin/iptables -A DOS_ATTACK -j LOG --log-prefix "BLOCK DOS ATTACK: " --log-level 6 /sbin/iptables -A DOS_ATTACK -m recent --set --name BlockedIP -j DROP # # if the attack is not frequent, accept /sbin/iptables -A SYN_CHECK -m recent --set --name RATE -j ACCEPT /sbin/iptables -A DOS_CHECK -m recent --set --name RATE -j ACCEPT #
但我不確定我是否完全確定。在我看到網際網路上的許多範例後,我認為這是對 iptables 的 http 的最佳保護腳本之一。
但是,我想換一種意見,在我的邏輯中一切都是有道理的。但我以前從未為 iptables 程式過。
我想听聽專家關於這個問題的意見。