feat: implement geo-filtering with whitelist and blacklist support

- Added support for geo-filtering in the proxy pool, allowing configuration of allowed and blocked countries via environment variables.
- Updated `.env.example` and `docker-compose.yml` to include `ALLOWED_COUNTRIES` for whitelist functionality.
- Enhanced `CLAUDE.md`, `GEO_FILTER.md`, and `README.md` to document the new geo-filtering features and usage instructions.
- Modified proxy validation logic to prioritize whitelist over blacklist during admission checks.
- Improved WebUI to allow dynamic configuration of geo-filter settings.
This commit is contained in:
isboyjc
2026-04-01 21:45:09 +08:00
parent dfe71d0390
commit a06be637e7
14 changed files with 307 additions and 65 deletions

View File

@@ -1,14 +1,25 @@
# 地理过滤配置指南
GoProxy 支持通过国家代码过滤代理的出口位置,让你可以灵活控制代理池的地理分布。
GoProxy 支持通过国家代码过滤代理的出口位置,让你可以灵活控制代理池的地理分布。支持黑名单(屏蔽指定国家)和白名单(仅允许指定国家)两种模式。
## 🌍 配置方式
### 过滤模式
GoProxy 提供两种互斥的过滤模式:
| 模式 | 环境变量 | 说明 |
|------|---------|------|
| 黑名单 | `BLOCKED_COUNTRIES` | 屏蔽指定国家,其余放行(默认 `CN` |
| 白名单 | `ALLOWED_COUNTRIES` | 仅允许指定国家,其余拒绝 |
> **优先级**:白名单非空时生效,黑名单被忽略。白名单为空时黑名单生效。
### 环境变量配置
通过 `BLOCKED_COUNTRIES` 环境变量设置需要屏蔽的国家代码:
```bash
# === 黑名单模式(默认) ===
# 默认屏蔽中国大陆CN
BLOCKED_COUNTRIES=CN
@@ -17,15 +28,32 @@ BLOCKED_COUNTRIES=CN,RU,KP,IR
# 不屏蔽任何国家(留空)
BLOCKED_COUNTRIES=
# === 白名单模式 ===
# 仅允许美国、日本、韩国、新加坡的代理入池
ALLOWED_COUNTRIES=US,JP,KR,SG
# 仅允许欧美代理
ALLOWED_COUNTRIES=US,CA,GB,DE,FR,NL,SE
```
### WebUI 动态配置
管理员登录 WebUI 后,在配置面板的「地理过滤」区域可以动态修改黑名单和白名单,保存后立即生效,无需重启。
> **配置优先级**WebUI 保存config.json> 环境变量 > 默认值。首次启动时环境变量生效,一旦通过 WebUI 保存过,后续以 config.json 为准。
### Docker Compose 配置
编辑 `.env` 文件:
```bash
# 屏蔽中国大陆和俄罗斯
# 黑名单模式:屏蔽中国大陆和俄罗斯
BLOCKED_COUNTRIES=CN,RU
# 或白名单模式:仅允许美日韩新
ALLOWED_COUNTRIES=US,JP,KR,SG
```
启动服务:
@@ -36,36 +64,71 @@ docker compose up -d
### Docker Run 配置
```bash
# 黑名单模式
docker run -d --name proxygo \
-p 127.0.0.1:7776:7776 -p 127.0.0.1:7777:7777 -p 7778:7778 \
-e BLOCKED_COUNTRIES=CN,RU \
-e WEBUI_PASSWORD=your_password \
-v "$(pwd)/data:/app/data" \
ghcr.io/isboyjc/goproxy:latest
# 白名单模式
docker run -d --name proxygo \
-p 127.0.0.1:7776:7776 -p 127.0.0.1:7777:7777 -p 7778:7778 \
-e ALLOWED_COUNTRIES=US,JP,KR,SG \
-e WEBUI_PASSWORD=your_password \
-v "$(pwd)/data:/app/data" \
ghcr.io/isboyjc/goproxy:latest
```
### 本地运行配置
```bash
# 黑名单模式
export BLOCKED_COUNTRIES=CN,RU,KP
go run .
# 白名单模式
export ALLOWED_COUNTRIES=US,JP,KR,SG
go run .
```
## 🗺️ 工作机制
### 过滤逻辑
```
代理验证时:
if 白名单非空:
出口国家在白名单中 → 放行
出口国家不在白名单中 → 拒绝
else if 黑名单非空:
出口国家在黑名单中 → 拒绝
出口国家不在黑名单中 → 放行
else:
全部放行
```
### 双重过滤
地理过滤在两个阶段生效:
**1. 启动清理阶段**
- 程序启动时自动扫描数据库
- 删除所有屏蔽国家出口的代理
- 日志输出:`🧹 已清理 X 个屏蔽国家出口代理 (屏蔽: [CN RU])`
- 白名单模式:删除所有不在白名单中的代理
- 黑名单模式:删除所有屏蔽国家出口代理
- 日志输出示例:
- `🧹 已清理 X 个非白名单国家出口代理 (允许: [US JP KR])`
- `🧹 已清理 X 个屏蔽国家出口代理 (屏蔽: [CN RU])`
**2. 验证阶段**
- 新抓取的代理在验证时检查出口位置
- 如果出口国家在屏蔽列表中,直接拒绝入池
- 不会占用池子容量
- 根据当前过滤模式决定是否允许入池
-符合条件的代理不会占用池子容量
**3. 运行时更新**
- 通过 WebUI 修改过滤配置后立即生效
- 已在池中的代理会在下一轮健康检查时自然淘汰
### 国家代码识别
@@ -80,7 +143,7 @@ go run .
RU Moscow → 国家代码 RU俄罗斯
```
匹配规则:`exit_location LIKE 'CC %'`(国家代码 + 空格 + 城市)
匹配规则:提取 `exit_location` 前两个字符作为国家代码进行匹配
## 📋 常用国家代码
@@ -135,14 +198,28 @@ BLOCKED_COUNTRIES=CN,RU,KP,IR,SY
- 地缘政治考虑
- 防止特定地区的代理质量问题
### 场景 3仅使用欧美代理
### 场景 3仅使用欧美代理(白名单模式)
```bash
# 屏蔽亚洲、非洲、中东等地区(示例,需根据实际需求调整)
BLOCKED_COUNTRIES=CN,IN,TH,VN,ID,PH,BD,PK,IR,IQ,SA,EG,NG,ZA
ALLOWED_COUNTRIES=US,CA,GB,DE,FR,NL,SE
```
### 场景 4不做地理限制
**适用**
- 需要精确控制代理来源国家
- 只需要特定地区的 IP
- 比黑名单排除大量国家更简洁
### 场景 4仅使用亚太代理白名单模式
```bash
ALLOWED_COUNTRIES=JP,KR,SG,HK,TW
```
**适用**
- 需要亚太地区低延迟代理
- 针对亚太区域的业务场景
### 场景 5不做地理限制
```bash
BLOCKED_COUNTRIES=
@@ -189,9 +266,11 @@ sqlite3 data/proxy.db "
1. **大小写不敏感**:国家代码会自动转为大写(`cn``CN`
2. **空格自动处理**:前后空格会自动去除
3. **重启生效**修改配置后需要重启服务
4. **已有代理清理**:启动时会清理数据库中的屏蔽国家代理
5. **香港独立识别**
3. **白名单优先**白名单非空时黑名单被忽略
4. **运行时可调**:通过 WebUI 修改后立即生效,无需重启
5. **已有代理处理**:配置变更后,已入池代理在下一轮健康检查时自然淘汰
6. **持久化**:通过 WebUI 保存的配置写入 config.json重启后优先于环境变量
7. **香港独立识别**
- 中国大陆代码:`CN`
- 香港代码:`HK`(独立的国家代码)
- 设置 `BLOCKED_COUNTRIES=CN` 不会影响香港代理
@@ -236,7 +315,8 @@ go run .
## 💡 最佳实践
1. **默认配置**:保持默认 `BLOCKED_COUNTRIES=CN`,适合大多数场景
2. **生产环境**根据业务合规要求设置屏蔽国家
3. **测试环境**可以设置为空(`BLOCKED_COUNTRIES=`)以获取更多代理
4. **定期调整**根据代理质量和可用性调整屏蔽列表
5. **配合筛选**利用 WebUI 的国家筛选器查看各国代理分布,辅助决策
2. **精确控制**需要特定国家代理时,使用白名单模式(`ALLOWED_COUNTRIES`)比排除大量国家更简洁
3. **生产环境**根据业务合规要求设置过滤规则
4. **测试环境**可以两个都留空以获取更多代理
5. **动态调整**通过 WebUI 实时调整过滤规则,观察效果后再决定最终配置
6. **配合筛选**:利用 WebUI 的国家筛选器查看各国代理分布,辅助决策