feat: add environment variable support for proxy authentication and geo-blocking

- Introduced `.env.example` for environment variable configuration.
- Updated `docker-compose.yml` to utilize environment variables for proxy settings.
- Implemented proxy authentication with Basic Auth and geo-blocking based on country codes.
- Added `GEO_FILTER.md` for documentation on geo-filtering configuration.
- Enhanced logging to indicate authentication status and blocked countries during proxy server startup.
This commit is contained in:
isboyjc
2026-03-29 04:11:38 +08:00
parent 7a5061b101
commit a70df0d505
14 changed files with 1088 additions and 120 deletions

242
GEO_FILTER.md Normal file
View File

@@ -0,0 +1,242 @@
# 地理过滤配置指南
GoProxy 支持通过国家代码过滤代理的出口位置,让你可以灵活控制代理池的地理分布。
## 🌍 配置方式
### 环境变量配置
通过 `BLOCKED_COUNTRIES` 环境变量设置需要屏蔽的国家代码:
```bash
# 默认屏蔽中国大陆CN
BLOCKED_COUNTRIES=CN
# 屏蔽多个国家(逗号分隔)
BLOCKED_COUNTRIES=CN,RU,KP,IR
# 不屏蔽任何国家(留空)
BLOCKED_COUNTRIES=
```
### Docker Compose 配置
编辑 `.env` 文件:
```bash
# 屏蔽中国大陆和俄罗斯
BLOCKED_COUNTRIES=CN,RU
```
启动服务:
```bash
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
```
### 本地运行配置
```bash
export BLOCKED_COUNTRIES=CN,RU,KP
go run .
```
## 🗺️ 工作机制
### 双重过滤
地理过滤在两个阶段生效:
**1. 启动清理阶段**
- 程序启动时自动扫描数据库
- 删除所有屏蔽国家出口的代理
- 日志输出:`🧹 已清理 X 个屏蔽国家出口代理 (屏蔽: [CN RU])`
**2. 验证阶段**
- 新抓取的代理在验证时检查出口位置
- 如果出口国家在屏蔽列表中,直接拒绝入池
- 不会占用池子容量
### 国家代码识别
系统使用 **ISO 3166-1 alpha-2** 标准的两位国家代码:
```
出口位置格式CC City
示例:
CN Beijing → 国家代码 CN中国大陆
HK Hong Kong → 国家代码 HK香港
US New York → 国家代码 US美国
RU Moscow → 国家代码 RU俄罗斯
```
匹配规则:`exit_location LIKE 'CC %'`(国家代码 + 空格 + 城市)
## 📋 常用国家代码
### 亚洲
| 代码 | 国家/地区 | 代码 | 国家/地区 |
|------|----------|------|----------|
| `CN` | 中国大陆 | `HK` | 香港 |
| `TW` | 台湾 | `MO` | 澳门 |
| `JP` | 日本 | `KR` | 韩国 |
| `SG` | 新加坡 | `IN` | 印度 |
| `TH` | 泰国 | `VN` | 越南 |
| `KP` | 朝鲜 | `IR` | 伊朗 |
### 欧洲
| 代码 | 国家 | 代码 | 国家 |
|------|------|------|------|
| `RU` | 俄罗斯 | `GB` | 英国 |
| `DE` | 德国 | `FR` | 法国 |
| `NL` | 荷兰 | `SE` | 瑞典 |
| `UA` | 乌克兰 | `PL` | 波兰 |
### 美洲
| 代码 | 国家 | 代码 | 国家 |
|------|------|------|------|
| `US` | 美国 | `CA` | 加拿大 |
| `BR` | 巴西 | `MX` | 墨西哥 |
| `AR` | 阿根廷 | `CL` | 智利 |
完整国家代码列表:[ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
## 🎯 使用场景
### 场景 1屏蔽中国大陆默认
```bash
BLOCKED_COUNTRIES=CN
```
**适用**
- 需要海外 IP 代理
- 避免被识别为中国大陆流量
- 保留香港、澳门、台湾代理
### 场景 2屏蔽多个敏感地区
```bash
BLOCKED_COUNTRIES=CN,RU,KP,IR,SY
```
**适用**
- 合规要求(避免某些国家的 IP
- 地缘政治考虑
- 防止特定地区的代理质量问题
### 场景 3仅使用欧美代理
```bash
# 屏蔽亚洲、非洲、中东等地区(示例,需根据实际需求调整)
BLOCKED_COUNTRIES=CN,IN,TH,VN,ID,PH,BD,PK,IR,IQ,SA,EG,NG,ZA
```
### 场景 4不做地理限制
```bash
BLOCKED_COUNTRIES=
```
**适用**
- 需要最大化代理池容量
- 对地理位置无特殊要求
- 测试和开发环境
## 📊 实时查看
### 查看当前屏蔽配置
启动日志会显示:
```
[main] 🧹 已清理 15 个屏蔽国家出口代理 (屏蔽: [CN RU KP])
```
### 查看池中国家分布
通过 WebUI 的**出口国家筛选器**可以看到当前池中所有国家的代理分布。
### 数据库查询
```bash
# 查看所有代理的国家分布
sqlite3 data/proxy.db "
SELECT SUBSTR(exit_location, 1, 2) AS country, COUNT(*) AS count
FROM proxies
GROUP BY country
ORDER BY count DESC;
"
# 查看特定国家的代理
sqlite3 data/proxy.db "
SELECT address, exit_ip, exit_location, latency
FROM proxies
WHERE exit_location LIKE 'US %';
"
```
## ⚠️ 注意事项
1. **大小写不敏感**:国家代码会自动转为大写(`cn``CN`
2. **空格自动处理**:前后空格会自动去除
3. **重启生效**:修改配置后需要重启服务
4. **已有代理清理**:启动时会清理数据库中的屏蔽国家代理
5. **香港独立识别**
- 中国大陆代码:`CN`
- 香港代码:`HK`(独立的国家代码)
- 设置 `BLOCKED_COUNTRIES=CN` 不会影响香港代理
## 🧪 测试验证
### 测试 1屏蔽中国大陆
```bash
# 启动服务
export BLOCKED_COUNTRIES=CN
go run .
# 查看日志(应该显示清理信息)
# [main] 🧹 已清理 X 个屏蔽国家出口代理 (屏蔽: [CN])
# 查看 WebUI 的代理列表(不应该有 CN 开头的出口位置)
```
### 测试 2屏蔽多个国家
```bash
export BLOCKED_COUNTRIES=CN,RU,KP
go run .
# 使用测试脚本验证
./test/test_proxy.sh
# 观察输出的国旗 emoji不应该有 🇨🇳 🇷🇺 🇰🇵)
```
### 测试 3不屏蔽任何国家
```bash
export BLOCKED_COUNTRIES=
go run .
# 查看日志(不应该有清理信息)
# 代理列表中可能出现各种国家的代理
```
## 💡 最佳实践
1. **默认配置**:保持默认 `BLOCKED_COUNTRIES=CN`,适合大多数场景
2. **生产环境**:根据业务合规要求设置屏蔽国家
3. **测试环境**:可以设置为空(`BLOCKED_COUNTRIES=`)以获取更多代理
4. **定期调整**:根据代理质量和可用性调整屏蔽列表
5. **配合筛选**:利用 WebUI 的国家筛选器查看各国代理分布,辅助决策