Linux 的哪条数据包路径应当用来强制执行代理?
把网络代理的强制执行控制放在它真正要管辖的数据包路径上,而不是只过滤发往网关本身的连接。
一台 Linux 网关可以运行代理进程,同时也能让流量绕过它转发。这两者并不是同一条数据包路径。
| 连接 | 相关的本机角色 |
|---|---|
| 客户端访问网关上的代理 | 发往本机的流量 |
| 客户端经网关访问另一台主机 | 转发流量 |
| 代理打开一个网站连接 | 本地进程产生的流量 |
Netfilter 区分输入、转发和输出路径。管辖网关自身代理监听端口访问的规则,并不会自动约束经过这台机器转发的每一条连接。
先界定要强制执行什么
如果客户端必须使用已批准的代理,策略除了放行预期的监听端口,还必须处理它们其他的出站路径。仅仅因为某个远端服务使用了熟悉的代理端口就放行连接,并不等于只放行你自己的代理端点。
把代理自身的对外访问单独保留。对 Squid 而言,在套用出站许可之前,先区分本地套接字归属与局域网用户身份。若一概拒绝代理的所有有效出站连接,所需路径就会不通。管理流量、名称解析以及受支持的非 Web 操作,也需要在部署策略中专门处理。
协议范围很重要。一条 TCP 规则本身并不描述 UDP 流量,包括 QUIC。拦截流量是另一种设计;显式 HTTPS 代理可以在不解密网站会话的情况下提供 CONNECT。
在修改规则集之前,先画出预期的连接。浏览器偏好只为参与的客户端选择路径。网络层的强制执行决定其他路径能否成功。两者都不应仅凭一次成功的代理登录来推断。