【问题标题】:How to keep track of original destination address in transparent proxy如何在透明代理中跟踪原始目标地址
【发布时间】:2016-07-27 16:55:42
【问题描述】:

我正在尝试在 C++ 中实现一个透明代理,它将监视与某些端口的传出 tcp 连接并根据需要转发或阻止它们。

我已经定义了一个规则,将发往端口 9002 的呼叫转发到 localhost 端口 9001 为:

sudo iptables -t nat -A OUTPUT -p tcp --dport 9002 -j DNAT --to-destination 127.0.0.1:9001

现在当客户端尝试连接到服务器(也在同一主机上运行)时

./client 127.0.0.1 9002

呼叫被转发到端口 9001 并且侦听端口 9001 的应用程序正确获得连接。我的问题是在端口 9001 上运行的应用程序如何知道该调用完成后需要发送到它的原始目的地127.0.0.1:9002?尝试在接受的套接字上调用getsockname,就像在端口9001上监听的应用程序一样:

struct sockaddr_in sockaddr;
socklen_t len = sizeof(sockaddr);
getsockname(socketfd, (struct sockaddr *) &sockaddr, &len);

但是这个返回 127.0.0.1:44853 这不是我想要的。

【问题讨论】:

    标签: sockets proxy iptables


    【解决方案1】:

    我不知道这在将近一年后是否仍然对您有所帮助... 我了解您在 Linux 上并使用 NAT。 我相信您可以将 getsockopt 与 SO_ORIGINAL_DST 一起使用...

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      相关资源
      最近更新 更多