Как я получаю клиентское использование IP-адреса TcpClient?

Я использую TcpClient для слушания на порте для запросов. Когда запросы входят от клиента, я хочу знать клиентский IP выполнение запроса.

Я попробовал:

Console.WriteLine(tcpClient.Client.RemoteEndPoint.ToString());
Console.WriteLine(tcpClient.Client.LocalEndPoint.ToString());
var networkStream = tcpClient.GetStream();
var pi = networkStream.GetType().GetProperty("Socket", BindingFlags.NonPublic | BindingFlags.Instance);
var socketIp = ((Socket)pi.GetValue(networkStream, null)).RemoteEndPoint.ToString();
Console.WriteLine(socketIp);

Все эти адреса производят 10.x.x.x адреса, которые являются частными адресами и являются ясно не адресом клиентов от моей сети, выполняющей запросы. Что я могу сделать для получения общедоступного IP клиентов, выполняющих запросы?

Править: Мы используем подсистему балансировки нагрузки Amazon EC2 с передачей tcp. Существует ли способ получить истинный клиентский IP в настроенном?

36
задан brendan 27 April 2010 в 14:02
поделиться

2 ответа

Похоже, ваш сервер находится за балансировщиком нагрузки или маршрутизатором, использующим NAT . В этом случае IP-пакет будет содержать не адрес исходного клиента, а адрес маршрутизатора NAT. Только NAT-маршрутизатор знает адрес отправителя (на уровне IP).

В зависимости от того, какой протокол более высокого уровня вы можете использовать поверх TCP, вы сможете получить от него идентификацию клиента, хотя гораздо проще подделать такую ​​информацию на более высоких уровнях, если это может быть проблемой.

Если вам нужны эти данные только для исследовательских целей, ваше устройство NAT может вести журнал.

Если требуется, чтобы вы получали истинный исходный IP-пакет в режиме реального времени, вам, возможно, придется перенастроить маршрутизатор или перенести сервер в DMZ, но это уже совсем другое дело. Поговорите со своими сетевыми парнями, так как они наверняка знают об этом больше, чем я (я не специалист по сетям).

6
ответ дан 27 November 2019 в 05:24
поделиться

Работает ли это:

((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString()

Если клиент подключается к вам через внутреннюю сеть, я не уверен, что вы можете получить его общедоступный IP-адрес, так как соединение будет восстановлено клиенту эта информация не понадобится.

95
ответ дан 27 November 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: