我对socks5协议的握手过程感到困惑。根据{{3}}的第5页:
在对CONNECT的回复中,BND.PORT包含该端口号 服务器分配连接到目标主机,而BND.ADDR 包含关联的IP地址。提供的BND.ADDR经常是 与客户端用于到达SOCKS的IP地址不同 服务器,因为这样的服务器通常是多宿主的。这是预料之中的 SOCKS服务器将使用DST.ADDR和DST.PORT,以及 评估CONNECT时的客户端源地址和端口 请求。
似乎BND.ADDR
和BND.PORT
是冗余且无用的。根据文章RFC1928:
- IPv4地址:00 00 00 00(我不知道为什么这是零,但由于代理将执行DNS解析并获取页面,因此本地主机不需要知道IP目标机器的地址,所以这显然只是虚拟数据。)
- 端口号:00 00(显然也是虚拟值)
self._write_to_sock((b'\x05\x00\x00\x01' b'\x00\x00\x00\x00\x10\x10'), self._local_sock)
似乎他们都建议在socks5服务器的回复中BND.ADDR
和BND.PORT
是不重要的。
那么,为什么存在这两个冗余字段BND.ADDR
和BND.PORT
?
答案 0 :(得分:0)
据我所知,涉及4个对象:
SOCKS5协议仅涉及SOCKS5客户端和SOCKS5服务器。真正的代理进程发生在SOCKS5客户端,中继服务器和目标服务器之间。
# SOCKS5 protocol
SOCKS5 client <--> SOCKS5 server
# proxy process
SOCKS5 client <--> relay server <--> target server
BND.ADDR
和BND.PORT
用于告诉SOCKS5客户端中继服务器所在的位置。但在大多数情况下,SOCKS5服务器是中继服务器(这意味着负责代理),因此返回BND.ADDR
全零将告诉SOCKS5客户端作为中继服务器连接到SOCKS5服务器。