IP规则与地理位置访问控制
本文档介绍了如何在服务器和第三方服务上配置 IP 规则,实现基于地理位置的访问控制。
1. 第一部分:服务器上的操作
1.1. 使用 iptables
iptables 是 Linux 系统中常用的防火墙工具,可以通过配置规则来限制特定国家的 IP 访问。
1.2. 下载国家 IP 段列表
访问 IPdeny 网站,下载所需国家的 IP 段列表。
例如,下载中国的 IP 段列表:
# 使用wget命令下载中国的IP段列表
wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone
1.3. 创建 iptables 规则
1.3.1. 创建一个名为 cnip 的规则
# 创建一个名为cnip的IP集合,用于存储中国的IP段
ipset create cnip hash:net
1.3.2. 将 IP 段添加到规则中
# 读取cn.zone文件中的每个IP段,并将其添加到cnip集合中
for ip in $(cat cn.zone); do ipset add cnip $ip; done
1.3.3. 配置 iptables 规则,允许中国 IP 访问
# 在INPUT链中插入一条规则,允许来自cnip集合中的IP访问
iptables -I INPUT -m set --match-set cnip src -j ACCEPT
# 在INPUT链末尾添加一条规则,拒绝所有其他IP的访问
iptables -A INPUT -j DROP
注意:直接追加
DROP规则会拒绝所有未匹配的流量。执行前建议先放行已建立连接和 SSH 端口(如iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT与iptables -I INPUT -p tcp --dport 22 -j ACCEPT),避免把自己锁在服务器外。此外,ipset 集合默认不随重启保留,需配合持久化方案。
1.4. 使用 Nginx
Nginx 可以通过配置文件来限制特定国家的 IP 访问。
1.5. 安装 GeoIP 模块
1.5.1. 安装 GeoIP 库
# 安装GeoIP库
sudo apt-get install libgeoip-dev
1.5.2. 重新编译 Nginx,添加 GeoIP 模块
# 配置Nginx编译选项,添加GeoIP模块
./configure --with-http_geoip_module
# 编译Nginx
make
# 安装Nginx
sudo make install
1.6. 配置 Nginx
1.6.1. 下载 GeoIP 数据库
# 下载GeoIP数据库文件
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
# 解压GeoIP数据库文件
gunzip GeoIP.dat.gz
# 将GeoIP数据库文件移动到指定目录
sudo mv GeoIP.dat /usr/share/GeoIP/GeoIP.dat
注:旧版 GeoIP 数据库(GeoIP.dat)及上述下载链接已被 MaxMind 停用。现需注册免费账号并使用 License Key 下载 GeoLite2 系列(
GeoLite2-Country),参见 GeoLite2 官方说明;Nginx 的ngx_http_geoip_module仅支持旧版 .dat 格式,改用 GeoLite2 需换用ngx_http_geoip2模块。
1.6.2. 编辑 Nginx 配置文件(例如 nginx.conf)
http {
# 指定GeoIP数据库文件路径
geoip_country /usr/share/GeoIP/GeoIP.dat;
# 根据GeoIP国家代码设置变量allowed_country
map $geoip_country_code $allowed_country {
default no;
CN yes;
}
server {
location / {
# 如果访问者的国家不在允许列表中,返回403禁止访问
if ($allowed_country = no) {
return 403;
}
}
}
}
1.6.3. 重启 Nginx
# 重启Nginx服务以应用配置更改
sudo systemctl restart nginx
1.7. 使用 Apache
Apache 可以通过 .htaccess 文件或配置文件来限制特定国家的 IP 访问。
1.8. 安装 mod_geoip 模块
1.8.1. 安装 GeoIP 库和 Apache 模块
# 安装GeoIP库和Apache的mod_geoip模块
sudo apt-get install libapache2-mod-geoip
1.8.2. 启用 GeoIP 模块
# 启用Apache的mod_geoip模块
sudo a2enmod geoip
# 重启Apache服务以应用模块更改
sudo systemctl restart apache2
1.9. 配置 Apache
1.9.1. 下载 GeoIP 数据库
# 下载GeoIP数据库文件
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
# 解压GeoIP数据库文件
gunzip GeoIP.dat.gz
# 将GeoIP数据库文件移动到指定目录
sudo mv GeoIP.dat /usr/share/GeoIP/GeoIP.dat
1.9.2. 编辑 Apache 配置文件(例如 httpd.conf)
# 启用GeoIP功能
GeoIPEnable On
# 指定GeoIP数据库文件路径
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
<Location />
# 设置环境变量AllowCountry,如果国家代码是CN,则允许访问
SetEnvIf GEOIP_COUNTRY_CODE CN AllowCountry
# 拒绝所有访问
Deny from all
# 允许来自AllowCountry环境变量的访问
Allow from env=AllowCountry
</Location>
1.9.3. 重启 Apache
# 重启Apache服务以应用配置更改
sudo systemctl restart apache2
2. 第二部分:第三方服务
2.1. Cloudflare
Cloudflare 提供了强大的 Geo Blocking 功能,可以在其控制面板中设置规则,允许或禁止特定国家的 IP 访问您的网站。
操作步骤:
- 登录 Cloudflare 账户。
- 选择您的域名。
- 进入 “Security” 选项卡。
- 点击 “WAF” (Web Application Firewall)。
- 创建新的防火墙规则:
- 选择 “Country” 作为条件。
- 选择要允许或禁止的国家。
- 设置动作为 “Allow” 或 “Block”。
- 保存规则。
2.2. AWS WAF
AWS WAF(Web Application Firewall)可以用于过滤和阻止特定 IP 地址的访问。
操作步骤:
- 登录 AWS 管理控制台。
- 导航到 WAF & Shield。
- 创建 Web ACL。
- 添加规则:
- 选择 “IP 匹配条件”。
- 使用第三方 IP 地址数据库(如 MaxMind GeoIP 数据库)获取特定国家的 IP 地址范围。
- 将这些 IP 地址范围添加到规则中。
- 将 Web ACL 关联到您的资源(如 EC2 实例或 CloudFront 分配)。
2.3. Akamai
Akamai 是一个全球领先的内容分发网络(CDN)和云服务提供商,提供了强大的地理位置访问控制功能。
操作步骤:
- 登录 Akamai 控制面板。
- 选择您的域名。
- 进入安全设置。
- 创建新的访问控制规则:
- 选择要允许或禁止的国家。
- 设置动作为 “Allow” 或 “Block”。
- 保存并应用规则。
2.4. StackPath
StackPath 提供了地理位置访问控制功能,允许用户根据 IP 地址的地理位置来限制访问。
操作步骤:
- 登录 StackPath 控制面板。
- 选择您的域名。
- 进入安全设置。
- 创建新的访问控制规则:
- 选择要允许或禁止的国家。
- 设置动作为 “Allow” 或 “Block”。
- 保存并应用规则。
2.5. KeyCDN
KeyCDN 提供了简单易用的地理位置访问控制功能。
操作步骤:
- 登录 KeyCDN 控制面板。
- 选择您的域名。
- 进入安全设置。
- 创建新的访问控制规则:
- 选择要允许或禁止的国家。
- 设置动作为 “Allow” 或 “Block”。
- 保存并应用规则。
2.6. Fastly
Fastly 是一个高性能的 CDN 服务提供商,提供了丰富的安全功能,包括地理位置访问控制。
操作步骤:
- 登录 Fastly 控制面板。
- 选择您的域名。
- 进入安全设置。
- 创建新的访问控制规则:
- 选择要允许或禁止的国家。
- 设置动作为 “Allow” 或 “Block”。
- 保存并应用规则。
2.7. Azure CDN
Azure CDN 是微软提供的内容分发网络服务,集成了地理位置访问控制功能。
操作步骤:
- 登录 Azure 门户。
- 选择您的 CDN 配置文件。
- 进入 “Endpoint” 设置。
- 创建新的访问控制规则:
- 选择要允许或禁止的国家。
- 设置动作为 “Allow” 或 “Block”。
- 保存并应用规则。
2.8. Google Cloud CDN
Google Cloud CDN 提供了强大的地理位置访问控制功能。
操作步骤:
- 登录 Google Cloud 控制台。
- 导航到 “Cloud CDN”:
- 在左侧菜单中选择 “网络服务”。
- 点击 “Cloud CDN”。
- 创建或选择现有的负载均衡器:
- 如果没有现有的负载均衡器,需要先创建一个。
- 选择一个现有的负载均衡器并启用 Cloud CDN。
- 配置 Cloud Armor:
- 在左侧菜单中选择 “安全”。
- 点击 “Cloud Armor”。
- 创建一个新的安全策略。
- 添加地理位置规则:
- 在安全策略中添加一个新的规则。
- 选择 “地理位置匹配” 条件。
- 选择要允许或禁止的国家。
- 设置动作为 “允许” 或 “拒绝”。
- 将安全策略应用到负载均衡器:
- 返回到负载均衡器设置。
- 在 “后端配置” 中,选择刚刚创建的安全策略。
- 保存并部署配置:
- 保存所有更改并部署配置。
- 确保配置已成功应用。
通过以上步骤,您可以使用 Google Cloud CDN 和 Cloud Armor 来实现地理位置访问控制,确保您的内容仅在特定国家或地区可访问。
3. 总结
本文档介绍了多种实现 IP 规则和地理位置访问控制的方法,包括:
-
服务器端解决方案:
- 使用 iptables 和 ipset 创建 IP 规则
- 配置 Nginx GeoIP 模块
- 配置 Apache mod_geoip 模块
-
第三方服务解决方案:
- Cloudflare WAF
- AWS WAF
- Akamai CDN
- StackPath
- KeyCDN
- Fastly
- Azure CDN
- Google Cloud CDN with Cloud Armor
根据您的具体需求和技术环境,可以选择最适合的方案来实现地理位置访问控制。