iptables 簡介
我們使用iptables工具實現功能
iptables 是 Linux 系統上最常用的防火墻工具,可以指定策略。
Shell文件創建
首先我們先創建文件scanners.sh
vim /usr/local/bin/auto_block_ip.sh
我的目標是每10分鐘自動掃描,再10分鐘內一個IP訪問50次以上就就封禁1天。時間到了后再自動放出來。
第一步 定義部分參數
BAN_IPSET="malicious_ips" # ipset集合名稱
SCAN_THRESHOLD=50 # 10分鐘內訪問50次觸發封禁
BAN_DURATION=$((24*60*60)) # 封禁持續時間(秒),24小時
EXCLUDE_IPS="127.0.0.1 0.0.0.0 192.168.253.1" # 排除的IP列表
第二步 創建iptables規則
# 創建ipset集合(如果不存在)
if ! ipset list $BAN_IPSET >/dev/null 2>&1; thenipset create $BAN_IPSET hash:ip timeout $BAN_DURATION
fi# 添加iptables規則(如果不存在)
if ! iptables -C INPUT -m set --match-set $BAN_IPSET src -j DROP >/dev/null 2>&1; theniptables -I INPUT -m set --match-set $BAN_IPSET src -j DROP
fi
第三步 添加IP檢測和封禁機制
# 獲取所有非排除IP的連接計數
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | grep -vE "$(echo $EXCLUDE_IPS | sed 's/ /|/g')" | uniq -c | \
while read count ip; do# 檢查是否超過閾值且未被封禁if [ $count -gt $SCAN_THRESHOLD ] && ! ipset test $BAN_IPSET $ip >/dev/null 2>&1; then# 封禁IPipset add $BAN_IPSET $ip timeout $BAN_DURATIONecho "$(date '+%Y-%m-%d %H:%M:%S') - 封禁IP: $ip (訪問次數: $count)" >> /var/log/ip_block.logfi
done
第四步 設置自動執行時間
# 設置定時任務
(crontab -l 2>/dev/null; echo "*/10 * * * * /usr/local/bin/auto_block_ip.sh") | crontab -
第五步 測試腳本功能以及腳本使用命令
# 給腳本執行權限
chmod +x /usr/local/bin/auto_block_ip.sh# 手動測試腳本
/usr/local/bin/auto_block_ip.sh# 查看封禁日志
tail -f /var/log/ip_block.log# 查看當前封禁IP列表
ipset list $BAN_IPSET# 手動解封IP
ipset del $BAN_IPSET IP地址# 清空所有封禁
ipset flush $BAN_IPSET# 刪除整個ipset集合
ipset destroy $BAN_IPSE
附:
#!/bin/bash# 配置參數
BAN_IPSET="malicious_ips"
SCAN_THRESHOLD=50
BAN_DURATION=$((24*60*60))
EXCLUDE_IPS="127.0.0.1 0.0.0.0 192.168.253.1"# 創建ipset集合
if ! ipset list $BAN_IPSET >/dev/null 2>&1; thenipset create $BAN_IPSET hash:ip timeout $BAN_DURATION
fi# 添加iptables規則
if ! iptables -C INPUT -m set --match-set $BAN_IPSET src -j DROP >/dev/null 2>&1; theniptables -I INPUT -m set --match-set $BAN_IPSET src -j DROP
fi# 檢測并封禁IP
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | grep -vE "$(echo $EXCLUDE_IPS | sed 's/ /|/g')" | uniq -c | \
while read count ip; doif [ $count -gt $SCAN_THRESHOLD ] && ! ipset test $BAN_IPSET $ip >/dev/null 2>&1; thenipset add $BAN_IPSET $ip timeout $BAN_DURATIONecho "$(date '+%Y-%m-%d %H:%M:%S') - 封禁IP: $ip (訪問次數: $count)" >> /var/log/ip_block.logfi
done