Linux

如何使用 iptables 臨時阻止一個 IP 地址在伺服器上造成過多的點擊?

  • March 30, 2016

這是我在這裡的第一個問題。

我製作了這個跟隨腳本來保護我的伺服器免受 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 程式過。

我想听聽專家關於這個問題的意見。

引用自:https://serverfault.com/questions/766901