【发布时间】: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 这不是我想要的。
【问题讨论】: