我使用的是 OSX Mountain Lion 10.8.3,并且刚刚重启了我的 Mac。
我想启动一项服务(比如端口 80 上的 Apache),但是端口 80 上已经有一些事情正在发生:
telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is '^]'.
等一下,我听到你说,你可以用 lsof 或 netstat 找到它。但那里什么也没有
netstat -an | grep LISTEN | grep '\.80'
*comes back blank*
lsof -i :80 | grep LISTEN
*comes back blank
因此,根据我对 unix 系统的了解,我认为这肯定是数据包转发规则?也就是说,数据包从入站端口 80 转发到正在侦听该服务的其他端口。
ipfw show
65535 0 0 allow ip from any to any
嗯,没什么不寻常的
pfctl -s nat
No ALTQ support in kernel
ALTQ related functions disabled
没什么不寻常的
我的问题是,我如何显示任何数据包转发规则...在 Linux 上,我可能只执行 iptables -L -t NAT 或 iptables -L。或者,任何 OSX 专家都可以帮我诊断这个问题吗?
答案1
您需要运行这些命令来root
显示其他用户的进程,例如:
sudo lsof -i ':80'
Mac OS X 包含一个 Apache Web 服务器,可以使用 进行控制apachectl
。root
它通常通过 启动launchd
,相应的配置文件是/System/Library/LaunchAgents/org.apache.httpd.plist
。如果不是这个在端口 80 上运行的 Apache,则可能是启动,Apple 实现了守护进程管理器。根据维基百科:
当 launchd 在启动时扫描作业 plist 时,它会保留并监听这些作业请求的所有端口。如果 plist 中的“OnDemand”键指示了这一点,则守护进程实际上并未在当时加载。相反,launchd 将监听端口,在需要时启动守护进程,在不需要时关闭它。在守护进程加载后,launchd 将跟踪它并确保它在需要时运行。
答案2
只是为了在用户搜索这个问题时使实际答案清晰。
launchd
/System/Library/LaunchDaemons/
在启动时进行扫描,并发现org.apache.httpd.plist
当 apache 启动时需要将端口 80 转发到它。sudo apachectl start
已完成但是文件中有一个错误
httpd.conf
,意味着 apache 未启动,尽管该命令并未报告此错误apachectl
。Launchd 决定监听端口 80,因为它认为 apache 已启动。
但是任何 HTTP 请求的内容都会导致连接立即关闭。
sudo lsof -i :80
没有答案sudo netstat -an | grep LISTEN
端口 80 没有响应据我所知,任何诊断工具都无法显示端口 80 正在使用或正在监听。
修复 apache 的 httpd.conf 并成功重新启动 apache,以便 httpd 位于 ps 表中,从而导致 HTTP 请求成功。
因此,我误以为无法运行 apache,因为已经有某个程序在监听端口 80,而不是 apache conf 本身的问题。
答案3
我刚刚遇到了与 OSX El Capitan 和 Avast 防病毒软件相同的问题。sudo lsof -i ':80'
显示了与 avast.com 的连接。
me@destop ~|master$ sudo lsof -i ':80'
Password:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
com.avast 7964 root 58u IPv4 0xc4c1bba31fcc2c7f 0t0 TCP 192.168.100.111:52381->mia04-004.ff.avast.com:http (ESTABLISHED)
我不得不
- 使用以下方法卸载 Avast
/Applications/Uninstall Avast.app
sudo rm -rf "/Library/Application Support/Avast" "/Applications/Avast Business Security.app" "/Applications/Uninstall Avast.app"
- 重新开始
以防止它使用端口 80。