我正在尝试在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
这不是我想要的。
答案 0 :(得分:0)
我不知道在将近一年之后这仍然对你有帮助...... 我知道你在Linux上使用NAT。 我相信你可以使用带有SO_ORIGINAL_DST的getsockopt ......