如何查看 DHCP 客户端做了什么?

如何查看 DHCP 客户端做了什么?
  • Linux 上的 dhcp 客户端会写入任何日志吗?
  • 如果没有,可以启用日志吗?如何启用?
  • 如果它写入日志,那么可以在哪里找到它们?
  • 从 DHCP 服务器获取 IP 和名称服务器时,dhcp 客户端的典型日志是什么样的?
  • 在哪里可以找到 DHCP 客户端的源代码?

如果 Linux 之间存在相关差异:我对 Debian 8.1(默认最小安装 amd64)感兴趣。

答案1

dhclient在大多数 Linux 发行版中,通常会调用 ISC 的 DHCP 客户端。来自man dhclient

客户端通常在启动过程中不打印任何输出。可以通过提供 -v 命令行参数使其发出显示启动序列事件的详细消息,直到它获取地址。无论哪种情况,客户端都会使用 syslog(3) 工具记录消息。

有两种方法可以读取系统日志。在大多数使用 systemd 的系统上,您必须使用journalctl,而cat /var/log/syslog对于仍使用传统 init 系统的系统则有效。

因此,如果您的系统正在使用 systemd 的日志记录功能,您可以使用它journalctl | grep -Ei 'dhcp'来获取 DHCP 客户端日志。否则,请输入cat /var/log/syslog | grep -Ei 'dhcp'

我的 DHCP 客户端日志通常如下所示:

Jul 20 14:17:39 trueclient1 NetworkManager[2622]: <info> (wlan1): canceled DHCP transaction, DHCP client pid 3325
Jul 20 14:17:42 trueclient1 NetworkManager[2622]: <info> Activation (wlan1) Beginning DHCPv4 transaction (timeout in 45 seconds)
Jul 20 14:17:42 trueclient1 dhclient: Internet Systems Consortium DHCP Client 4.2.2
Jul 20 14:17:42 trueclient1 dhclient: For info, please visit https://www.isc.org/software/dhcp/
Jul 20 14:17:42 trueclient1 NetworkManager[2622]: <info> (wlan1): DHCPv4 state changed nbi -> preinit
Jul 20 14:17:42 trueclient1 dhclient: DHCPREQUEST on wlan1 to 255.255.255.255 port 67
Jul 20 14:17:42 trueclient1 dhclient: DHCPACK from 10.8.8.1
Jul 20 14:17:42 trueclient1 NetworkManager[2622]: <info> (wlan1): DHCPv4 state changed preinit -> reboot

答案2

在许多 Linux 平台上调试 dhclient 的一个简单(但有效)的方法是启用bash 跟踪/sbin/dhclient 脚本

dhclient 在我检查过的大多数操作系统版本(RedHat、Debian 等)上运行该脚本。

只需-x在该脚本中添加 shebang(第一行)即可将每一行跟踪到控制台,例如:

#!/bin/bash -x

然后你可以运行,例如

dhclient -r #release lease
dhclient #re-acquire lease

您应该会看到大量输出,不仅来自 dhclient-script,还来自.d/etc/dhcp* 中包含的所有脚本。

跟踪输出应该允许您弄清楚发生了什么以及代码正在做出什么决定(查看输出时参考脚本本身)。

您通常可以从此输出推断出脚本收到的输入(例如包括 IP、GATEWAY 等的参数),但如果不能,您可以在退出之前临时将类似这样的内容添加到脚本中:

   env | logger -t dhclient-debugging

然后运行 ​​dhclient 后检查您的日志(/var/log/messages 或 /var/log/syslog)

答案3

正如本文所提到的回答对于类似的问题,dhcpdump以可读格式查看 dhcp 数据包很有用:

dhcpdump -i eth0

带有删节值的示例转储:

---------------------------------------------------------------------------

  TIME: 2023-12-29 04:44:26.672
    IP: 1.2.3.4 (00:00:00:00:00:00d) > 1.2.3.4 (00:00:00:00:00:009)
    OP: 2 (BOOTPREPLY)
 HTYPE: 1 (Ethernet)
  HLEN: 6
  HOPS: 0
   XID: dd99df6c
  SECS: 1
 FLAGS: 0
CIADDR: 1.2.3.4
YIADDR: 1.2.3.4
SIADDR: 1.2.3.4
GIADDR: 1.2.3.4
CHADDR: 00:00:00:00:00:009:00:00:00:00:00:000:00:00:00:00
 SNAME: .
 FNAME: .
OPTION:  53 (  1) DHCP message type         5 (DHCPACK)
OPTION:  54 (  4) Server identifier         1.2.3.4
OPTION:  51 (  4) IP address leasetime      461 (7m41s)
OPTION:   1 (  4) Subnet mask               1.2.3.4
OPTION:   6 (  8) DNS server                1.2.3.4,1.2.3.4
OPTION:  15 (  6) Domainname                .local
OPTION:  28 (  4) Broadcast address         1.2.3.4
OPTION: 121 (  8) Classless Static Route    deadbeefdeadbeef ........
OPTION:   3 (  4) Routers                   1.2.3.4
OPTION: 249 (  8) MSFT - Classless route    deadbeefdeadbeef ........
---------------------------------------------------------------------------

答案4

请在线查找答案。

  • Linux 上的 dhcp 客户端会写入任何日志吗?


    是的,它确实。

  • 如果没有,可以启用日志吗?如何启用?


 1. Edit dhcpd.conf and add this line
  log-facility local7;

 2. Edit syslog.conf and append 
  local7.* /var/log/dhcpd.log

  • 如果它写入日志,那么可以在哪里找到它们?

    /var/log/dhcpd.log


  • 从 DHCP 服务器获取 IP 和名称服务器时,dhcp 客户端的典型日志是什么样的?


galaxy dhcpd:通过 eth0 从 00:0d:62:d7:a0:12 发出 DHCPDISCOVER
galaxy dhcpd:通过 eth0 从 192.168.1.5 发出 DHCPOFFER 到 00:0d:62:d7:a0:12
galaxy dhcpd:通过 eth0 从 00:0d:62:d7:a0:12 发出针对 192.168.1.5 (192.168.1.1) 的 DHCPREQUEST
galaxy dhcpd:通过 eth0 从 192.168.1.5 发出 DHCPACK 到 00:0d:62:d7:a0:12

相关内容