本地起了个服务,自己在浏览器能打开,同事从隔壁工位访问就不行,请求根本没到。看启动参数,绑定地址写的是 127.0.0.1,问题就在这。

127.0.0.1 是回环地址,属于 127.0.0.0/8 这一段。发给这个地址的数据包不会出网卡,直接在内核里绕回来,所以只有本机能访问。它和 localhost 大体等价,但 localhost 是个名字,解析结果可能被 hosts 文件改掉,IPv6 环境下还可能解析成 ::1。

和 0.0.0.0 的区别

  • 127.0.0.1:只监听本机回环,外部连不上,适合本地调试
  • 0.0.0.0:监听所有网卡,局域网和公网都能连,要注意防火墙和暴露风险
  • 本机内网 IP:比如 192.168.1.10,只在那块网卡上监听,换网络就失效

Node 的 listen 只传端口时默认就是 0.0.0.0,而 Python 的 flask run 默认 127.0.0.1,这解释了为什么换个框架同事就访问不到了。要对外开放,显式加 host 参数指定 0.0.0.0,别靠猜默认值。

排查顺序

先 netstat -ano 看监听地址,本地地址一栏写的是 127.0.0.1 还是 0.0.0.0,一目了然。再看防火墙有没有放行端口,Windows 的入站规则默认是拦的,第一次启动程序会弹窗,点过拒绝就得手动加。最后确认对方输的是你的内网 IP,而不是他自己机器上的 127.0.0.1,这个乌龙不少见。

IPv6 里对应的是 ::1,配置文件里同时写 127.0.0.1 和 ::1 才覆盖全。有些程序只监听 IPv4 回环,用 localhost 访问时系统优先走 IPv6,就会出现连接被拒,换成显式地址试一下就能定位。

安全上有个细节,绑 0.0.0.0 在公网机器上等于把服务交给全网扫描器,开发环境的调试接口千万别这么干。要远程访问,用 SSH 隧道或者内网穿透,比直接开放端口稳妥。