据我所知,有两个 SOCKS 代理支持任何传出 TCP 连接的透明代理:托尔和红袜队。与 HTTP 代理不同,这些 SOCKS 代理可以透明代理任何传出 TCP 连接,包括加密协议和没有元数据或标头的协议。
这两个代理都需要使用 NAT 将任何传出 TCP 流量重定向到代理的本地端口。例如,如果我TransPort 9040
在本地计算机上运行 Tor,我需要添加如下 iptables 规则:
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040
127.0.0.1
据我所知,这将用和替换原始目标 IP 和端口9040
,因此考虑到这是一个加密流(如 SSH)或没有标头的流(如谁是),代理怎么知道原来的目的IP和端口呢?
答案1
这里它是如何做到的:
static int getdestaddr_iptables(int fd, const struct sockaddr_in *client, const struct sockaddr_in *bindaddr, struct sockaddr_in *destaddr)
{
socklen_t socklen = sizeof(*destaddr);
int error;
error = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);
if (error) {
log_errno(LOG_WARNING, "getsockopt");
return -1;
}
return 0;
}
iptables 会覆盖原始目标地址,但它会记住旧的地址。然后,应用程序代码可以通过请求特殊的套接字选项 来获取它SO_ORIGINAL_DST
。