SOCKS 应答不是 DNS 查询结果
区分代理侧对主机名的使用与 DNS 查询 API,并正确理解 SOCKS CONNECT 的绑定地址。
让 SOCKS 代理连接到某个主机名,与让它返回该主机名的 DNS 记录并不是一回事。
代理可以在建立所请求的连接的过程中解析该名字。它也可以把这项任务交给另一个合适的上游。客户端收到的是一条描述连接结果的 SOCKS 应答,而不是一个通用的 DNS 响应。
对于 CONNECT,应答中的绑定地址和端口描述的是协议所定义的服务器侧绑定。不要把 BND.ADDR 当作目标解析后 IP 的承诺副本。
如果应用只需要这条连接,它可以直接使用得到的流,而无需知道代理选择了哪个目标地址。如果它需要 DNS 数据本身,就应选择一个真正具备 DNS 能力的接口,并使用预期的解析器位置与策略。
这一区分也能防止误导性的 IP 检查:代理的绑定地址、目标 IP 以及面向网站的公开出口是彼此不同的值。不能仅因为它们出现在同一次握手中,就把其中一个当成另一个。