我开始调试docker容器的问题,并确认它也发生在Mac上的纯nodejs + express,甚至是netcat上。基本上,我可以绑定到IPv4 TCP端口81,但不能绑定到80。似乎没有其他东西在该端口上进行监听了,并且防火墙被禁用了。
要重现此问题,请在全新启动时运行以下命令,以检查端口80上没有侦听内容:
$ sudo lsof -i tcp:80
$ sudo netstat -an | grep 80.*LISTEN
两个命令都不显示任何内容。
然后,在一个终端上,我运行netcat来回显端口80中收到的所有内容:sudo nc -l -p 80
。
现在:
$ sudo lsof -i tcp:80
netcat 1700 root 3u IPv4 0xcd04564dc212a9f 0t0 TCP *:http (LISTEN)
$ sudo netstat -an | grep 80.*LISTEN
tcp4 0 0 *.80 *.* LISTEN
但是在另一个终端上,我尝试连接并拒绝连接:
$ telnet localhost 80
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
Trying 192.168.10.16...
telnet: connect to address 192.168.10.16: Connection refused
telnet: Unable to connect to remote host
这实际上可以在端口81上正常工作,我可以使用IP 127.0.0.1进行连接,而我在一个终端上键入的所有内容都出现在另一终端上:
Terminal 1:
$ sudo nc -l -p 81
asdf
Terminal 2:
$ telnet localhost 81
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
asdf
另外:
docker run -p 0.0.0.0:80:80 httpd:2.4
成功绑定到IPv6 :: 1:80,但未绑定到IPv4地址。 curl http://[::1]
返回主页,但curl http://127.0.0.1
显示连接被拒绝。docker run -p 192.168.10.16:80:80 httpd:2.4
绑定到特定的IP地址,冻结了2分钟(!),最后在sudo lsof
中显示为LISTEN,但仍然拒绝连接。homebrew
在两种情况下都使用端口80和443。我认为这不是问题,因为端口80和443在启动时实际上是免费的,但是我提到这一点是为了以防万一。
闻起来好像是某种东西在阻塞端口而不是使用它们,但是我在“系统偏好设置”>“安全性和隐私”>“防火墙”中检查了防火墙,并禁用了它。
我想念什么?