我们当前的系统正在通过套接字接收连接,我们需要确定已连接客户端的私有 IP。目前,我们可以通过 轻松访问公共 IP connectingSocket.getInetAddress()
,但是获取私有地址的最佳方法是什么?
谢谢!
简单的答案很简单:你不能。
更复杂的答案:如果您可以控制客户端连接到 java 套接字的方式(即强制它们通过代理使用 HTTP),您可以让代理将该信息添加到特殊的标头中。或者,如果您使用专有协议,您可以在协议本身上对私有 IP 进行编码。但是,没有获取该信息的通用方法。NAT只是让私有 IP 地址消失。
期望能够从公共请求中获取私有 IP 是不合逻辑和不安全的。NAT 和代理隐藏私有 IP 有几个原因,一个是安全性。此外,您不知道传入连接在最终到达您的服务之前可能会经过多少层 NAT'ing、代理或 VLAN 等。
如果您控制客户端(即:它是您自己的 java 客户端等),您可以使用几种不同的技术对请求中的信息进行编码(可能在标头中、有效负载的一部分等中),但如果它是正在连接的通用客户端,那么您无法控制该信息。
也许最好的问题是你为什么想要/需要这些信息?如果是用于记录或跟踪个人,请记住,私有 IP 可以随时更改(大多数人使用 DHCP)并且大多数人没有启用任何类型的 DHCP 记录/历史记录。因此,要通过公共 ip->private ip 追踪哪个硬件发起了连接将是一项不可能完成的任务。