如何创建一个只有特定 IP 才能连接的服务器套接字

How to create a Server Socket to which only a specific IP can connect

是否可以创建一个 ServerSocket,而不是对任何连接使用 ServerSocket#accept 方法,ServerSocket 等待并仅接受来自特定 IP 的连接?

或者,是否可以在接受连接之前知道连接的 IP,以便在连接不是来自该特定 IP 时我可以拒绝它?

没有。底层通信堆栈不支持 TCP 套接字。

accept 本身调用 returns 套接字,然后可以查询远程 IP 地址。如果 IP 不符合您的喜好,您可以立即关闭套接字。

(顺便说一句,您接受的是 'connection',而不是 'socket'。套接字只是一个本地数据结构,每个端点一个;套接字是在您的机器上创建的作为对接受连接的响应。这是你的电话和与另一端的人的对话之间的区别。)

对 ServerSocket 没有太多的具体经验,但对 TCP 套接字有一些经验。我不认为这是可能的,但是你可以做的是在接受后验证 IP 地址(TCP 和 UDP 套接字都接收另一台机器的 IP,因为有必要提供响应)。

我不明白你这样做的原因(特别是考虑到 IP 通常会因多种原因随时间动态变化),如果有其他方法可以解决你遇到的问题。

您不应该依赖源 IP,因为从另一台主机发送具有相同 IP 的 TCP/IP 数据包很容易,请参阅 IP spoofing。您需要使用 SSL 套接字并对其进行一些身份验证。

在 java 中不确定,但在 c 或 python 中是可能的。使用 3 级原始套接字,您可以通过在接受之前用 RST 数据包响应 SYN 数据包来阻止连接。