2016-07-27 27 views
0

Ich versuche, einen transparenten Proxy in C++ zu implementieren, der ausgehende tcp-Verbindungen mit bestimmten Ports überwacht und sie bei Bedarf weiterleitet oder blockiert.So verfolgen Sie die ursprüngliche Zieladresse im transparenten Proxy

Ich habe eine Regel weiterleiten Anruf an Port 9002 Port auf localhost bestimmt definiert 9001:

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

jetzt, wenn vom Client zum Server versucht, eine Verbindung (die auch in demselben Host ausgeführt wird) mit

./client 127.0.0.1 9002 

Der Anruf wird an den Port 9001 weitergeleitet und die Anwendung, die den Port 9001 überwacht, erhält die Verbindung ordnungsgemäß. Meine Frage ist, wie die Anwendung, die auf Port 9001 läuft, wissen kann, dass dieser Anruf zu seinem ursprünglichen Bestimmungsort127.0.0.1:9002 geschickt werden muss, nachdem es damit fertig ist? Versuchte Aufruf getsockname auf akzeptiert Steckdose nach Anwendung lauscht auf Port 9001:

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

aber diese Rückkehr 127.0.0.1:44853 das ist nicht das, was ich wollte.

Antwort

0

Ich weiß nicht, ob das immer noch nach fast einem Jahr hilft ... Ich verstehe, dass Sie auf Linux sind und NAT verwenden. Ich glaube, Sie können einfach getsockopt mit SO_ORIGINAL_DST ...

verwenden