Appearance
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_backendGeoIP 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/代理用户可能定位不准确