为什么 dhcp 会监听 80 端口

为什么 dhcp 会监听 80 端口

我有一台 CentOS 服务器,其中运行着 isc dhcpd 和 apache 2 webserver。几分钟前,我尝试重启 apache:

/etc/init.d/httpd restart

重启失败,原因:

Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down

Apache 抱怨 80 端口已被占用。我已执行

netstat -ntap

查看谁在监听 80 端口。结果是 dhcpd。由于在重启之前 apache 和 dhcpd 同时运行,我猜想发生的事情是,apache 关闭后,dhcp 注意到 80 端口是空闲的,并开始监听它。有人知道 dhcpd 在什么情况下会这样做以及为什么这样做吗?我尝试重现过几次,但都没有成功。

答案1

DHCP 协议使用 67 和 68 端口号。dhcpd无法突然开始监听
端口 80“因为它是空闲的”。还有一件事,使用t选项时,netstat您只列出了 TCP 协议。您怎么会看到使用 UDP 协议的 dhcp 服务器?您可能误读了netstat输出。

答案2

我尝试过多次重现这种情况,但都没有成功。

这是因为在 apache 退出后,套接字可能仍保持打开状态,在后台徘徊,直到相关缓冲区中的数据耗尽。终止和启动 apache 进程之间的时间可能短于耗尽侦听套接字上的缓冲区所需的时间,并且新进程将无法绑定到侦听地址以获取新套接字,直到旧套接字真正关闭。关于 dhcpd 部分,如果我们谈论的是正常的 centos 安装和使用它的普通人,你肯定会误读 netstat 输出。

答案3

尽管我完全同意你的观点,认为这是不可能的,但对我来说,它总是发生这样的事情。

[root@host ~]# service httpd stop
Stopping httpd:                                            [  OK  ]
[root@host ~]# service httpd start
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
                                                           [FAILED]

进而:

[root@host ~]# netstat -anp | grep :80
tcp        0      0 :::80                       :::*                        LISTEN      21276/dhcpd         

是的,传输控制协议端口 80 正被 dhcpd 占用。因此,无论如何,现在我们重置为原始状态:

[root@host ~]# service dhcpd stop
Shutting down dhcpd:                                       [  OK  ]
[root@host ~]# service httpd start
Starting httpd:                                            [  OK  ]
[root@host ~]# service dhcpd start
Starting dhcpd:                                            [  OK  ]
[root@host ~]# netstat -anp | grep :80
tcp        0      0 :::80                       :::*                        LISTEN      27577/httpd         

此后立即尝试均可正常工作,但只要服务器运行一段时间,我每次都可以重现此情况。

答案4

我相信我找到了这个问题的原因。我们使用一个 PHP 应用程序来维护 DHCP 主机配置文件,该文件的更改将导致 PHP 执行代码以重新启动 DHCP 服务。执行此代码时,它会生成一个进程来重新启动 DHCP 进程。这个生成的进程继承了“排队”的 Apache 端口。一旦 Apache 进程停止,DHCP 进程现在拥有端口 80。您可以通过在服务器上完全禁用 ipv6 或重新配置 Apache 以仅使用 ipv4 来解决此问题。

相关内容