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 访问您的网站。

操作步骤:

  1. 登录 Cloudflare 账户。
  2. 选择您的域名。
  3. 进入 “Security” 选项卡。
  4. 点击 “WAF” (Web Application Firewall)。
  5. 创建新的防火墙规则:
    • 选择 “Country” 作为条件。
    • 选择要允许或禁止的国家。
    • 设置动作为 “Allow” 或 “Block”。
  6. 保存规则。

2.2. AWS WAF

AWS WAF(Web Application Firewall)可以用于过滤和阻止特定 IP 地址的访问。

操作步骤:

  1. 登录 AWS 管理控制台。
  2. 导航到 WAF & Shield。
  3. 创建 Web ACL。
  4. 添加规则:
    • 选择 “IP 匹配条件”。
    • 使用第三方 IP 地址数据库(如 MaxMind GeoIP 数据库)获取特定国家的 IP 地址范围。
    • 将这些 IP 地址范围添加到规则中。
  5. 将 Web ACL 关联到您的资源(如 EC2 实例或 CloudFront 分配)。

2.3. Akamai

Akamai 是一个全球领先的内容分发网络(CDN)和云服务提供商,提供了强大的地理位置访问控制功能。

操作步骤:

  1. 登录 Akamai 控制面板。
  2. 选择您的域名。
  3. 进入安全设置。
  4. 创建新的访问控制规则:
    • 选择要允许或禁止的国家。
    • 设置动作为 “Allow” 或 “Block”。
  5. 保存并应用规则。

2.4. StackPath

StackPath 提供了地理位置访问控制功能,允许用户根据 IP 地址的地理位置来限制访问。

操作步骤:

  1. 登录 StackPath 控制面板。
  2. 选择您的域名。
  3. 进入安全设置。
  4. 创建新的访问控制规则:
    • 选择要允许或禁止的国家。
    • 设置动作为 “Allow” 或 “Block”。
  5. 保存并应用规则。

2.5. KeyCDN

KeyCDN 提供了简单易用的地理位置访问控制功能。

操作步骤:

  1. 登录 KeyCDN 控制面板。
  2. 选择您的域名。
  3. 进入安全设置。
  4. 创建新的访问控制规则:
    • 选择要允许或禁止的国家。
    • 设置动作为 “Allow” 或 “Block”。
  5. 保存并应用规则。

2.6. Fastly

Fastly 是一个高性能的 CDN 服务提供商,提供了丰富的安全功能,包括地理位置访问控制。

操作步骤:

  1. 登录 Fastly 控制面板。
  2. 选择您的域名。
  3. 进入安全设置。
  4. 创建新的访问控制规则:
    • 选择要允许或禁止的国家。
    • 设置动作为 “Allow” 或 “Block”。
  5. 保存并应用规则。

2.7. Azure CDN

Azure CDN 是微软提供的内容分发网络服务,集成了地理位置访问控制功能。

操作步骤:

  1. 登录 Azure 门户。
  2. 选择您的 CDN 配置文件。
  3. 进入 “Endpoint” 设置。
  4. 创建新的访问控制规则:
    • 选择要允许或禁止的国家。
    • 设置动作为 “Allow” 或 “Block”。
  5. 保存并应用规则。

2.8. Google Cloud CDN

Google Cloud CDN 提供了强大的地理位置访问控制功能。

操作步骤:

  1. 登录 Google Cloud 控制台。
  2. 导航到 “Cloud CDN”:
    • 在左侧菜单中选择 “网络服务”。
    • 点击 “Cloud CDN”。
  3. 创建或选择现有的负载均衡器:
    • 如果没有现有的负载均衡器,需要先创建一个。
    • 选择一个现有的负载均衡器并启用 Cloud CDN。
  4. 配置 Cloud Armor:
    • 在左侧菜单中选择 “安全”。
    • 点击 “Cloud Armor”。
    • 创建一个新的安全策略。
  5. 添加地理位置规则:
    • 在安全策略中添加一个新的规则。
    • 选择 “地理位置匹配” 条件。
    • 选择要允许或禁止的国家。
    • 设置动作为 “允许” 或 “拒绝”。
  6. 将安全策略应用到负载均衡器:
    • 返回到负载均衡器设置。
    • 在 “后端配置” 中,选择刚刚创建的安全策略。
  7. 保存并部署配置:
    • 保存所有更改并部署配置。
    • 确保配置已成功应用。

通过以上步骤,您可以使用 Google Cloud CDN 和 Cloud Armor 来实现地理位置访问控制,确保您的内容仅在特定国家或地区可访问。


3. 总结

本文档介绍了多种实现 IP 规则和地理位置访问控制的方法,包括:

  1. 服务器端解决方案:

    • 使用 iptables 和 ipset 创建 IP 规则
    • 配置 Nginx GeoIP 模块
    • 配置 Apache mod_geoip 模块
  2. 第三方服务解决方案:

    • Cloudflare WAF
    • AWS WAF
    • Akamai CDN
    • StackPath
    • KeyCDN
    • Fastly
    • Azure CDN
    • Google Cloud CDN with Cloud Armor

根据您的具体需求和技术环境,可以选择最适合的方案来实现地理位置访问控制。