上篇文章《linux/VPS使用WonderShaper限制網卡上傳/下載帶寬速率》介紹了使用WonderShaper對服務器自身的上傳帶寬下載帶寬進行限流,比較適合長期大量占用帶寬而可能被IDC定義為服務濫用最終導致被停機的一種使用場景,可以有效的進行規避。今天主要記錄下如何使用 iptables 對訪問和請求的IP/端口進行限流或限制並發量,基於公平原則改善網絡訪問體驗,並緩解CC攻擊對服務器造成的影響。
限制指定端口並發數
首先輸入命令service iptables stop
關閉iptables(注意:iptables可能會有問題,貌似在舊版本中不被認為是一個服務,而是防火牆)
限制端口並發數很簡單,IPTABLES就能搞定了,假設你要限制端口8388
的IP
最大連接數為5
,兩句話命令:
iptables -I INPUT -p tcp --dport 8388 -m connlimit --connlimit-above 5 -j DROP iptables -I OUTPUT -p tcp --dport 8388 -m connlimit --connlimit-above 5 -j DROP
我再舉個例子,比如你想限制從1024-10240
的端口
iptables -I INPUT -p tcp --dport 1024:10240 -m connlimit --connlimit-above 5 -j DROP iptables -I OUTPUT -p tcp --dport 1024:10240 -m connlimit --connlimit-above 5 -j DROP
保存IPTABLES規則即可(service iptables save
),其他端口以此類推。
輸入命令service iptables start
啟動
最后用命令查看是否生效
iptables -L -n -v
限制指定端口傳輸速度
首先輸入命令 service iptables stop
關閉 iptables
限制端口並發數很簡單,IPTABLES就能搞定了,假設你要限制端口5037
的最大連接速度為60
個包每秒,兩句話命令:
iptables -A INPUT -p tcp --sport 5037 -m limit --limit 60/s -j ACCEPT iptables -A INPUT -p tcp --sport 5037 -j DROP
也就是限制每秒接受60個包,一般來說每個包大小為64—1518
字節(Byte)。
限制IP的訪問速度
原理:每秒對特定端口進行速度控制,比如每秒超過700
個的數據包直接DROP
,從而限制特定端口的速度
iptables -A FORWARD -m limit -d 208.8.14.53 --limit 700/s --limit-burst 100 -j ACCEPT iptables -A FORWARD -d 208.8.14.53 -j DROP
Linux/VPS下通過iptables限制流量,可通過以下腳本即可實現(首先需要將這台機器配置成網關)。下面給出一個腳本的簡單示例:
#限制網段 for ((i = 1; i < 253; i++)) do /sbin/iptables -A FORWARD -s 192.168.2.$i -m limit \ --limit 60/s -j ACCEPT /sbin/iptables -A FORWARD -s 192.168.2.$i -j DROP done #限制單個ip /sbin/iptables -A FORWARD -s 192.168.1.135/32 -m limit \ --limit 60/s -j ACCEPT /sbin/iptables -A FORWARD -s 192.168.1.135/32 -j DROP #當流量小於60/s的時候,iptables 接受並轉發。當流量大於60/s 的時候,iptables丟棄數據包
最后說一下如何解決防火牆重啟后失敗的問題
iptables-save >/etc/sysconfig/iptables echo 'iptables-restore /etc/sysconfig/iptables' >> /etc/rc.local chmod +x /etc/rc.d/rc.local