当前位置: 首页 > news >正文

利用ipset与iptables脚本精准限制服务器访问地域(仅限中国IP)

1. 为什么需要限制服务器访问地域?

最近帮朋友处理服务器被恶意扫描的问题时,发现一个有趣的现象:超过80%的异常请求都来自境外IP。这让我想起很多企业级项目都会做的安全加固——地域IP过滤。简单来说,就是只允许特定国家或地区的IP访问服务器,其他一律拒之门外。

这种需求在以下场景特别常见:

  • 电商平台防止境外薅羊毛
  • 游戏服务器规避跨国外挂
  • 企业内部系统满足数据合规要求
  • 中小网站防御CC攻击

传统方案是用iptables一条条写规则,但遇到中国IP段这种包含8000+条记录的情况,性能直接崩盘。后来发现ipset+iptables组合拳才是正解:ipset负责高效存储海量IP段,iptables做快速匹配,实测百万级规则也能毫秒级响应。

2. 环境准备与工具安装

2.1 基础环境检查

先确认你的Linux系统版本,不同发行版的安装命令略有差异:

# 查看系统版本 cat /etc/os-release

推荐使用较新的Linux发行版,比如:

  • Ubuntu 18.04+
  • CentOS 7+
  • Debian 10+

2.2 安装ipset与iptables

大部分系统已经预装iptables,但ipset需要手动安装:

# Ubuntu/Debian sudo apt update && sudo apt install -y ipset # CentOS/RHEL sudo yum install -y ipset

安装完成后验证工具是否可用:

ipset --version iptables --version

注意:如果系统提示权限不足,记得在命令前加sudo,或者切换到root用户操作。

3. 获取中国IP地址段

3.1 官方渠道IP数据

推荐从APNIC(亚太网络信息中心)获取最新中国IP分配数据:

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)) }' > china_ip.txt

这个命令做了三件事:

  1. 从APNIC下载最新IP分配数据
  2. 用awk过滤出中国IPv4地址段
  3. 计算CIDR格式并保存到china_ip.txt

3.2 备用数据源方案

如果APNIC访问不稳定,可以使用这些备用源:

  • IPdeny提供的中国IP列表
  • 阿里云官方IP段
  • 腾讯云IP地址库

比如使用IPdeny的方案:

wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone

4. 创建ipset集合

4.1 初始化ipset

先创建一个名为cnip的哈希集合:

ipset create cnip hash:net

关键参数说明:

  • hash:net 表示存储网段的数据结构
  • 默认初始容量为1024,大容量可加hashsize 8192参数
  • 超时时间可用timeout 3600设置(单位秒)

4.2 批量导入IP段

将准备好的中国IP导入集合:

while read ip; do ipset add cnip $ip done < china_ip.txt

可以用这个命令检查导入数量:

ipset list cnip | head -n 10

5. 配置iptables规则

5.1 基础安全策略

先设置默认拒绝策略作为安全基线:

iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT

5.2 允许中国IP访问

关键规则配置:

iptables -A INPUT -m set --match-set cnip src -p tcp --dport 80 -j ACCEPT iptables -A INPUT -m set --match-set cnip src -p tcp --dport 443 -j ACCEPT

参数解读:

  • -m set启用ipset匹配模块
  • --match-set cnip src匹配源IP在cnip集合中
  • 可继续添加其他需要开放的端口

5.3 保留必要通信

别忘了放行本地回环和内网通信:

iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 根据实际内网修改

6. 自动化维护脚本

6.1 动态更新脚本

创建/usr/local/bin/update_cnip.sh

#!/bin/bash # 下载最新中国IP段 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)) }' > /tmp/china_ip.txt # 清空原有集合 ipset flush cnip # 重新导入 while read ip; do ipset add cnip $ip done < /tmp/china_ip.txt # 清理临时文件 rm -f /tmp/china_ip.txt echo "CN IP集已更新 @ $(date)"

6.2 设置定时任务

每天凌晨自动更新:

(crontab -l 2>/dev/null; echo "0 3 * * * /usr/local/bin/update_cnip.sh") | crontab -

7. 常见问题排查

7.1 规则不生效检查步骤

  1. 确认ipset列表是否加载成功:

    ipset list cnip | wc -l

    正常应该有8000+条记录

  2. 检查iptables规则顺序:

    iptables -L INPUT -nv --line-numbers
  3. 测试特定IP是否在集合中:

    ipset test cnip 114.114.114.114

7.2 性能优化技巧

当IP数量超过5万条时,建议:

  • 增加ipset的hashsize参数
  • 使用-m set --exist匹配模式
  • 考虑按省份拆分不同ipset集合

对于高并发场景,可以添加这些优化规则:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # 防扫描

8. 进阶应用场景

8.1 多地域精细管控

如果需要更细粒度的控制,比如:

  • 允许上海IP访问管理后台
  • 限制新疆IP的API调用频率

可以创建多个ipset集合:

ipset create shanghai hash:net ipset create xinjiang hash:net

然后分别配置规则:

iptables -A INPUT -m set --match-set shanghai src -p tcp --dport 8080 -j ACCEPT iptables -A INPUT -m set --match-set xinjiang src -p tcp --dport 8080 -m limit --limit 10/min -j ACCEPT

8.2 与云防火墙联动

在阿里云/腾讯云环境中,可以结合云厂商的API实现动态更新:

# 示例:阿里云安全组API调用 aliyun ecs AuthorizeSecurityGroup --Policy Accept --PortRange 80/80 --SourceCidrIp "$(curl -s http://ipinfo.io/$ip)"

这种混合架构既利用了云平台的能力,又保持了ipset的高性能优势。

http://www.jsqmd.com/news/561985/

相关文章:

  • 探索 COMSOL 中的地热模型:干热岩开采的 THM 热流固耦合之旅
  • CY5-EBL,Cy5标记的黑接骨木凝集素,一种通过化学修饰引入荧光基团的糖类衍生物
  • 2026 年消防用管品牌 TOP5 排名 国家安防战略下的管网屏障 - 外贸老黄
  • RimSort:开源自动化模组管理工具,重新定义RimWorld游戏体验
  • 开源钥匙建模工具Keygen:如何从零开始创建可3D打印的实体钥匙
  • Factory Bot Rails 与 RSpec 的完美集成:提升测试效率的 5 个技巧
  • Apache James邮件服务器:企业级邮件系统的终极部署与架构设计指南
  • 多 Agent 验证架构实战:从输出评分到过程验证
  • 大众点评数据爬取避坑指南:如何稳定获取评论API并绕过常见反爬(Python 3.x版)
  • Zynq AXI-CAN开发避坑指南:从Vivado配置到Linux驱动调试
  • RTX 4090D镜像部署指南:PyTorch 2.8配置ffmpeg-python实现视频合成自动化
  • 突破游戏平台壁垒的创意资源获取工具:WorkshopDL全面解析
  • VectorBT技术架构解析:向量化回测引擎的工程实现与性能优化
  • ngx-datatable拖拽功能全解析:从原理到实战的进阶指南
  • 计算K置位下标对应元素的和
  • 2026年必学!Agent开发从入门到实战全攻略(收藏版)
  • 保姆级教程:从SolidWorks建模到PX4仿真,手把手教你导入自定义无人机模型(附SDF文件详解)
  • 2026年诗远教育官方联系方式公示,特种作业人员培训考证合作便捷入口 - 第三方测评
  • 如何让手机来电显示公司名?号码认证服务商测评 - 企业服务推荐
  • Claudia:重构AI编程体验的桌面应用平台
  • wsl1 升级 ws2 - 小镇
  • 2023最新电商测试技术栈:从JMeter压测到Selenium自动化全覆盖
  • 完全掌握PS4游戏修改工具:GoldHEN Cheats Manager的5大核心功能
  • 2026论文写作工具红黑榜:一键生成论文工具怎么选?干货合集
  • 别再让LVGL卡顿了!手把手教你用思澈SDK的menuconfig优化framebuffer配置,帧率翻倍
  • Qwen2.5-72B-Instruct-GPTQ-Int4实战案例:新能源电池BMS日志分析与故障模式推演
  • 保姆级教程:在Unitree Go2 Edu开发板上手第一个ROS2节点(附完整代码)
  • OpenClaw 的模型预训练中,是否使用了对比学习与自回归的混合目标?
  • MySQL层面记录执行的SQL
  • 6G赋能空天地一体化网络:无人机即服务(UAVaaS)的关键技术与应用前景