为什么我可以连接到http://127.0.0.1:8000/但不能连接到http://192.168.1.6/

sha*_*nus 11 sockets django macos networking firewall

我在一台本地IP地址为192.168.1.6的计算机上运行OS X Mountain Lion(由Network实用程序和ifconfig报告)并在端口8000上运行本地(Django)开发Web服务器,我想连接到来自在同一台计算机上运行来宾操作系统的虚拟机.

在主机操作系统上(即运行在机器金属上的OS X,地址为192.168.1.6),我可以通过浏览器连接到我的测试Web服务器,导航到127.0.0.1:8000; 或localhost:8000; 但不是在使用机器的本地IP地址时.这就是令人困惑的原因:

  • 路由器没有过滤端口; 而且,为了确定,我已将其设置为明确地将端口8000和22转发到192.168.1.6; 说到22号港口,
  • 当我启动SSH服务时,我可以通过ssh 192.168.1.6连接(从命令行)
  • 这不是一个浏览器问题,因为我也无法telnet到192.168.1.6端口8000(连接被拒绝),而我可以 telnet到127.0.0.1端口8000,我也可以telnet到192.168.1.6端口22
  • 防火墙设置为关闭(如系统偏好设置中所报告)但为了更安全,我还设置了ipfw规则以允许一切通过

以下是ipfw规则:

00100 allow tcp from any to any dst-port 8000
65535 allow ip from any to any
Run Code Online (Sandbox Code Playgroud)

以下是我的测试服务器正在监听端口的额外确认:

netstat -an | grep 8000
tcp4       0      0  127.0.0.1.8000         *.*                    LISTEN 
Run Code Online (Sandbox Code Playgroud)

那么这里发生了什么?不知何故,端口22的处理方式与端口8000不同,但我能想到的每个地方都在寻找那些我找不到的差异.为什么我不能使用其本地IP地址进入该机器的端口8000?

Lud*_*mer 23

当您启动Django开发服务器时,您需要明确地提供地址:

python manage.py runserver 192.168.1.6:8000
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望服务器在所有接口上运行,您可以使用:

python manage.py runserver 0.0.0.0:8000
Run Code Online (Sandbox Code Playgroud)

在其他情况下,Django开发服务器默认仅在本地接口上运行.