基于系统层的GEO IP封锁与解封指南
背景需求
当业务需要限制特定地区IP访问且无机房防火墙权限时,可通过操作系统层实现。本文以屏蔽中国IP为例,提供Linux/Windows双平台解决方案。
准备工作
获取GEO IP数据库
推荐使用IPdeny提供的免费IP地址库:
- 每日更新CIDR格式数据
- 支持249个国家/地区
- 可直接通过wget/PowerShell下载
# 中国IP地址库下载地址
https://www.ipdeny.com/ipblocks/data/countries/cn.zone
Linux系统实现
1. 创建封禁脚本
#!/bin/bash
# block_cn_ips.sh
# 备份现有规则
iptables-save > /etc/iptables/backup_$(date +%F).v4
# 初始化规则链
iptables -F INPUT
iptables -P INPUT DROP # 设置默认拒绝策略
# 必要的基础规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 开放SSH端口(关键!防止被锁)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 加载封禁列表
while read -r cidr; do
iptables -A INPUT -s "$cidr" -j DROP
done < <(wget -qO- https://www.ipdeny.com/ipblocks/data/countries/cn.zone)
# 保存配置
iptables-save > /etc/iptables/rules.v4
systemctl restart iptables # 适用于systemd系统
2. 执行脚本
chmod +x block_cn_ips.sh
sudo ./block_cn_ips.sh
3. 验证规则
# 查看规则命中次数
sudo iptables -L INPUT -v -n --line-numbers
# 测试中国IP(示例)
curl --max-time 3 -H 'X-Forwarded-For: 1.2.4.8' https://yourdomain.com
Windows系统实现
1. PowerShell封禁脚本
# block_cn_ips.ps1
# 下载IP列表
$url = "https://www.ipdeny.com/ipblocks/data/countries/cn.zone"
$zoneFile = "$env:TEMP\cn_zone_$(Get-Date -Format yyyyMMdd).txt"
Invoke-WebRequest $url -OutFile $zoneFile
# 批量创建规则
Get-Content $zoneFile | ForEach-Object {
$ruleName = "BlockCN_$($_ -replace '/','_')"
New-NetFirewallRule `
-DisplayName $ruleName `
-Direction Inbound `
-Action Block `
-RemoteAddress $_ `
-Description "Auto-generated CN block rule" `
-ErrorAction SilentlyContinue
}
# 清理临时文件
Remove-Item $zoneFile -Force
2. 执行脚本
Set-ExecutionPolicy Bypass -Scope Process -Force
.\block_cn_ips.ps1
3. 验证配置
# 查看已创建规则
Get-NetFirewallRule -DisplayName "BlockCN_*" | Format-Table DisplayName,Enabled
# 测试规则(需安装Test-NetConnection)
Test-NetConnection -ComputerName YourServerIP -Port 80 -InformationLevel Detailed
解封操作指南
Linux解封脚本
#!/bin/bash
# unblock_cn_ips.sh
# 下载最新IP列表(可选)
wget -q https://www.ipdeny.com/ipblocks/data/countries/cn.zone -O /tmp/cn.zone
# 遍历删除规则
while read -r cidr; do
iptables -D INPUT -s "$cidr" -j DROP
done < /tmp/cn.zone
# 恢复默认策略
iptables -P INPUT ACCEPT
# 保存配置
iptables-save > /etc/iptables/rules.v4
Windows解封脚本
# unblock_cn_ips.ps1
# 获取所有相关规则
$rules = Get-NetFirewallRule | Where-Object {
$_.DisplayName -like "BlockCN_*"
}
# 批量删除规则
$rules | ForEach-Object {
Remove-NetFirewallRule -Name $_.Name -Confirm:$false
}
# 验证删除结果
Get-NetFirewallRule -DisplayName "BlockCN_*" | Measure-Object
关键注意事项
连接安全性
- 操作前确保本地控制台可用
- 优先放行SSH/RDP管理端口
- 建议配置监控告警规则
性能优化
# 合并连续CIDR(需安装iprange) sudo apt-get install iprange sort cn.zone | iprange --merge > cn_merged.zone
维护建议
设置cron定时更新IP列表
0 0 root /path/to/block_cn_ips.sh
使用IPset优化大批量规则
ipset create cn_block hash:net ipset add cn_block 1.0.1.0/24 iptables -A INPUT -m set --match-set cn_block src -j DROP
日志监控
# 查看被拒请求 journalctl -k --grep="DROP IN="
法律合规
- 遵守当地数据保护法规
- 在隐私政策中明确说明IP限制
- 提供申诉解封渠道
扩展方案对比
方案 | 优点 | 缺点 |
---|---|---|
系统防火墙 | 无需额外依赖 | 规则量大时性能下降 |
Cloudflare | 无需服务器配置 | 需要域名托管 |
IPset | 高性能哈希存储 | 需要额外学习成本 |
Nginx层控制 | 应用层精准控制 | 影响Web服务性能 |
云厂商安全组 | 网络层过滤 | 依赖特定云平台 |
主要改进点说明:
- 增加操作前的安全备份机制
- 优化iptables规则顺序和默认策略
- 补充SSH端口放行等安全措施
- 添加IP合并和IPset优化方案
- 强化法律合规性说明
- 增加方案对比表格
- 完善验证和监控手段
- 提供定时更新和维护建议
- 优化脚本的错误处理和日志记录
- 增加Windows系统的临时文件管理