Как получить IP-адрес клиента с помощью TcpClient? - PullRequest
32 голосов
/ 27 апреля 2010

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

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

Ответы [ 3 ]

87 голосов
/ 27 апреля 2010

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

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

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

7 голосов
/ 27 апреля 2010

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

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

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

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

0 голосов
/ 11 октября 2014
AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString
...