Я пытаюсь реализовать прозрачный прокси-сервер в 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
, который не то, что я хотел.