tags:

views:

331

answers:

2

I am using TcpClient to listen on a port for requests. When the requests come in from the client I want to know the client ip making the request.

I've tried:

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);

All of these addresses output 10.x.x.x addresses which are private addresses and are clearly not the address of the clients off my network making the requests. What can I do to get the public ip of the clients making the requests?

Edit: We are using an Amazon EC2 Load Balancer with tcp forwarding. Is there a way to get the true client ip in this set up?

A: 

Does this work:

tcpClient.Client.RemoteEndPoint.Address.ToString()

If the client is connecting to you via an internal network I am not sure you can get their public IP since the connection to get back to the client would not need that information.

Kelsey
+4  A: 

It sounds like perhaps your server is behind a load balancer or router using NAT. In this case, the IP packet won't have the originating client's address, but the address of the NAT router. Only the NAT router knows the sender's address (on an IP level).

Depending on whatever higher-level protocol you might be using on top of TCP, you may be able to get client identification from that, although it's much easier to spoof such information at higher levels, if that may be a concern.

If you need this data only for research purposes, your NAT device may keep a log.

If it's a requirement that you get the true originating IP packet in real time, you may have to have to reconfigure your router or have your server moved to the DMZ, but that's a whole nother ball of wax. Talk to your network guys, as they would certainly know more about this than I (I'm not a network expert).

P Daddy
We are using an Amazon EC2 Load Balancer with tcp forwarding - any ideas on how I can get this to give me the requesting client ip?
brendan
You'll have to get in touch with Amazon on that. It might be an add-on package for an additional fee.
P Daddy