Как получить клиентский 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 в этой настройке?
Ответы
Ответ 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