只允许中国IP访问服务器
1. 安装环境依赖
apt-get update && apt-get install -y ipset curl iptables kmod grep gawk2. 创建防护脚本
- 创建脚本文件:
vim /usr/local/bin/safe.sh- 将以下内容填入脚本文件:
#!/bin/bash
# 修复 Cron 环境下找不到命令的问题
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# =========================================================
# 配置项
# =========================================================
# 建议加入你目前操作这台电脑的公网 IP,防止误杀
WHITELIST="127.0.0.1,1.203.149.102"
# 定义所有需要保护的端口(包含 Docker 映射端口 和 宿主机SSH 端口)
PROTECTED_PORTS="80,443,22"
# =========================================================
echo "正在初始化环境..."
# 1. 确保 ipset 已安装
if ! command -v ipset &> /dev/null; then
apt-get update && apt-get install -y ipset
fi
# 2. 建立集合
ipset create china hash:net maxelem 100000 2>/dev/null
ipset create whitelist hash:ip 2>/dev/null
# 3. 更新白名单
echo "正在更新白名单..."
ipset flush whitelist
IFS=',' read -ra ADDR <<< "$WHITELIST"
for ip in "${ADDR[@]}"; do
ipset add whitelist $ip 2>/dev/null
done
# =========================================================
#【新增:看大门检测】如果发现已经下载过IP规则,直接退出,避免重复拉取
# =========================================================
FLAG_FILE="/var/run/guard_applied.flag"
if [ -f "$FLAG_FILE" ]; then
echo "白名单已动态更新。中国 IP 库与核心规则已在内核中,跳过重复写入。"
exit 0
fi
# =========================================================
# 4. 获取并更新中国 IP 段
echo "正在下载中国 IP 库..."
curl -s --connect-timeout 10 https://ispip.clang.cn/all_cn.txt > /tmp/china_ip.txt
if [ -s /tmp/china_ip.txt ] && grep -qE '[0-9]{1,3}\.[0-9]{1,3}' /tmp/china_ip.txt; then
echo "下载成功,正在应用到内核..."
ipset flush china
grep -E '^[0-9]' /tmp/china_ip.txt | sed -e 's/^/add china /' | ipset restore -!
COUNT=$(ipset list china | grep 'Number of entries' | awk '{print $4}')
echo "成功载入 $COUNT 条中国网段数据。"
else
echo "------------------------------------------------------"
echo "【错误】下载的 IP 库内容不合法(可能是 404 页面或网络连接被拦截)。"
echo "脚本已紧急停止执行,未修改防火墙规则,防止误杀自己。"
echo "------------------------------------------------------"
exit 1
fi
# 5. 【智能状态防护】注入 Filter 表相关链
echo "正在应用 Filter 表状态防火墙规则..."
iptables -t raw -F PREROUTING 2>/dev/null
iptables -N DOCKER_GUARD 2>/dev/null
iptables -F DOCKER_GUARD
iptables -A DOCKER_GUARD -m conntrack --ctstate RELATED,ESTABLISHED -j RETURN
iptables -A DOCKER_GUARD -s 172.16.0.0/12 -j RETURN
iptables -A DOCKER_GUARD -d 172.16.0.0/12 -j RETURN
iptables -A DOCKER_GUARD -m set --match-set whitelist src -j RETURN
iptables -A DOCKER_GUARD -m set --match-set china src -j RETURN
iptables -A DOCKER_GUARD -j DROP
iptables -D INPUT -p tcp -m multiport --dports $PROTECTED_PORTS -j DOCKER_GUARD 2>/dev/null
iptables -D FORWARD -p tcp -m multiport --dports $PROTECTED_PORTS -j DOCKER_GUARD 2>/dev/null
iptables -D INPUT -p udp -m multiport --dports $PROTECTED_PORTS -j DOCKER_GUARD 2>/dev/null
iptables -D FORWARD -p udp -m multiport --dports $PROTECTED_PORTS -j DOCKER_GUARD 2>/dev/null
iptables -I INPUT 1 -p tcp -m multiport --dports $PROTECTED_PORTS -j DOCKER_GUARD
iptables -I FORWARD 1 -p tcp -m multiport --dports $PROTECTED_PORTS -j DOCKER_GUARD
iptables -I INPUT 1 -p udp -m multiport --dports $PROTECTED_PORTS -j DOCKER_GUARD
iptables -I FORWARD 1 -p udp -m multiport --dports $PROTECTED_PORTS -j DOCKER_GUARD
# =========================================================
# 创建拉取IP库规则标记文件
touch "$FLAG_FILE"
# =========================================================
echo "------------------------------------------------------"
echo "【全方位防护已开启 (Smart Mode)】"
echo "保护端口: $PROTECTED_PORTS"
echo "拦截逻辑: 允许 [中国 IP]、[白名单] 和 [Docker 内部/回程流量] 访问,其余丢弃。"
echo "------------------------------------------------------"
echo "验证方法: iptables -L DOCKER_GUARD -v -n"3. 赋予脚本执行权限
chmod +x /usr/local/bin/safe.sh4. 手动测试运行脚本
/usr/local/bin/safe.sh- 成功示例输出:
正在初始化环境...
正在更新白名单...
正在下载中国 IP 库...
下载成功,正在应用到内核...
成功载入 5493 条中国网段数据。
正在应用 Raw 表拦截规则...
------------------------------------------------------
【全方位防护已开启 (Raw Mode)】
保护端口: 80,443,22
拦截逻辑: 仅允许 [中国 IP] 和 [白名单] 访问,其余全部在网卡层丢弃。
------------------------------------------------------
验证方法: iptables -t raw -L PREROUTING -v -n- 检查某个 IP 是否属于中国IP或白名单
ipset test china x.x.x.x
ipset test whitelist x.x.x.x5. 查看防护规则及拦截统计信息
- 查看端口防护规则及拦截统计信息:
iptables -t raw -L PREROUTING -v -n6 . 设置计划任务,重启自动生效
(crontab -l 2>/dev/null; echo "@reboot /bin/bash /usr/local/bin/safe.sh"; echo "0 3 * * 1 /bin/bash /usr/local/bin/safe.sh") | crontab -7 . 查看计划任务
crontab -l8 . 注意事项
- 本配置仅禁止除中国 IP 外的地址通过 22、80 和 443 端口访问服务器。
- 其他端口并未做任何干预。
- 请根据实际需求修改
WHITELIST配置项增加白名单IP地址。 - 如需保护更多端口,请根据实际需求修改
PROTECTED_PORTS配置项。