本文档介绍 SNI 代理服务器的 IP 白名单功能。
IP 白名单功能允许你限制只有特定 IP 地址或 IP 网段的客户端才能使用 SNI 代理服务。这为代理服务器提供了额外的访问控制层,可以有效防止未授权的访问。
当客户端尝试连接到代理服务器时:
-
IP 检查(如果配置了 IP 白名单)
- 服务器首先检查客户端的 IP 地址是否在白名单中
- 如果不在白名单中,连接会立即被拒绝,不会进行后续的 SNI 解析和域名白名单检查
- 如果在白名单中,继续进行下一步
-
SNI 解析
- 解析 TLS Client Hello 中的 SNI(Server Name Indication)字段
- 提取目标域名
-
域名白名单检查
- 检查目标域名是否在域名白名单中
- 根据配置决定直连或通过 SOCKS5 代理
在 config.json 中添加 ip_whitelist 字段:
{
"listen_addr": "0.0.0.0:8443",
"whitelist": [
"www.google.com",
"github.com"
],
"ip_whitelist": [
"127.0.0.1", // 单个 IPv4 地址
"192.168.1.0/24", // IPv4 CIDR 网段
"10.0.0.0/8", // IPv4 私有网段
"::1", // 单个 IPv6 地址
"fe80::/10", // IPv6 链路本地地址
"2001:db8::/32" // IPv6 CIDR 网段
]
}"ip_whitelist": [
"192.168.1.100",
"10.0.0.5"
]"ip_whitelist": [
"192.168.1.0/24", // 192.168.1.0 - 192.168.1.255
"10.0.0.0/8", // 10.0.0.0 - 10.255.255.255
"172.16.0.0/12" // 172.16.0.0 - 172.31.255.255
]"ip_whitelist": [
"::1", // IPv6 localhost
"2001:db8::1"
]"ip_whitelist": [
"fe80::/10", // 链路本地地址
"2001:db8::/32", // 文档用例
"::/0" // 所有 IPv6 地址(不推荐)
]{
"ip_whitelist": [
"127.0.0.1",
"127.0.0.0/8",
"::1"
]
}{
"ip_whitelist": [
"127.0.0.0/8", // 本地回环
"10.0.0.0/8", // 私有网段 A
"172.16.0.0/12", // 私有网段 B
"192.168.0.0/16", // 私有网段 C
"::1", // IPv6 本地
"fe80::/10" // IPv6 链路本地
]
}{
"ip_whitelist": [
"192.168.1.0/24", // 办公网络
"192.168.2.0/24", // 开发网络
"203.0.113.0/24" // 公网 IP 段
]
}{
"ip_whitelist": [
"192.168.1.0/24",
"10.0.0.1",
"2001:db8::/32",
"fe80::1"
]
}如果不想限制 IP 访问,有两种方式:
{
"listen_addr": "0.0.0.0:8443",
"whitelist": [
"www.google.com"
]
// 没有 ip_whitelist 字段
}{
"listen_addr": "0.0.0.0:8443",
"whitelist": [
"www.google.com"
],
"ip_whitelist": []
}代理服务器的检查顺序如下:
客户端连接
↓
1. IP 白名单检查(如果配置了)
├─ 不通过 → 拒绝连接
└─ 通过 → 继续
↓
2. 读取并解析 TLS Client Hello
↓
3. 提取 SNI 域名
↓
4. 域名白名单检查
├─ SOCKS5 白名单(优先)
├─ 直连白名单
└─ 不匹配 → 拒绝连接
↓
5. 建立连接并转发数据
- 精确 IP 匹配: O(1) 时间复杂度(使用 HashSet)
- CIDR 网段匹配: O(n) 时间复杂度(n 为 CIDR 规则数量)
- 早期拒绝: IP 不匹配的连接会在 SNI 解析之前被拒绝,节省资源
启用 IP 白名单后,日志中会显示:
[INFO] 加载了 5 个 IP 白名单规则
[IP 1] 127.0.0.1
[IP 2] 192.168.1.0/24
[IP 3] 10.0.0.0/8
[IP 4] ::1
[IP 5] 2001:db8::/32
被拒绝的连接会记录:
[WARN] IP 203.0.113.45 不在白名单中,拒绝连接
通过的连接会记录(debug 级别):
[DEBUG] IP 192.168.1.100 通过白名单检查
- 最小权限原则: 只添加必要的 IP 地址或网段到白名单
- 定期审查: 定期检查和更新 IP 白名单,移除不再需要的条目
- 监控日志: 关注被拒绝的连接,识别潜在的未授权访问尝试
- 分层防护: IP 白名单应与域名白名单结合使用,提供多层安全防护
- 避免 0.0.0.0/0: 不要使用
0.0.0.0/0或::/0,这会允许所有 IP 访问
完整的配置示例请参考:
config-ip-whitelist.json- IP 白名单配置示例config.example.json- 包含 IP 白名单的完整配置示例
解决方案: 确保 IP 白名单中包含 127.0.0.1 或 127.0.0.0/8
{
"ip_whitelist": ["127.0.0.1"]
}解决方案: 添加内网 IP 段到白名单
{
"ip_whitelist": [
"192.168.0.0/16",
"10.0.0.0/8",
"172.16.0.0/12"
]
}解决方案: 临时禁用 IP 白名单(设置为空数组),查看日志中的客户端 IP
{
"ip_whitelist": []
}然后从日志中找到客户端 IP:
[DEBUG] 接受来自 192.168.1.100:54321 的新连接
{
"listen_addr": "0.0.0.0:8443",
"whitelist": [
"github.com",
"*.github.io"
],
"socks5_whitelist": [
"*.anthropic.com",
"claude.ai"
],
"ip_whitelist": [
"192.168.1.0/24"
],
"socks5": {
"addr": "127.0.0.1:1080"
}
}在这个配置中:
- 只有
192.168.1.0/24网段的 IP 可以连接 - 这些 IP 访问
*.anthropic.com和claude.ai时使用 SOCKS5 - 访问
github.com和*.github.io时直连