2016-07-27 76 views
0

我试图在C++中实现一个透明代理,它将监视与某些端口的传出tcp连接,并根据需要转发或阻止它们。如何跟踪透明代理中的原始目标地址

我已经定义了一个规则来转发呼叫目标端口9002到本地主机端口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

我不知道在将近一年之后这是否仍然有帮助... 我知道您在Linux上并使用NAT。 我相信你可以使用SO_ORIGINAL_DST的getsockopt ...