【问题标题】:How to create a Server Socket to which only a specific IP can connect如何创建只有特定 IP 可以连接的服务器套接字
【发布时间】:2020-08-22 12:34:53
【问题描述】:

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

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

【问题讨论】:

  • 您可以创建一个防火墙,拒绝来自您不允许的来源的连接。如何创建和配置防火墙取决于操作系统。你是在 Linux、Mac 还是 Windows 上运行程序?
  • 您好,这是一个想法,感谢您提出这个建议,但是您确定只为程序的那一步激活整个系统上的防火墙有意义吗?无论如何,我在 Linux 上,但对于该程序,我想保持与所有 3 个操作系统的兼容性......
  • 设置防火墙是唯一的方法。至少在 Linux 上,“防火墙”(iptables)总是在运行,因为它是内核的一部分,你只需要向它添加一个规则。我对其他操作系统不熟悉。
  • 我明白了,谢谢。

标签: java sockets connection serversocket


【解决方案1】:

没有。底层通信栈不支持 TCP 套接字这样的事情。

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

(顺便说一句,您接受的是“连接”,而不是“套接字”。套接字只是一个本地数据结构,每个端点都有一个;套接字是在您的机器上创建的,以响应接受连接. 这是你的电话和与另一端的人谈话之间的区别。)

【讨论】:

  • 您好,感谢您回答我的问题并指出“连接”和“套接字”之间的区别,我已更正。我已经考虑过接受后可以关闭它的可能性,但我想知道我是否可以直接让自己免于接受不需要的连接。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    我看不出您这样做的原因(特别是考虑到 IP 通常会因多种原因随时间动态变化)以及是否有其他方法可以解决您遇到的问题。

    【讨论】:

    • 您好,感谢您回答我的问题,在我的程序中,我需要为某个我事先知道其 IP 的客户端创建一个服务器(以便从他那里接收文件),出于安全原因,我会喜欢避免其他人可以先于它连接到 ServerSocket 的情况。
    • IP 不应用于在现实生活场景中验证计算机(或用户)的实体。但如果你想这样做,你必须接受请求,验证 IP,如果不是你想要的 IP,则关闭并再次接受。保持此循环,直到发生错误或 IP 连接。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多