如何创建一个只有特定 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
数据包来阻止连接。
是否可以创建一个 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
数据包来阻止连接。