2016-07-27 2 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. Я считаю, что вы можете просто использовать getsockopt с SO_ORIGINAL_DST ...