DHCP Server 設定及使用教學-使用 isc-dhcp 套件

此篇文章記錄在Debian/Ubuntu系統上使用isc-dhcp套件,安裝、設定及啟用DHCP Server功能的一個筆記。此篇文章會示範如何在DHCP Config設定IPv4 Pool,以可以讓Client在連上組織網路時,經由DHCP自動取得IPv4位址相關資訊。

本文教學將會在Debian/Ubuntu系統上操作,如果你使用其他的Linux發行版,當然也是可以參考本教學,但在指令方面需要自行更改以調整至適用你系統的環境。

**請注意isc-dhcp套件已不再被受到ISC公司的支援,已被新的isc-kea套件取代。

在設定IPv4 DHCP Pool前的準備:

 先整理好組織所使用的各網段資訊,比如:網段、子網路遮罩、Default Gateway和DNS位址。

 需排除的網段IP位址範圍(有些網路裝置是設定靜態IP位址或Default Gateway等等,都需要進行排除,不要讓DHCP進行發放)。

 需要使用到DHCP Options參數和資料。

 若DHCP Server與Client在不同一個網段的話,請務必在做routing的網路設備上設定好DHCP Relay(指向DHCP Server IP位址)。

 isc-dhcp套件可支援的isc-dhcp Options參數和資料。

 isc-dhcp套件支援的Option參數格式,可參考isc-dhcp Options格式文檔。

1)更新系統的套件資訊及安裝isc-dhcp-server套件。

Step 1:將Debian/Ubuntu系統的套件資訊與版本更新到最新。

sudo apt update && sudo apt upgrade -y

 

Step 2:安裝isc-dhcp-server套件

sudo apt install isc-dhcp-server -y

 

2)設定和編輯好DHCPD的Config檔。

Step 1:先進行備份原始『dhcpd.conf』設定檔。

sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.backup

 

**DHCPD的Config檔有多個設定,有大部分可以不用異動,用預設即可,之後可依照你組織環境去慢慢做最佳化調整,最基礎入門設定:先定義好網段、子網路遮罩、Default Gateway和DNS位址、IP位址租約時間等等的DHCP Options即可。

**『dhcpd.conf』設定檔有Global(全域)和Section(部分;每個不同網段的設定都為獨立的Section)設定,若每個網段都用同一個設定,比如『option domain-name-servers ns1.example.org;』,那就在Global區域定義一次即可,在設定Section時,就無須再次設定,除非有例外,在Section同時出現一樣的設定的話,比如在某個Section網段設定為『option domain-name-servers 8.8.8.8;』,那client在連線到這個網段時,DHCP就會派發此Section『option domain-name-servers 8.8.8.8;』,而不是Global的設定;否則若Section沒有此設定時,才會使用Global設定。

Step 2:編輯『dhcpd.conf』設定檔的Global設定。

sudo vim /etc/dhcp/dhcpd.conf

因為某些設定只需定義一次,故我們可以先從Global進行定義和設定:

Global設定大約在第9列開始:

**若你有定義其他Global設定的需求,請自行在下面繼續完成設定:

# ...
# option definitions common to all supported networks...
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
default-lease-time 600;
max-lease-time 7200;
# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;
# ...
項目說明
option domain-name "example.org";定義解析主機名的預設領域名稱;若有在『/etc/resolv.conf』設定了一個:比如『search example.com』的話,那Client在搜尋主機名稱時,就會幫Client加上此領域名稱;若組織網路沒此要求的話,此option可直接註解掉,可不設。
option domain-name-servers ns1.example.org, ns2.example.org;此設定可強制修改Client端的『/etc/resolv.conf』設定;講籠統一些就是讓Client知道要去哪找DNS主機,以讓Client可使用組織提供的DNS主機去解析位址,可使用域名或IP位址來指定DNS主機位址,若有多組DNS主機,請使用『,』隔開,以進行設定兩筆或最多三筆的DNS主機。
default-lease-time 600;定義Client可租用IP位址的時間,若Client沒特別要求租約時間的話,那麼就以此設定的租用時間為準,租期以秒計算,預設值為10分鐘。
max-lease-time 7200;類似『default-lease-time』,但此設定定義了Client可租用IP位址的最大時間,若Client要求租約時間大於此設定的話,那會強制使用此設定的租用時間為準,最大租期以秒計算,預設值為2小時。
ddns-update-style none;此設定使用預設即可,不用去做異動。

筆者本次Global設定,範例如下:

# ...
# option definitions common to all supported networks...
option domain-name "kjnotes.com";
option domain-name-servers ns1.kjnotes.com, ns2.kjnotes.com;
# default-lease-time值設定為1天
default-lease-time 86400;
# max-lease-time值設定為3天
max-lease-time 259200;
# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;
# ...

 

Step 3:接下來按照組織網路每個網段不同的需求,編輯Section部分的設定。

大約在63列左右下面開始新增你要配發IP的網段:

# ...
# A slightly different configuration for an internal subnet.
#subnet 10.5.5.0 netmask 255.255.255.224 {
#  range 10.5.5.26 10.5.5.30;
#  option domain-name-servers ns1.internal.example.org;
#  option domain-name "internal.example.org";
#  option subnet-mask 255.255.255.224;
#  option routers 10.5.5.1;
#  option broadcast-address 10.5.5.31;
#  default-lease-time 600;
#  max-lease-time 7200;
#}
#上面為dhcpd.conf提供的範例,下面開始新增你要為網段配發DHCP資訊的網段資訊:
# ...

從『dhcpd.conf』提供的範例及其他的設定參數,來了解DHCP的設定:

**若有其他Option需求,請自行在Section新增所需的Option設定。

項目說明
range 10.5.5.26 10.5.5.30;此網段可分發的IP範圍。
option subnet-mask 255.255.255.224;此網段的遮罩。
option routers 10.5.5.1;此網段的Gateway。
option broadcast-address 10.5.5.31;此網段的廣播位址;可不設。
ping-check true;此設定可在IP配發給Client時的前置測試,若某IP位址測試沒回應就會配發此IP位址給Client;現在一般裝置都不允許ping,故通常會設在Server或網路設備的網段。

比如筆者要配發網段資訊和設定範例如下:

VoIP網段(192.168.32.0/24)

#VLAN-NAME-VoIP_192.168.32.0/24
subnet 192.168.32.0 netmask 255.255.255.0 {
  range 192.168.32.100 192.168.32.200;
  option subnet-mask 255.255.255.0;
  option routers 192.168.32.254;
  ping-check true;
  default-lease-time 259200;
  max-lease-time 604800;
}

Staff網段(192.168.33.0/24)

#VLAN-NAME-Staff_192.168.33.0/24
subnet 192.168.33.0 netmask 255.255.255.0 {
  range 192.168.33.1 192.168.33.230;
  option subnet-mask 255.255.255.0;
  option routers 192.168.33.254;
}

Guest網段(192.168.34.0/24)

#VLAN-NAME-Guest_192.168.34.0/24
subnet 192.168.34.0 netmask 255.255.255.0 {
  range 192.168.34.10 192.168.34.200;
  option subnet-mask 255.255.255.0;
  option routers 192.168.34.254;
  option domain-name-servers 1.1.1.1, 8.8.8.8;
  option domain-name "guest.kjnotes.com";
  default-lease-time 28800;
}

下面為筆者個人的筆記,其他比較特殊的option需求:

 Aruba AP跟控制器報到的範例:

**『option serverip 192.168.30.150;』更改成當地網路環境控制器的IP或VRRP IP。

#VLAN-NAME-NAD_192.168.30.192/28
option serverip code 43 = ip-address;
class "vendor-class" {
  match option vendor-class-identifier;
}
subnet 192.168.30.64 netmask 255.255.255.224 {
  range 192.168.30.193 192.168.30.205;
  option routers 192.168.30.206;
  option subnet-mask 255.255.255.240;
  option domain-name-servers 168.95.1.1, 1.1.1.1;
  option domain-name "nad.kjnotes.com";
  default-lease-time 604800;
  max-lease-time 604800;
  ping-check true;
  subclass "vendor-class" "ArubaInstantAP" {
    option vendor-class-identifier "ArubaAP";
    option serverip 192.168.30.150;
  }
  subclass "vendor-class" "ArubaAP" {
    option vendor-class-identifier "ArubaAP";
    option serverip 192.168.30.150;
  }
}

 

Step 4:如果此台DHCP服務是組織主要的DHCP主機,則需要加『authoritative;』參數。

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
# 下面註解拿掉即可
authoritative;

 

Step 5:如果需要固定某台Client的IP位址,那可以在『dhcpd.conf』設定檔中看到如下的範例,在下面加你要的固定某台Client的MAC和IP位址即可:

# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag
# set.
#host fantasia {
#  hardware ethernet 08:00:07:26:c0:a5;
#  fixed-address fantasia.example.com;
#}
#筆者的範例
host KJie-PC {
hardware ethernet 11:22:33:44:55:A1;
fixed-address 192.168.22.220;
}
host KJie-BYOD {
hardware ethernet 11:22:33:44:55:A2;
fixed-address 192.168.22.221;
}
# ...

 

Step 6:重啟isc-dhcp-server服務,讓設定生效:

sudo systemctl restart isc-dhcp-server

 

3)DHCP Server監聽特定網卡介面的設定。

**基本上不用特別修改此設定,使用預設即可,但若DHCP主機有多張網卡介面,且僅允許DHCP Server監聽特定介面,那就進行修改此設定。

Step 1:先進行備份原始『isc-dhcp-server』檔案。

sudo cp /etc/default/isc-dhcp-server /etc/default/isc-dhcp-server.backup

 

Step 2:檢視主機上需監聽的網卡介面,並將需監聽的介面記錄下來,代號大概會是這樣,比如『eth1』、『eno1』、『ens160』或『enp5s0』等等。

ip link show

 

Step 3:編輯『/etc/default/isc-dhcp-server』檔案的設定。

sudo vim /etc/default/isc-dhcp-server

 

 Step 4:比如筆者想要監聽的介面為『eno1』:

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="eno1"

如果是要監聽兩個或以上的介面,那中間空白鍵隔開即可,比如筆者想要監聽的網卡介面為『eno1』和『eno2』:

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="eno1 eno2"

 

Step 5:重啟isc-dhcp-server服務,讓設定生效:

sudo systemctl restart isc-dhcp-server

 

4)系統防火牆要允許UDP Port 67的封包。

Step 1:Client在連上網路會傳送DHCPDISCOVE封包向網路進行廣播,如果DHCP主機有在使用防火牆服務,就需要監聽UDP Port 67,以Debian/Ubuntu來說,最常使用的防火牆為UFW,那可以輸入以下指令來允許UDP Port 67的封包:

sudo ufw allow 67/udp

 

5)可檢視DHCP服務已租出去的IP位址。

Step 1:若要檢視DHCP主機租出去的IP位址,可使用下面指令來檢視已分配給Client的IP位址資訊:

dhcp-lease-list

 

此篇文章上次修改日期:
2024/09/23