Vaisravana

Vaisravana

在Debian服务器上实现屏蔽过滤海外IP来源

24
2025-01-29

在Debian服务器上实现该需求,可通过iptables+ipset方案实现。以下是分步指南:


一、基础环境准备

# 安装依赖
sudo apt update
sudo apt install -y iptables ipset curl

# 创建ipset集合(中国IP段)
sudo ipset create china hash:net

二、获取中国IP段列表

# 下载最新中国IP段(示例来源,需确认可用性)
sudo curl -k -L http://www.ipdeny.com/ipblocks/data/countries/cn.zone |\
  xargs -I {} sudo ipset add china {}

建议通过cron每周自动更新:

# 创建更新脚本 /usr/local/bin/update_china_ipset.sh
#!/bin/bash
URL="http://www.ipdeny.com/ipblocks/data/countries/cn.zone"
TMPFILE=$(mktemp)
curl -k -s -L $URL > $TMPFILE
if [ -s "$TMPFILE" ]; then
  ipset flush china
  grep -v '^#' $TMPFILE | xargs -I {} ipset add china {}
fi
rm -f $TMPFILE

# 添加可执行权限
sudo chmod +x /usr/local/bin/update_china_ipset.sh

# 每周自动更新
echo "0 3 * * 1 root /usr/local/bin/update_china_ipset.sh" | sudo tee /etc/cron.d/update_china_ipset

三、配置防火墙规则

默认模式(允许所有访问)

# 清空现有规则
sudo iptables -F

# 创建专用链
sudo iptables -N GEO_BLOCK

# 基础规则:允许中国IP(永久放行)
sudo iptables -A INPUT -m set --match-set china src -j ACCEPT

# 本地回环和已建立连接放行
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 其他流量转入GEO_BLOCK链
sudo iptables -A INPUT -j GEO_BLOCK

# 默认模式:GEO_BLOCK链允许所有(海外可访问)
sudo iptables -A GEO_BLOCK -j ACCEPT

# 保存规则(安装iptables-persistent)
sudo apt install -y iptables-persistent
sudo netfilter-persistent save

防御模式脚本 /usr/local/bin/enable_geo_block.sh

#!/bin/bash
# 清空GEO_BLOCK链
sudo iptables -F GEO_BLOCK

# 设置防御规则:
# 1. 拒绝所有ICMP(包括ping)
sudo iptables -A GEO_BLOCK -p icmp --icmp-type echo-request -j DROP
# 2. 拒绝其他所有协议
sudo iptables -A GEO_BLOCK -j DROP

# 保存配置
sudo netfilter-persistent save

恢复默认脚本 /usr/local/bin/disable_geo_block.sh

#!/bin/bash
# 清空GEO_BLOCK链
sudo iptables -F GEO_BLOCK

# 恢复允许所有
sudo iptables -A GEO_BLOCK -j ACCEPT

# 保存配置
sudo netfilter-persistent save

四、使用说明

  • 日常模式:所有IP均可访问

    sudo /usr/local/bin/disable_geo_block.sh
  • 防御模式:仅允许中国IP+拒绝海外ping

    sudo /usr/local/bin/enable_geo_block.sh

五、验证测试

# 查看当前规则
sudo iptables -L -n -v

# 查看ipset内容
sudo ipset list china

注意事项

  1. SSH保护:建议在iptables中添加SSH端口白名单,避免误封

    sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT
  2. 应急恢复:若配置错误导致失联,可通过服务商控制台的VNC登录恢复。

  3. 性能优化:ipset使用哈希存储,对性能影响极小,可支持百万级IP段。

  4. 数据源可靠性:建议使用官方IP分配数据(如APNIC),本文示例数据源可能需要替换。