如何找到我的DHCP服务器?

在我的局域网中有多个运行着的DHCP服务器,而且它们都在同一个范围内。
现在我使用的机器是从一个DHCP服务器获取到的动态IP地址。我需要知道它是从哪个服务器获取到的。
怎么做呢?!
5个回答

要找出给你分配IP地址的DHCP服务器,只需在键盘上按下Ctrl+Alt+T来打开终端。当终端打开时,运行以下命令:
cat /var/lib/dhcp3/dhclient.leases

或者你可以直接使用grep命令来获取DHCP服务器地址。
grep dhcp-server-identifier /var/lib/dhcp3/dhclient.leases

或者

grep dhcp-server-identifier /var/lib/dhcp/dhclient.leases

对于Ubuntu 14.04、16.04和17.10,您可以使用以下命令:
dhclient -d -nw eth0

示例输出:

Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/eth0/00:0c:29:49:3e:67
Sending on   LPF/eth0/00:0c:29:49:3e:67
Sending on   Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3 (xid=0x4f723f9)
DHCPREQUEST of 192.168.138.136 on eth0 to 255.255.255.255 port 67 (xid=0x4f723f9)
DHCPOFFER of 192.168.138.136 from 192.168.138.254
DHCPACK of 192.168.138.136 from 192.168.138.254
RTNETLINK answers: File exists
bound to 192.168.138.136 -- renewal in 892 seconds.

还有14.04! - Organic Marble
@ScottStensland 添加了Ubuntu后续版本的信息。谢谢。 - Mitch
@OrganicMarble 添加了关于Ubuntu后续版本的信息。谢谢。 - Mitch
运行dhclient(即dhclient -d -nw eth0)在我的情况下干扰了已经运行的dhclient进程,导致了一个新的IP地址。 - Ulrich Stern

在Ubuntu 14.04中,/var/lib/dhcp/dhclient.leases是空的。实际的租约文件可以通过ps命令找到dhclient的命令行。寻找-lf选项。这个命令在Ubuntu 14.04安装中应该有效(截至17.10仍然有效)。
cat $(ps aux | grep -o '[/]var/lib/NetworkManager/\S*.lease') | grep dhcp-server-identifier

18.04 dhclient.leases 不是空的。 - Pablo Bianchi

用:

  • nmap (source; DHCPv6):

    sudo nmap --script broadcast-dhcp-discover -e eth0  # DHCPv4
    sudo nmap --script broadcast-dhcp6-discover -6      # DHCPv6
    
  • dhdump (source):

    sudo dhcpdump -i eth0
    
  • tcpdump (source):

    sudo tcpdump -i eth0 -nev udp port 68
    
其他:

1这些真的很不错!你能给IPv6的DHCP提供nmap命令吗? - Hikari

在Ubuntu 16.04中,你可以尝试一下。
journalctl | grep DHCPACK

这个在dhclient上可以工作,在systemd-networkd上也可以工作吗? - Pablo Bianchi

使用新的iproute2(在我的情况下是Ubuntu 22.04.1 LTS):
$ ip route | grep default

default via 1xx.1xx.xxx.xxx dev gpd0 metric 10 
default via 192.168.xxx.xxx dev wlp0s proto dhcp metric 100 

DHCP服务器IP是在每个指定的网络接口之后使用via关键字给出的那个。

ip r | grep default也可以使用。

来自man页:

ip route
   Show table routes.

帮助:
$ ip route help

$ ip route help
Usage: ip route { list | flush } SELECTOR
       ip route save SELECTOR
       ip route restore
       ip route showdump
       ip route get [ ROUTE_GET_FLAGS ] ADDRESS
                            [ from ADDRESS iif STRING ]
                            [ oif STRING ] [ tos TOS ]
                            [ mark NUMBER ] [ vrf NAME ]
                            [ uid NUMBER ] [ ipproto PROTOCOL ]
                            [ sport NUMBER ] [ dport NUMBER ]
       ip route { add | del | change | append | replace } ROUTE
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
            [ table TABLE_ID ] [ vrf NAME ] [ proto RTPROTO ]
            [ type TYPE ] [ scope SCOPE ]
ROUTE := NODE_SPEC [ INFO_SPEC ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
             [ table TABLE_ID ] [ proto RTPROTO ]
             [ scope SCOPE ] [ metric METRIC ]
             [ ttl-propagate { enabled | disabled } ]
INFO_SPEC := { NH | nhid ID } OPTIONS FLAGS [ nexthop NH ]...
NH := [ encap ENCAPTYPE ENCAPHDR ] [ via [ FAMILY ] ADDRESS ]
      [ dev STRING ] [ weight NUMBER ] NHFLAGS
FAMILY := [ inet | inet6 | mpls | bridge | link ]
OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ as [ to ] ADDRESS ]
           [ rtt TIME ] [ rttvar TIME ] [ reordering NUMBER ]
           [ window NUMBER ] [ cwnd NUMBER ] [ initcwnd NUMBER ]
           [ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]
           [ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ]
           [ features FEATURES ] [ quickack BOOL ] [ congctl NAME ]
           [ pref PREF ] [ expires TIME ] [ fastopen_no_cookie BOOL ]
TYPE := { unicast | local | broadcast | multicast | throw |
          unreachable | prohibit | blackhole | nat }
TABLE_ID := [ local | main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
NHFLAGS := [ onlink | pervasive ]
RTPROTO := [ kernel | boot | static | NUMBER ]
PREF := [ low | medium | high ]
TIME := NUMBER[s|ms]
BOOL := [1|0]
FEATURES := ecn
ENCAPTYPE := [ mpls | ip | ip6 | seg6 | seg6local | rpl | ioam6 ]
ENCAPHDR := [ MPLSLABEL | SEG6HDR | SEG6LOCAL | IOAM6HDR ]
SEG6HDR := [ mode SEGMODE ] segs ADDR1,ADDRi,ADDRn [hmac HMACKEYID] [cleanup]
SEGMODE := [ encap | inline ]
SEG6LOCAL := action ACTION [ OPTIONS ] [ count ]
ACTION := { End | End.X | End.T | End.DX2 | End.DX6 | End.DX4 |
            End.DT6 | End.DT4 | End.DT46 | End.B6 | End.B6.Encaps |
            End.BM | End.S | End.AS | End.AM | End.BPF }
OPTIONS := OPTION [ OPTIONS ]
OPTION := { srh SEG6HDR | nh4 ADDR | nh6 ADDR | iif DEV | oif DEV |
            table TABLEID | vrftable TABLEID | endpoint PROGNAME }
IOAM6HDR := trace prealloc type IOAM6_TRACE_TYPE ns IOAM6_NAMESPACE size IOAM6_TRACE_SIZE
ROUTE_GET_FLAGS := [ fibmatch ]

当前版本:

$ ip -V
ip utility, iproute2-5.15.0, libbpf 0.5.0

更多信息:
网站:https://wiki.linuxfoundation.org/networking/iproute2
Git.kernel:https://git.kernel.org/pub/scm/network/iproute2/iproute2.git
Github:https://github.com/shemminger/iproute2