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

為精準(zhǔn)限制非國內(nèi)IP的訪問請求,需先獲取最新的中國IPv4地址網(wǎng)段數(shù)據(jù)。通過SSH遠(yuǎn)程登錄服務(wù)器后,執(zhí)行以下命令從亞太網(wǎng)絡(luò)信息中心(APNIC)官方數(shù)據(jù)源提取國內(nèi)IP網(wǎng)段,并將結(jié)果保存至/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 數(shù)據(jù),并通過awk字段處理提取中國(CN)的IPv4地址段,結(jié)合子網(wǎng)掩碼計算生成標(biāo)準(zhǔn)CIDR格式網(wǎng)段列表。
隨后,將以下腳本內(nèi)容保存為/root/allcn.sh文件,并通過`chmod +x allcn.sh`命令賦予可執(zhí)行權(quán)限:
```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工具管理國內(nèi)IP集合,結(jié)合iptables實現(xiàn)精細(xì)化訪問控制。其中,gen_iplist函數(shù)負(fù)責(zé)讀取已下載的國內(nèi)IP網(wǎng)段列表;flush_r函數(shù)用于清理歷史規(guī)則鏈,避免規(guī)則沖突;mstart函數(shù)則創(chuàng)建名為allcn的ipset集合,導(dǎo)入國內(nèi)IP網(wǎng)段,并構(gòu)建INPUT鏈規(guī)則,允許國內(nèi)IP訪問,攔截非國內(nèi)TCP連接。 執(zhí)行`/root/allcn.sh`即可啟動IP攔截策略,系統(tǒng)將自動丟棄來自非國內(nèi)IP地址的TCP連接請求;若需停止攔截,執(zhí)行`/root/allcn.sh stop`命令即可清理相關(guān)規(guī)則。CC攻擊防御策略
基于并發(fā)連接數(shù)的IP攔截
通過分析當(dāng)前TCP連接狀態(tài),可快速識別異常并發(fā)訪問的IP地址。創(chuàng)建/root/deny_1.sh腳本,實現(xiàn)自動化攔截邏輯:
```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命令統(tǒng)計當(dāng)前80端口的TCP連接,提取源IP地址并計算連接數(shù),對超過閾值(默認(rèn)100)的IP進(jìn)行攔截。同時,通過white_ip.txt文件實現(xiàn)白名單機(jī)制,若IP段與白名單條目匹配,則記錄至recheck_ip.txt待人工核查,避免誤攔截正常用戶。執(zhí)行`chmod +x deny_1.sh && sh deny_1.sh`即可啟動攔截,被攔截IP將記錄至black_ip.txt文件。
通過分析網(wǎng)站訪問日志中的異常訪問模式,可精準(zhǔn)定位惡意IP。創(chuàng)建/root/deny_2.sh腳本,實現(xiàn)基于日志特征的攔截:
```bash
#!/bin/bash
OLD_IFS=$IFS
IFS=$'\n'
for status in `cat 網(wǎng)站訪問日志路徑 | 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
```
腳本通過分析日志中的特征字符(如高頻請求路徑、惡意參數(shù)等),統(tǒng)計IP訪問次數(shù),對超過閾值(默認(rèn)250)的IP實施攔截。執(zhí)行前需將原日志文件重命名,確保分析數(shù)據(jù)為當(dāng)前實時日志。建議通過crontab添加定時任務(wù)(如/20 /root/deny_2.sh >dev/null 2>&1),實現(xiàn)自動化防御。
1. CDN環(huán)境適配:若服務(wù)器使用CDN加速(如百度云加速),訪問來源為CDN節(jié)點IP,直接攔截可能導(dǎo)致誤傷,建議結(jié)合CDN服務(wù)商的防護(hù)策略配置。
2. 白名單機(jī)制:方式1中,與white_ip.txt匹配的IP段將進(jìn)入recheck_ip.txt,需定期核查避免正常用戶被誤攔截。
3. 日志管理:方式2執(zhí)行前務(wù)必重命名原日志文件,確保分析數(shù)據(jù)的準(zhǔn)確性,避免歷史日志干擾判斷。
4. 攔截時長控制:不建議長時間啟用攔截策略,待服務(wù)器負(fù)載正常、攻擊停止后,應(yīng)及時清理規(guī)則,恢復(fù)服務(wù)正常訪問。
5. 規(guī)則驗證:實施攔截后,可通過`iptables -L -n`命令驗證規(guī)則生效情況,確保符合預(yù)期防護(hù)效果。