Skip to content

MaxMind GeoIP 地域封锁

HAProxy 支持基于 MaxMind GeoIP 数据库进行地域访问控制,实现精准的地理流量管理。

安装 GeoIP 数据库

bash
# 下载免费版 GeoLite2 数据库
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz
tar -xzf GeoLite2-Country.tar.gz
mv GeoLite2-Country_*/GeoLite2-Country.mmdb /etc/haproxy/geoip.mmdb

配置 HAProxy 使用 GeoIP

编译带 GeoIP 支持的 HAProxy

bash
make TARGET=linux-glibc USE_GEOIP=1

配置示例

haproxy
frontend http_front
    bind *:80
    bind *:443 ssl crt /etc/ssl/certs/example.com.pem

    # 加载 GeoIP 数据库
    geoip-db /etc/haproxy/geoip.mmdb

    # 定义地域 ACL
    acl allowed_countries src -i -f /etc/haproxy/geoip.mmdb -k CN,US,JP
    acl blocked_countries src -i -f /etc/haproxy/geoip.mmdb -k RU,IR,KP

    # 阻止特定国家
    http-request deny if blocked_countries

    # 只允许特定国家访问管理后台
    acl is_admin path_beg /admin
    http-request deny if is_admin !allowed_countries

    default_backend web_backend

GeoIP ACL 匹配规则

关键字说明
-k country_code匹配指定国家代码
-i不区分大小写
-f从文件加载数据库路径

使用 map 文件动态管理

haproxy
# 创建国家代码 map 文件
echo "RU deny" > /etc/haproxy/country_rules.map
echo "IR deny" >> /etc/haproxy/country_rules.map
echo "CN allow" >> /etc/haproxy/country_rules.map

frontend http_front
    bind *:80
    acl country_deny src,geoip -m str -f /etc/haproxy/country_rules.map deny
    http-request deny if country_deny
    default_backend web_backend

注意事项

  • GeoLite2 免费版每月第一个周二更新,需定期刷新数据库
  • 使用商业版 GeoIP2 可获得更高精度和更新频率
  • GeoIP 匹配基于 IP 地址,VPN/代理用户可能定位不准确