透明 SOCKS 代理如何知道要使用哪个目标 IP?

hol*_*eap 26 iptables proxy socks tor

我知道有两个 SOCKS 代理支持任何传出 TCP 连接的透明代理:Torredsocks。与 HTTP 代理不同,这些 SOCKS 代理可以透明地代理任何传出 TCP 连接,包括加密协议和没有元数据或标头的协议。

这两个代理都需要使用 NAT 将任何传出 TCP 流量重定向到代理的本地端口。例如,如果我TransPort 9040在本地机器上运行 Tor ,我需要添加这样的 iptables 规则:

iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040
Run Code Online (Sandbox Code Playgroud)

据我所知,这将与替换原来的目的地IP和端口127.0.0.19040,所以考虑到这是一个加密的数据流(如SSH)或一个无头(如域名注册),请问代理知道原来的目的IP和端口?

Cel*_*ada 37

下面是它是如何做到的:

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;
}
Run Code Online (Sandbox Code Playgroud)

iptables 会覆盖原始目标地址,但它会记住旧地址。然后应用程序代码可以通过请求一个特殊的套接字选项来获取它SO_ORIGINAL_DST

  • 当然,@hololeap。如果代理服务器要作为数据包重定向器在不同的系统上运行,那么您需要像 Cisco 的 [WCCP](http://en.wikipedia.org/wiki/Web_Cache_Communication_Protocol) 这样的协议。 (5认同)