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


18

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

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

iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040

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

Answers:


28

是怎么做的:

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


1
很棒的答案!因此,这意味着您必须在处理NAT的同一台计算机上运行代理软件,对吗?
hololeap 2014年

4
绝对是@hololeap。如果代理服务器与数据包重定向器在不同的系统上运行,则您需要诸如Cisco WCCP之类的协议。
Celada 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.