feat(proxy): 安全加固与架构优化

- 引入 SafeDnsResolver 消除 DNS rebinding TOCTTOU 漏洞,DNS 缓存改为多地址存储
- 扩展私有 IP 检测范围(CGNAT 100.64/10、基准测试 198.18/15、保留 240/4)
- 请求处理增加 hop-by-hop 头过滤、URL scheme 校验、超时范围限制
- 动态配置从 RwLock 切换到 ArcSwap 实现无锁读取
- 启动注册失败的服务器支持后台自动重试
- WebSocket 帧大小上限提升至 64MiB 匹配 Python 端
- 心跳支持动态间隔更新,新增 failed_requests/dns_failures/stream_errors 指标
- 配置启动校验、systemd UMask=0077、配置文件权限 600
- Python 端支持 per-connection max_streams(X-Tunnel-Max-Streams)
This commit is contained in:
fawney19
2026-02-28 01:32:28 +08:00
parent 2a0c684e88
commit e748277902
22 changed files with 746 additions and 149 deletions

View File

@@ -99,8 +99,18 @@ async def proxy_tunnel_ws(ws: WebSocket) -> None:
node_id: str = auth[0]
node_name: str = auth[1]
# Read proxy-advertised max concurrent streams (backward-compatible:
# old proxies don't send this header, we fall back to the default).
max_streams_raw = ws.headers.get("x-tunnel-max-streams", "").strip()
max_streams: int | None = None
if max_streams_raw:
try:
max_streams = int(max_streams_raw)
except ValueError:
pass
manager = get_tunnel_manager()
conn = TunnelConnection(node_id, node_name, ws)
conn = TunnelConnection(node_id, node_name, ws, max_streams=max_streams)
manager.register(conn)
# 更新 DB: tunnel_connected = True