在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`命令验证规则生效情况,确保符合预期防护效果。