利用 IPTABLES 防范同ip一个时间段内多包的轰炸
开始前,iptables 的基本参数解释:https://www.cnblogs.com/zclzhao/p/5081590.html
方法1:利用 limit 模块
这个匹配操作必须由-m limit明确指定才能使用
例如:你指定了--limit 3/minute --limit-burst 5 ,意思是开始时有5个通行证,用完之后每20秒增加一个
iptables -A INPUT -p icmp -m limit --limit 3/m --limit-burst 5 -j ACCEPT iptables -P INPUT DROP
然后从另一部主机上ping这部主机,就会发生如下的现象:
首先我们能看到前四个包的回应都非常正常,然后从第五个包开始,我们每10秒能收到一个正常的回应
方法2: 利用 recent 模块
-I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 600 --hitcount 18 --name SSH_LOG -j LOG --log-prefix 'DDOS attack6: '
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 600 --hitcount 20 --name SSH_LOG --rsource -j DROP
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH_LOG --rsource
-A INPUT -p tcp --dport 22 -j ACCEPT
-m recent是套用recent模组功能
--set是指将符合设定条件的来源IP新增或更新于近期清单内
--name指定最近清单的名称(如SSH_LOG),依CentOS版本的不同,会存在/ proc / net / xt_recent /或/ proc / net / ipt_recent /里
--rsource是指将「来源」IP的每个封包新增或更新于近期的清单内( --rdest的则是--rdest记录“目的地”IP的封包)
--rcheck检查--rcheck检查近期资料表内是否有符合的IP封包记录( --update则是不了检查还会更新封包的时间戳记时间戳,--remove则将符合的IP从清单中移除)
--seconds xxx须与--rcheck或--update配合使用,查询在清单中指定秒数内的封包
--hitcount xxx须与--rcheck或--update配合使用,如果在清单中的封包数大于或等于指定的数量,则触发规则
记录内容依CentOS版本的不同在/ proc / net / xt_recent /或/ proc / net / ipt_recent /里
内容中,src是來源IP,ttl是封包留存時間,last_seen是最近一個封包的時間戳記,oldest_pkt是記錄中所有連線封包的時間戳記。
這個時間戳記不是UNIX timestamp,而是jiffies時間,它記錄了自開機以來經過了幾個jiffy,一個jiffy是Linux系統時鐘(system timer)一個tick的時間,也就是所謂的時鐘中斷(interrupt),在Linux核心2.6.13之後的版本,intel x86 平台上,每個jiffy的預設長度是4ms(或1/250秒),在不同的平台上,jiffy時間長度也大約都落在 1ms ~ 10ms 之間。
摘录链接:https://xz.aliyun.com/t/994