使用 bash 检查我的网络中是否存在 DHCP 服务器

Ste*_*eve 28 networking linux centos dhcp

使用带有静态 IP 的 CentOS,是否有任何方法可以使用 bash 确定网络上运行的 DHCP 服务器?

Mer*_*hts 48

nmap 这样做很容易:

sudo nmap --script broadcast-dhcp-discover -e eth0
Run Code Online (Sandbox Code Playgroud)

将会呈现:

Starting Nmap 6.40 ( http://nmap.org ) at 2016-08-16 09:25 UTC
Pre-scan script results:
| broadcast-dhcp-discover: 
|   IP Offered: 192.168.0.67
|   DHCP Message Type: DHCPOFFER
|   Server Identifier: 192.168.0.1
|   IP Address Lease Time: 0 days, 0:05:00
|   Subnet Mask: 255.255.255.0
|   Router: 192.168.0.1
|   Domain Name Server: 8.8.8.8
|   Domain Name: maas
|   Broadcast Address: 192.168.0.255
|_  NTP Servers: 91.189.91.157, 91.189.89.199, 91.189.94.4, 91.189.89.198
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 0.27 seconds
Run Code Online (Sandbox Code Playgroud)

注意:dhcpv6 有一个类似的脚本

sudo nmap --script broadcast-dhcp6-discover -e eth0
Run Code Online (Sandbox Code Playgroud)

  • 好的命令,但值得注意的是,这只是输出响应的*第一个* DHCP 服务器。如果存在多个 DHCP 服务器,此命令将找不到它们。 (3认同)
  • 虽然现有的答案相当不错,但我更喜欢你的解决方案! (2认同)

Pol*_*len 6

如果存储库中可用,则有 dhcpdump

从手册页:

SYNOPSIS
       dhcpdump [-h regular-expression] -i interface

DESCRIPTION
       This command parses the output of tcpdump to display the dhcp-packets for easier checking and debugging.

USAGE
       dhcpdump -i /dev/fxp0

       If you want to filter a specific Client Hardware Address (CHADDR), then you can specifiy it as a regular expressions:

       dhcpdump -i /dev/fxp0 -h ^00:c0:4f

       This will display only the packets with Client Hardware Addresses which start with 00:c0:4f.
Run Code Online (Sandbox Code Playgroud)


Nev*_*ams 5

如果您可以tcpdump使用以下参数以 root 身份调用该程序可能会帮助您找到服务器:

tcpdump -i [接口 ID] -nev udp 端口​​ 68

不幸的是,由于我的网络布局,我无法立即捕获完整的 DHCP 握手。但是,我确实看到了来自 iPad 的 DHCP 请求:

22:16:44.767371 30:10:e4:8f:02:14 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342: (tos 0x0, ttl 255, id 15652, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 30:10:e4:8f:02:14, length 300, xid 0x42448eb6, Flags [none]
      Client-Ethernet-Address 30:10:e4:8f:02:14
      Vendor-rfc1048 Extensions
        Magic Cookie 0x63825363
        DHCP-Message Option 53, length 1: Request
        Parameter-Request Option 55, length 6: 
          Subnet-Mask, Default-Gateway, Domain-Name-Server, Domain-Name
          Option 119, Option 252
        MSZ Option 57, length 2: 1500
        Client-ID Option 61, length 7: ether 30:10:e4:8f:02:14
        Requested-IP Option 50, length 4: 192.168.2.222
        Lease-Time Option 51, length 4: 7776000
        Hostname Option 12, length 15: "NevinWiamssiPad"
Run Code Online (Sandbox Code Playgroud)

在让 `tcpdump' 运行一夜之后,我最终看到了这个 ACK​​:

07:46:40.049423 a8:39:44:96:fa:b8 > 68:a8:6d:58:5b:f3, ethertype IPv4 (0x0800), length 320: (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 306)
    192.168.2.1.67 > 192.168.2.22.68: BOOTP/DHCP, Reply, length 278, xid 0x5e7944f, Flags [none]
      Client-IP 192.168.2.22
      Your-IP 192.168.2.22
      Client-Ethernet-Address 68:a8:6d:58:5b:f3
      Vendor-rfc1048 Extensions
        Magic Cookie 0x63825363
        DHCP-Message Option 53, length 1: ACK
        Server-ID Option 54, length 4: 192.168.2.1
        Lease-Time Option 51, length 4: 86400
        Subnet-Mask Option 1, length 4: 255.255.255.0
        Default-Gateway Option 3, length 4: 192.168.2.1
        Domain-Name-Server Option 6, length 8: 192.168.2.1,142.166.166.166
Run Code Online (Sandbox Code Playgroud)

如果在运行该tcpdump命令时,您看到 BOOTP/DHCP Offer 或 Ack(Nack),这将来自 DHCP 服务器,并且服务器的 MAC 地址将在第一行的时间戳之后。

所以这里的(有效的)DHCP 服务器的 MAC 地址是 a8:39:44:96:fa:b8`。

使用网络上的众多 MAC 地址查找工具之一,我看到这个 MAC 属于A8:39:44 Actiontec Electronics, Inc我的路由器。

为了在恶意 DHCP 服务器数据包发生时捕获它们,我必须让这个tcpdump进程在终端窗口中运行:

tcpdump -i en0 -nev udp src port 67 and not ether host a8:39:44:96:fa:b8

只要进程在其自己的窗口中运行,这只会向我显示来自主机的 DHCP 服务器响应,而不是我的有效 DHCP 服务器。

以下命令将在后台运行,直到捕获 100 个数据包,将任何恶意 DHCP 服务器消息附加到文件/tmp/rogue. 同样,必须在适当的位置使用有效 DHCP 服务器的 MAC 地址,以及系统上的接口描述符。

tcpdump -U -i en0 -c 100 -nev udp src port 67 and not ether host a8:39:44:96:fa:b8 >> /tmp/rogue 2>&1 &

`


Ken*_*ned 0

您可以尝试创建一个别名设备并在测试模式下使用 dhcp 客户端,它会打印出任何响应,而无需实际重新配置接口:

ifconfig eth0:1 up
dhclient -w -n eth0:1
Run Code Online (Sandbox Code Playgroud)

我只能访问 debian 盒子,因此如果您有另一个 dhcp 实现,试运行选项可能会有所不同,例如 dhcpcd:

dhcpcd -T eth0:1
Run Code Online (Sandbox Code Playgroud)

我曾经运行过一个 cron 脚本,它会像这样运行,它会向管理员(我!)发出关于流氓 dhcp 服务器的警报。