在开发中与INADDR_ANY和INADDR_LOOPBACK绑定?

时间:2018-12-17 04:27:32

标签: sockets

我正在使用Pelican建立博客。启动开发服务器后,我收到警告:

  

您是否希望应用程序“ Python.app”接受传入的网络连接?单击拒绝可能会限制应用程序的行为。可以在“安全性和隐私”首选项的“防火墙”面板中更改此设置。

我敢肯定,我以前已经看过这个警告(Django?),只是心不在accepted地接受了它。不过,我一直试图弄清楚它的真正含义,这使我陷入了网络编程的困境。

我发现Pelican默认使用INADDR_ANY绑定其服务器套接字,这使我想到了两个问题:

  • 与INADDR_ANY而不是INADDR_LOOPBACK绑定有什么好处?
    • 连接到开发服务器的标准方法是localhost:8000。在某些情况下,不仅会使用本地主机吗?
  • 使用INADDR_ANY是否有任何风险?
    • 我认为使用INADDR_ANY存在一定风险或其他风险,否则警告不会弹出。我的猜测是,从理论上讲,有人可以将HTTP请求发送到我的套接字并与我的HTTP处理程序所允许的搞砸了吗?

如果可以的话,如果有答案提供了网络编程术语/概念的基本定义,我将不胜感激。我对这个问题的了解仅限于周末的学习。

更新

雷米(Remy)的回答很简洁,而且似乎很准确。但是,尽管它解释了概念,但并没有直接解决我的几个问题。我会讲一点,以防其他人看到这个:

绑定到我发现的INADDR_ANY(0.0.0.0)也是Python的http.server的默认设置。根据{{​​3}}的主要贡献者,这显然导致对网络一无所知的人(例如我)的抱怨减少。诸如虚拟机之类的东西被认为是挫折的源头。

绑定到INADDR_ANY的唯一直接风险是本地网络上的其他人可能会连接到您的开发服务器。但是,只要您不与宣誓的复仇者共享互联网,那您就很好。如果您通过设置适当的端口转发明确允许外部来源,则来自外部来源(除了本地网络之外)的唯一风险就是如此。

1 个答案:

答案 0 :(得分:2)

如果将服务器绑定到INADDR_LOOPBACK,则只有使用与127.0.0.1(IPv4)或::1(IPv6 ),或映射到此类IP的名称,例如"localhost"

如果将服务器绑定到INADDR_ANY,则服务器将绑定到计算机上所有可用的网络接口,并且可以由服务器LAN上的任何客户端使用服务器的LAN IP或主机名连接到该服务器。局域网外部的客户端也可以连接,但前提是局域网的路由器已相应配置了端口转发。