在Linux服務器安全運維實踐中,針對非必要國外IP訪問的屏蔽及CC攻擊的有效攔截,是提升服務器安全防護能力的重要手段。本文將詳細介紹通過開源工具實現上述功能的操作步驟與核心邏輯,為服務器安全加固提供實踐參考。

為精準限制非國內IP的訪問請求,需先獲取最新的中國IPv4地址網段數據。通過SSH遠程登錄服務器后,執行以下命令從亞太網絡信息中心(APNIC)官方數據源提取國內IP網段,并將結果保存至/root/china_ssr.txt文件:
```bash
wget -q --timeout=60 -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /root/china_ssr.txt
```
該命令利用wget獲取APNIC最新 delegations 數據,并通過awk字段處理提取中國(CN)的IPv4地址段,結合子網掩碼計算生成標準CIDR格式網段列表。
隨后,將以下腳本內容保存為/root/allcn.sh文件,并通過`chmod +x allcn.sh`命令賦予可執行權限:
```bash
mmode=$1
CNIP="/root/china_ssr.txt"
gen_iplist() {
cat < $(cat ${CNIP:=/dev/null} 2>/dev/null) EOF } flush_r() { iptables -F ALLCNRULE 2>/dev/null iptables -D INPUT -p tcp -j ALLCNRULE 2>/dev/null iptables -X ALLCNRULE 2>/dev/null ipset -X allcn 2>/dev/null } mstart() { ipset create allcn hash:net 2>/dev/null ipset -! -R < $(gen_iplist | sed -e "s/^/add allcn /") EOF iptables -N ALLCNRULE iptables -I INPUT -p tcp -j ALLCNRULE iptables -A ALLCNRULE -s 127.0.0.0/8 -j RETURN iptables -A ALLCNRULE -s 169.254.0.0/16 -j RETURN iptables -A ALLCNRULE -s 224.0.0.0/4 -j RETURN iptables -A ALLCNRULE -s 255.255.255.255 -j RETURN iptables -A ALLCNRULE -m set --match-set allcn src -j RETURN iptables -A ALLCNRULE -p tcp -j DROP } if [ "$mmode" == "stop" ] ;then flush_r exit 0 fi flush_r sleep 1 mstart ``` 該腳本通過ipset工具管理國內IP集合,結合iptables實現精細化訪問控制。其中,gen_iplist函數負責讀取已下載的國內IP網段列表;flush_r函數用于清理歷史規則鏈,避免規則沖突;mstart函數則創建名為allcn的ipset集合,導入國內IP網段,并構建INPUT鏈規則,允許國內IP訪問,攔截非國內TCP連接。 執行`/root/allcn.sh`即可啟動IP攔截策略,系統將自動丟棄來自非國內IP地址的TCP連接請求;若需停止攔截,執行`/root/allcn.sh stop`命令即可清理相關規則。CC攻擊防御策略
基于并發連接數的IP攔截
通過分析當前TCP連接狀態,可快速識別異常并發訪問的IP地址。創建/root/deny_1.sh腳本,實現自動化攔截邏輯:
```bash
#!/bin/bash
if [[ -z $1 ]];then
num=100
else
num=$1
fi
cd $(cd $(dirname $BASH_SOURCE) && pwd)
iplist=`netstat -an |grep ^tcp.:80|egrep -v 'LISTEN|127.0.0.1'|awk -F"[ ]+|[:]" '{print $6}'|sort|uniq -c|sort -rn|awk -v str=$num '{if ($1>str){print $2} fi}'`
if [[ ! -z $iplist ]];then
for black_ip in $iplist
do
ip_section=`echo $black_ip | awk -F"." '{print $1"."$2"."$3}'`
grep -q $ip_section ./white_ip.txt
if [[ $? -eq 0 ]];then
echo $black_ip >>./recheck_ip.txt
else
iptables -nL | grep $black_ip || iptables -I INPUT -s $black_ip -j DROP
echo $black_ip >>./black_ip.txt
fi
done
fi
```
腳本通過netstat命令統計當前80端口的TCP連接,提取源IP地址并計算連接數,對超過閾值(默認100)的IP進行攔截。同時,通過white_ip.txt文件實現白名單機制,若IP段與白名單條目匹配,則記錄至recheck_ip.txt待人工核查,避免誤攔截正常用戶。執行`chmod +x deny_1.sh && sh deny_1.sh`即可啟動攔截,被攔截IP將記錄至black_ip.txt文件。
通過分析網站訪問日志中的異常訪問模式,可精準定位惡意IP。創建/root/deny_2.sh腳本,實現基于日志特征的攔截:
```bash
#!/bin/bash
OLD_IFS=$IFS
IFS=$'\n'
for status in `cat 網站訪問日志路徑 | grep '特征字符' | grep -v '127.0.0.1' | awk '{print $1}' |sort -n | uniq -c | sort -n -r | head -20`
do
IFS=$OLD_IFS
NUM=`echo $status | awk '{print $1}'`
IP=`echo $status | awk '{print $2}'`
if [ -z "`iptables -nvL | grep "dpt:80" | awk '{print $8}' | grep "$IP"`" ];then
if [ $NUM -gt 250 ];then
/sbin/iptables -I INPUT -p tcp -s $IP --dport 80 -j DROP
fi
fi
done
```
腳本通過分析日志中的特征字符(如高頻請求路徑、惡意參數等),統計IP訪問次數,對超過閾值(默認250)的IP實施攔截。執行前需將原日志文件重命名,確保分析數據為當前實時日志。建議通過crontab添加定時任務(如/20 /root/deny_2.sh >dev/null 2>&1),實現自動化防御。
1. CDN環境適配:若服務器使用CDN加速(如百度云加速),訪問來源為CDN節點IP,直接攔截可能導致誤傷,建議結合CDN服務商的防護策略配置。
2. 白名單機制:方式1中,與white_ip.txt匹配的IP段將進入recheck_ip.txt,需定期核查避免正常用戶被誤攔截。
3. 日志管理:方式2執行前務必重命名原日志文件,確保分析數據的準確性,避免歷史日志干擾判斷。
4. 攔截時長控制:不建議長時間啟用攔截策略,待服務器負載正常、攻擊停止后,應及時清理規則,恢復服務正常訪問。
5. 規則驗證:實施攔截后,可通過`iptables -L -n`命令驗證規則生效情況,確保符合預期防護效果。