Как получить IP-адрес клиента из-за балансировщика нагрузки?

Я использую 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-адрес клиента в этой настройке?


person brendan    schedule 26.04.2010    source источник
comment
как вы можете быть уверены, что адреса явно не принадлежат клиентам вне вашей сети. Вы хотя бы знаете диапазон IP-адресов, в котором проживают ваши клиенты? Находятся ли они в вашей внутренней сети, находятся ли они в общедоступном Интернете?   -  person Miguel Sevilla    schedule 27.04.2010
comment
Потому что все они начинаются с 10. - Это указывает на частный диапазон IP-адресов, а не на общедоступный IP-адрес. en.wikipedia.org/wiki/Private_network   -  person brendan    schedule 27.04.2010


Ответы (4)


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

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

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

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

person P Daddy    schedule 27.04.2010
comment
Мы используем балансировщик нагрузки Amazon EC2 с переадресацией tcp — есть идеи, как я могу получить это, чтобы дать мне запрашиваемый IP-адрес клиента? - person brendan; 27.04.2010
comment
Вам нужно связаться с Amazon по этому вопросу. Это может быть дополнительный пакет за дополнительную плату. - person P Daddy; 28.04.2010

Это работает:

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

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

person Kelsey    schedule 26.04.2010

Просто используйте объект сокета соединения класса Socket, который вы использовали для приема клиента.

connectionSocket.RemoteEndPoint.toString();
person Haroon Rasheed    schedule 22.01.2020

person    schedule
comment
Разве это не то же самое, что и ответ @Kelsey, только в vb? - person Philip Pittle; 11.10.2014
comment
Вы должны добавить объяснение к своему ответу. Если вы просто предоставляете код (особенно для более сложных ответов), люди могут не знать, как его использовать. - person starbeamrainbowlabs; 25.06.2016