Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString