2016-07-27 77 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 ...