DHCP服務




1. DHCP服務

DHCP動態主機配置協議(Dynamic Host Configuration Protocol),允許計算機不必手工配置即可動態地被分配IP地址以及所需要的網絡配置參數。

當網絡規模大到一定程度,它是開始變得難以管理。特別是在手工分發IP地址的網絡環境中最常見的問題是IP地址管理和IP地址沖突。處理這個問題的一個方法是為客戶機動態分配IP地址。DHCP是為大量客戶機提供快速、方便、有效地分配I P的方法。

DHCP允許賦給不可移動的服務器一個固定地址,該地址不會因為機器重啟動而改變。

DHCP使用客戶/服務器模式。當一台計算機啟動時,就發送一個DHCP請求給DHCP服務器。管理員能夠將一台DHCP服務器配置成兩種地址類型:賦給固定地址類型和按需分配的地址緩沖池類型。當一台計算機啟動並發送一個請求給DHCP,DHCP服務器查詢其數據庫找到配置信息。如果數據庫包含該計算機的條目,服務器就返回該條目。如果沒有該計算機的條目,服務器將從緩沖池中選擇下一個IP地址並賦給該計算機。

DHCP使用UDP協議,客戶端使用68端口,服務器使用67端口。

1.1 DHCP報文

1.1.1 DHCP報文格式

dhcp協議的報文格式如下:

image

其中各個字段意義如下:

  • OP:指明報文是請求(1)還是響應(2);

  • htype與hlen:指明網絡硬件類型和硬件地址的長度,對於以太網類型為1,地址長度為6。

  • hops:客戶機在字段HOPS設置為0,如果收到請求並決定將請求送到其他服務器(用作中繼時,就增加HOPS計數)。

  • xid:事務標識符,它是一個隨機數,用於匹配請求和響應的整數。

  • secs:延續時間,報告客戶機開始啟動后逝去的秒數,通常情況下設置為0。

  • flags:標志位,高位置為1,可請求服務器發送響應是使用硬件廣播而不是硬件單播。

  • ciaddr:客戶IP地址,如果客戶機含有IP地址,則設置為客戶的IP地址。

  • yiaddr:你的IP地址,如果客戶機IP地址為零,則服務器設置你的IP地址字段以返回提供給客戶機的IP地址。

  • siaddr:服務器IP地址,表明服務器的IP地址,在DHCPOFFER、DHCPACK中返回。

  • giaddr:路由器IP地址,它是中繼的IP地址,當中繼收到客戶機的DHCP請求,將其轉發到服務器之前,設置此字段為中繼的IP地址。

  • chaddr:客戶硬件地址。

  • sname:服務器主機名。

  • file:自舉文件名。

  • options選項,長度是可變的。

dhcp的options字段是比較重要的,一些附帶信息的下發均依靠這個字段,常用選項如下:

  • Subnet mask:子網掩碼,選項1,在DHCP響應報文中使用,用以指定客戶機的子網掩碼。

  • Requested IP address:請求的IP地址,選項50,在DHCPDISCOVER報文中用於向服務器請求指定的IP地址。

  • IP address lease time:IP地址租用時間,選項51,在DHCPDISCOVER或DHCPREQUEST報文中,用於向服務器請求指定的租用時間;在DHCPOFFER中,則表明服務器向客戶機提供的租用時間。

  • DHCP message type:DHCP消息類型,選項53,用以表示此報文的類型,BOOTP報文無此選項。報文的類型包括:DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPDECLINE、DHCPACK、DHCPNACK、DHCPRELEASE、DHCPINFORM。

  • Server identifier:服務器標識,選項54,用於DHCPOFFER、DHCPREQUEST報文中,也可選擇地用於DHCPACK、DHCPNACK報文中。DHCP服務器在DHCPOFFER報文中使用此選項是為了讓客戶機區別不同的租用提供者。而客戶機使用此選項則是為了標識其租用提供者。

  • Parameter request list:參數請求列表,選項55,客戶機使用,用於請求特定的配置參數。

  • Maximum DHCP message size:最大DHCP報文長度,選項57,用於表明可以接收的DHCP報文的最大長度。

  • Renewal(T1) time value:更新時間值,選項58,用於指定更新時間。

  • Rebinding(T2) time value:重綁定時間值,選項59,用於指定重綁定時間值。

  • Client identifier:客戶端標識,選項61,用於唯一標識客戶端,CISCO用此作為服務器地址綁定表的索引。

1.1.2 DHCP報文類型

  • DHCPDISCOVER:客戶端用於地址申請的廣播報文。

  • DHCPOFFER:服務器端對客戶端DHCPDISCOVER報文的回復,包含了所提供的IP地址和網絡配置信息。

  • DHCPREQUEST:在不同的狀態下,用途不同:

    • (a) 在請求狀態時,請求服務器同意開始使用所提供的IP地址。
    • (b) 在更新狀態,請求提供IP地址的服務器更新IP地址租用時間。
    • (c) 在重綁定狀態,廣播請求子網中的服務器,是否允許繼續使用當前的IP地址。
  • DHCPACK:服務器端對客戶端請求的同意報文。

  • DHCPNAK:服務器端對客戶端請求的否定報文。客戶端必須重新開始申請。

  • DHCPRELEASE:客戶端主動終止IP地址的使用,用於釋放IP地址報文。

  • DHCPDECLINE:由於地址已經被使用,客戶端對服務器提供的地址表示拒絕。

  • DHCPINFORM:客戶端要求服務器提供最新的網絡配置信息。

1.2 DHCP工作過程

dhcp的工作流程如下:

image

  1. 客戶機通過DHCPDISCOVER廣播提出請求,尋找局域網中的dhcp服務器。如果客戶機有一個永久性的租用地址,它可以直接請求那個地址。
  2. 服務器一旦收到請求,會從地址池中取出一個地址並返回一個附有可用IP地址的DHCPOFFER報文。
  3. 如果客戶機收到多個DHCPOFFER報文,它會選擇第一個DHCPOFFER報文提供的IP地址或其所請求的那一個。
  4. 客戶機廣播含有服務器標識的DHCPREQUEST報文並等待。
  5. 每一個服務器檢查收到的DHCPREQUEST報文,若發現不含它的標識,它會丟棄該報文。當被標識的服務器接收了報文后,它會返回一個DHCPACK報文,如果所請求的IP已被分配或者租期已滿,會發回DHCPNAK報文;沒有被標識的服務器收到報文后會返回DHCPNAK報文。
  6. 如果客戶機收到DHCPACK報文,它可以開始使用IP地址。如果它收到DHCPNAK,它會重新開始整個過程。假如IP有問題,客戶機會發送一個DHCPDECLINE報文給服務器並重新開始。

1.2.1 DHCP租期更新

  • 當客戶端ip的租期達到50%時,客戶端會向服務器請求更新地址的租期,單播發送DHCPREQUEST報文請求更新租期,若服務器同意則回應DHCPACK消息,租期更新成功;如果該地址不可用,則服務器回復DHCPNAK消息。
  • 若之前服務器沒有回復ACK消息,當客戶端ip的租期達到75%時,客戶端會再次請求更新租期,這次客戶端將以廣播形式發送DHCPREQUEST報文,若服務器同意則回應DHCPACK消息,租期更新成功;如果該地址不可用,則服務器回復DHCPNAK消息。如客戶端更新租期失敗,之后客戶端每隔5min會廣播請求地址。

image

1.2.2 DHCP中繼

中繼代理能中繼服務器和客戶機之間的交互報文。這樣可以使服務器能處理不在該服務器所在子網的DHCP報文。這意味着不必為每一個子網設置一個服務器,為每一個子網設置一個服務器開銷很大,以下幾步說明了中繼代理如何工作:

  1. DHCP客戶機廣播一個REQUEST消息。
  2. 中繼代理把收到報文的接口對應的IP地址放到消息的giaddr域中,然后單播至服務器。
  3. 服務器給中繼代理返回應答(通過單播)。應答包括與客戶機所請求相同的giaddr域。
  4. 中繼代理會從giaddr域中I P地址對應的接口中廣播應答。

1.4 DHCP服務配置

1.4.1 DHCP服務端配置

  • 第一步:安裝dhcp軟件包,來自base倉庫。

    [root@xuzhichao ~]# yum install dhcp -y
    

    查看dhcp包中提供的文件:

    [root@xuzhichao ~]# rpm -ql dhcp
    /etc/NetworkManager
    /etc/NetworkManager/dispatcher.d
    /etc/NetworkManager/dispatcher.d/12-dhcpd
    /etc/dhcp/dhcpd.conf        <==DHCP的配置文件
    /etc/dhcp/dhcpd6.conf       <==DHCP針對ipv6地址的配置文件
    /etc/dhcp/scripts
    /etc/dhcp/scripts/README.scripts
    /etc/openldap/schema/dhcp.schema
    /etc/sysconfig/dhcpd        
    /usr/bin/omshell
    /usr/lib/systemd/system/dhcpd.service   <==dhcp的服務啟用文件
    /usr/lib/systemd/system/dhcpd6.service
    /usr/lib/systemd/system/dhcrelay.service
    /usr/sbin/dhcpd
    /usr/sbin/dhcrelay
    /usr/share/doc/dhcp-4.2.5
    /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example    <==DHCP的配置文件的樣例 
    /usr/share/doc/dhcp-4.2.5/dhcpd6.conf.example
    /usr/share/doc/dhcp-4.2.5/ldap
    /usr/share/doc/dhcp-4.2.5/ldap/README.ldap
    /usr/share/doc/dhcp-4.2.5/ldap/dhcp.schema
    /usr/share/doc/dhcp-4.2.5/ldap/dhcpd-conf-to-ldap
    /usr/share/man/man1/omshell.1.gz
    /usr/share/man/man5/dhcpd.conf.5.gz
    /usr/share/man/man5/dhcpd.leases.5.gz
    /usr/share/man/man8/dhcpd.8.gz
    /usr/share/man/man8/dhcrelay.8.gz
    /usr/share/systemtap/tapset/dhcpd.stp
    /var/lib/dhcpd
    /var/lib/dhcpd/dhcpd.leases          <==記錄服務器已經分配的地址情況
    /var/lib/dhcpd/dhcpd6.leases
    
  • 第二步:修改dhcp的配置文件

    默認其配置文件/etc/dhcp/dhcpd.conf中沒有內容,可以把樣板文件復制過來進行修改

    [root@xuzhichao ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
    

    dhcp的配置文件格式如下:

    [root@xuzhichao ~]# vim /etc/dhcp/dhcpd.conf
    #authoritative;                                           <==若果此dhcp是正式的dhcp服務器,該字段應取消注釋
    log-facility local7;                                      <==日志信息,默認存放在/var/log/bootlog文件中
    
    subnet 192.168.50.0 netmask 255.255.255.0 {               <==標題段,指明網絡號和掩碼
      range 192.168.50.1 192.168.50.99;                       <==指定分配地址的范圍
      option domain-name-servers 192.168.50.1,8.8.8.8;        <==指定分配的DNS地址
      option domain-name "xu.com";                            <==指定分配的域名
      option routers 192.168.50.100;						  <==指定分配的網關地址	
      default-lease-time 6000;								  <==指定分配的默認租期,單位秒
      max-lease-time 72000;                                   <==指定分配的最大租期,單位秒                                           
    }
    

    其中dns,網關,租期等信息可以在全局下定義,也可以在subnet中定義,若兩者都有定義,以subnet中的為准。

    可以指定服務器提供dhcp服務的接口,在/etc/sysconfig/dhcpd文件中定義

    [root@xuzhichao ~]# cat /etc/sysconfig/dhcpd
    #DHCPDARGS="eth1"
    
  • 第三步:啟用dhcp服務

    注意:啟動dhcp服務前需要確保dhcp分配的網段在本機上存在同網段的可用地址。

    [root@xuzhichao ~]# ip add show eth2
    4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:2f:d0:e4 brd ff:ff:ff:ff:ff:ff
        inet 192.168.50.100/32 brd 192.168.50.100 scope global noprefixroute eth2
           valid_lft forever preferred_lft forever
        inet6 fe80::80b9:b869:e531:3141/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    
    #啟動dhcpd服務
    [root@xuzhichao ~]# systemctl start dhcpd.service
    
    #開機自啟dhcpd服務
    [root@xuzhichao ~]# systemctl enable dhcpd.service
    
    #查看dhcp服務的狀態
    [root@xuzhichao ~]# systemctl status dhcpd.service
    ● dhcpd.service - DHCPv4 Server Daemon
       Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled)
       Active: active (running) since Mon 2021-06-07 05:08:44 EDT; 6s ago
         Docs: man:dhcpd(8)
               man:dhcpd.conf(5)
     Main PID: 15392 (dhcpd)
       Status: "Dispatching packets..."
       CGroup: /system.slice/dhcpd.service
               └─15392 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
    
    #查看dhcp的監聽端口是否啟動
    [root@xuzhichao ~]# ss -una
    State       Recv-Q Send-Q  Local Address:Port                 Peer Address:Port              
    UNCONN      0      0           127.0.0.1:323                             *:*                  
    UNCONN      0      0                   *:67                              *:*       <==此為dhcp服務端的端口               
    UNCONN      0      0                   *:68                              *:*                  
    UNCONN      0      0               [::1]:323                          [::]:*            
    

1.4.2 DHCP客戶端配置

修改網卡和服務器位於同一網段,修改地址為自動獲取方式:

[root@centos7_6 ~]# nmcli connection add con-name eth2-auto type ethernet ifname eth2 ipv4.method auto 
Connection 'eth2-auto' (43205f88-3b6e-48a7-a93e-5e8138a1e18f) successfully added.
[root@centos7_6 ~]# nmcli connection up eth2-auto 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)

#查看eth2接口獲取的地址,網關,dns等信息
[root@centos7_6 ~]# ip add show eth2
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:16:20:d3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.1/24 brd 192.168.50.255 scope global noprefixroute dynamic eth2
       valid_lft 5993sec preferred_lft 5993sec
    inet6 fe80::da59:e2c9:e1eb:df70/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@centos7_6 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    101    0        0 eth1
0.0.0.0         192.168.50.100  0.0.0.0         UG    104    0        0 eth2
172.20.125.0    0.0.0.0         255.255.255.0   U     103    0        0 eth3
192.168.2.0     0.0.0.0         255.255.255.0   U     101    0        0 eth1
192.168.20.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.50.0    0.0.0.0         255.255.255.0   U     104    0        0 eth2
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@centos7_6 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search lan xu.com
nameserver 192.168.2.1
nameserver 192.168.50.1
nameserver 8.8.8.8       

查看服務器端的日志:

[root@xuzhichao ~]# tail /var/log/boot.log
Jun  7 05:08:44 xuzhichao dhcpd: Sending on   Socket/fallback/fallback-net
Jun  7 05:47:15 xuzhichao dhcpd: DHCPDISCOVER from 00:0c:29:16:20:d3 via eth2
Jun  7 05:47:16 xuzhichao dhcpd: DHCPOFFER on 192.168.50.1 to 00:0c:29:16:20:d3 (centos7_6) via eth2
Jun  7 05:47:16 xuzhichao dhcpd: DHCPREQUEST for 192.168.50.1 (192.168.50.100) from 00:0c:29:16:20:d3 (centos7_6) via eth2
Jun  7 05:47:16 xuzhichao dhcpd: DHCPACK on 192.168.50.1 to 00:0c:29:16:20:d3 (centos7_6) via eth2

1.4.2.1 dhclient工具

dhclient工具可以啟動一個dhcp客戶端去獲取一個地址,默認所有網卡都會去自動獲取地址。

默認后台執行,前台執行使用-d選項:

[root@centos7_6 ~]# dhclient -d
Internet Systems Consortium DHCP Client 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/virbr0-nic/52:54:00:b9:1a:89
Sending on   LPF/virbr0-nic/52:54:00:b9:1a:89
Listening on LPF/virbr0/52:54:00:b9:1a:89
Sending on   LPF/virbr0/52:54:00:b9:1a:89
Listening on LPF/eth3/00:0c:29:16:20:dd
Sending on   LPF/eth3/00:0c:29:16:20:dd
Listening on LPF/eth2/00:0c:29:16:20:d3
Sending on   LPF/eth2/00:0c:29:16:20:d3
Listening on LPF/eth1/00:0c:29:16:20:c9
Sending on   LPF/eth1/00:0c:29:16:20:c9
Listening on LPF/eth0/00:0c:29:16:20:bf
Sending on   LPF/eth0/00:0c:29:16:20:bf
Sending on   Socket/fallback
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 7 (xid=0x2cfed07b)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 8 (xid=0x52cd2021)
DHCPDISCOVER on eth3 to 255.255.255.255 port 67 interval 5 (xid=0x3ec4ade1)
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 3 (xid=0x7e857e5e)
DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 5 (xid=0x3e9927e7)
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5 (xid=0x7a7a899f)
DHCPREQUEST on eth1 to 255.255.255.255 port 67 (xid=0x3e9927e7)
DHCPOFFER from 192.168.2.1
DHCPACK from 192.168.2.1 (xid=0x3e9927e7)
bound to 192.168.2.157 -- renewal in 33243 seconds.
DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x7a7a899f)
DHCPOFFER from 192.168.20.254
DHCPACK from 192.168.20.254 (xid=0x7a7a899f)
bound to 192.168.20.16 -- renewal in 846 seconds.
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 6 (xid=0x7e857e5e)
DHCPDISCOVER on eth3 to 255.255.255.255 port 67 interval 9 (xid=0x3ec4ade1)
DHCPREQUEST on eth2 to 255.255.255.255 port 67 (xid=0x7e857e5e)
DHCPOFFER from 192.168.50.100
DHCPACK from 192.168.50.100 (xid=0x7e857e5e)
bound to 192.168.50.3 -- renewal in 2920 seconds.
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 18 (xid=0x2cfed07b)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 12 (xid=0x52cd2021)

dhclient -r會清空所有接口獲取到的地址,包括配置的靜態地址,重啟網絡服務才能恢復。慎用!

1.4.3 為終端分配固定地址

對於一些服務器需要獲取固定的IP地址的情況,可以根據終端的MAC地址分配固定的ip地址:

  • 在dhcp服務器的配置文件新增如下內容:

    [root@xuzhichao ~]# vim /etc/dhcp/dhcpd.conf
    host server {
      hardware ethernet 00:0c:29:16:20:d3;    <==指定客戶端的MAC地址
      fixed-address 192.168.50.10;            <==指定客戶端要分配的IP地址
      option routers 192.168.50.100;          <==指定網關,若不配置,會從subnet中分配                                                   
    }
    
  • 重啟dhcp服務:

    [root@xuzhichao ~]# systemctl restart dhcpd.service
    
  • 客戶端重新獲取ip地址:

    [root@centos7_6 ~]# dhclient -r eth2
    [root@centos7_6 ~]# dhclient  eth2
    [root@centos7_6 ~]# ip add show eth2
    4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:16:20:d3 brd ff:ff:ff:ff:ff:ff
        inet 192.168.50.10/24 brd 192.168.50.255 scope global dynamic eth2
           valid_lft 5995sec preferred_lft 5995sec
        inet6 fe80::639b:757c:18c4:4613/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    
  • 查看服務器端的相關日志:

    [root@xuzhichao ~]# cat /var/log/boot.log
    #客戶端主動放棄地址,發送RELEASE
    Jun  7 05:55:05 xuzhichao dhcpd: DHCPRELEASE of 192.168.50.3 from 00:0c:29:16:20:d3 via eth2 (found)
    #靜態分配地址過程
    Jun  7 06:13:26 xuzhichao dhcpd: DHCPDISCOVER from 00:0c:29:16:20:d3 via eth2
    Jun  7 06:13:26 xuzhichao dhcpd: DHCPOFFER on 192.168.50.10 to 00:0c:29:16:20:d3 via eth2
    Jun  7 06:13:26 xuzhichao dhcpd: Dynamic and static leases present for 192.168.50.10.
    Jun  7 06:13:26 xuzhichao dhcpd: Remove host declaration server or remove 192.168.50.10
    Jun  7 06:13:26 xuzhichao dhcpd: from the dynamic address pool for 192.168.50.0/24
    Jun  7 06:13:26 xuzhichao dhcpd: DHCPREQUEST for 192.168.50.10 (192.168.50.100) from 00:0c:29:16:20:d3 via eth2
    Jun  7 06:13:26 xuzhichao dhcpd: DHCPACK on 192.168.50.10 to 00:0c:29:16:20:d3 via eth2
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM