【问题标题】:Can I specify what IP address and Port number is allowed to send me a connection request?我可以指定允许哪个 IP 地址和端口号向我发送连接请求吗?
【发布时间】:2016-11-04 23:05:47
【问题描述】:

我创建了一个服务器套接字,并指定了要侦听的端口12345,并通过将INADDR_ANY 传递给bind(),允许对它的连接请求通过系统上可用的任何IP 地址。这是服务器套接字的值:

我的问题是,我可以指定允许哪个 IP 地址和端口号向我发送连接请求(即上图中的外部地址中的值)吗?

【问题讨论】:

  • 使用防火墙规则。

标签: c sockets winapi networking winsock


【解决方案1】:

在本地被动 OPEN 和外部主动 OPEN 中匹配套接字有两种主要情况。在第一种情况下,本地被动 OPEN 已完全指定外部套接字。在这种情况下,匹配必须是精确的。在第二种情况下,本地被动 OPEN 未指定外部套接字。在这种情况下,只要本地套接字匹配,任何外部套接字都是可以接受的。其他可能性包括部分限制匹配。

这是RFC793的介绍。在实际实现中,如@alain,可以在Windows系统中使用SO_CONDITIONAL_ACCEPT; Linux系统没有这个API,调用accept后可以判断IP和Port是否允许,不允许直接断开连接。

【讨论】:

    【解决方案2】:

    当您接受连接时,您将获得外部 IP 地址。如果您不喜欢该连接,您可以关闭接受套接字。

    【讨论】:

      【解决方案3】:

      您不能在打开侦听套接字时指定“一劳永逸”,但如果单个连接不是来自您想要的 IP,您可以拒绝它们。 WSAAccept function 允许您指定一个条件函数,该函数决定是否应接受连接。

      这可以自己工作,但我不确定以这种方式拒绝连接是否与接受它并立即关闭它相同,也许您还需要设置套接字选项SO_CONDITIONAL_ACCEPT,以拒绝连接在打开之前。
      See also this Q/A

      【讨论】:

        【解决方案4】:

        是的,你可以。这就是为什么有防火墙。您可以配置某些规则,例如只允许某个 IP 地址连接。 Windows 有一个集成的防火墙,你的路由器也配备了。

        您不能在程序中指定这些限制。

        【讨论】:

        • 1) "另外 INADDR_ANY 会将你的套接字绑定到每个可用的接口,它的意思不是'每个 ip-address 都是允许的'。" 我说:"并允许对它的连接请求通过系统上可用的任何 IP 地址” 这意味着如果我在系统上有 2 个 IP 地址(即两个接口),那么另一端可以选择其中任何一个将连接请求发送到。 2)“是的,你可以。这就是为什么有防火墙”我的意思是我可以在创建服务器套接字时指定这些限制。
        • 你不能在你的程序中指定这些限制,但是你当然可以检查客户端ip然后决定拒绝它。我在那里误解了你,从我的帖子中删除了那部分。
        • 所以当您调用 netstat 并查看 LISTENING 行时,您将始终看到 0.0.0.0:0 在外国地址栏?
        • 是的。 "[::]:0" 也是一种可能性,它相当于 0.0.0.0.0 的 IPv6。
        • 有趣!我曾经认为 Foreign Address 列可以有其他值,就像 Local Address 列可以有其他值一样。感谢您的帮助。
        猜你喜欢
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多