1. 安装环境依赖

apt-get update && apt-get install -y ipset curl iptables kmod grep gawk

2. 创建防护脚本

  • 创建脚本文件:
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.sh

4. 手动测试运行脚本

/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.x

5. 查看防护规则及拦截统计信息

  • 查看端口防护规则及拦截统计信息:
iptables -t raw -L PREROUTING -v -n

6 . 设置计划任务,重启自动生效

(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 -l

8 . 注意事项

  • 本配置仅禁止除中国 IP 外的地址通过 22、80 和 443 端口访问服务器。
  • 其他端口并未做任何干预。
  • 请根据实际需求修改 WHITELIST 配置项增加白名单IP地址。
  • 如需保护更多端口,请根据实际需求修改PROTECTED_PORTS 配置项。

标签: 服务器, ipset, 防火墙, 安全加固, ip规则

添加新评论