DHCP(動態主機配置協定, Dynamic Host Configuration Protocol)允許電腦利用網路來自動取得其在這個網路下的IP位址等網路配置資訊,如此一來就不用逐一地替每台電腦設定IP位址了!當裝置想要連上網路時,它會發送DHCP請求到這個網路,如果這個網路有DHCP伺服器存在,就會處理這個請求,並回覆給這台裝置應該要使用的IP位址,一旦裝置接受DHCP伺服器所傳來的IP位址,DHCP伺服器就會將剛才回覆給該台裝置的IP位址記錄下來,使這台裝置可以在這個網路下正常運作。



安裝DHCP伺服器

要在Ubuntu Server上安裝DHCP伺服器,可以直接在終端機中執行以下指令:

sudo apt install isc-dhcp-server

ubuntu-server-18-04-dhcp

接著使用vim等文字編輯器,來編輯/etc/dhcp/dhcpd.conf設定檔,指令如下:

sudo vim /etc/dhcp/dhcpd.conf

針對我們要提供DHCP服務的網路,增加subnet區塊。格式為:

subnet IPv4位址 netmask 子網路遮罩 {
}

例如:

subnet 192.168.57.0 netmask 255.255.255.0 {
}

DHCP伺服器分為處理IPv4的DHCP和處理IPv6的DHCPv6。/etc/dhcp/dhcpd.conf設定檔是DHCP的設定檔,/etc/dhcp/dhcpd6.conf設定檔是DHCPv6的設定檔。所以若要設定IPv6,接著還要使用vim等文字編輯器,來編輯/etc/dhcp/dhcpd6.conf設定檔,指令如下:

sudo vim /etc/dhcp/dhcpd6.conf

針對我們要提供DHCP服務的網路,增加subnet區塊。格式為:

subnet6 IPv6的CIDR {
}

例如:

subnet6 fe80:0:0:0::/64 {
}

存檔後,使用以下指令來重新啟動DHCP伺服器:

sudo systemctl restart isc-dhcp-server isc-dhcp-server6

ubuntu-server-18-04-dhcp

DHCP使用的UDP連接埠為67(DHCP客戶端則會使用UDP連接埠68來接收回覆),DHCPv6使用的UDP連接埠為547(DHCPv6客戶端則會使用UDP連接埠546來接收回覆),可以使用以下指令來查看DHCP伺服器是否有確實安裝成功。

sudo ss -ulnp | grep dhcp

ss指令可以顯示出Socket相關的資訊。-l參數可以只顯示正在監聽中的連線。若使用ss指令時都沒給任何參數的話,會忽略掉監聽中的連線。-u參數可以只顯示UDP連線。-n參數可以讓連接埠數字直接被輸出,而不是用一個名稱代替。-p參數可以顯示佔用連線的行程。

ubuntu-server-18-04-dhcp

如上圖,如果有看到DHCP伺服器有在監聽UDP連接埠67和547的話,就表示DHCP伺服器安裝成功了!

如果DHCP伺服器沒有啟動成功,以下指令可以查看DHCP伺服器啟動的狀態:

sudo systemctl status isc-dhcp-server isc-dhcp-server6

設定DHCP伺服器

設定子網路獨立服務

DHCP伺服器支援獨立運作在子網路中的常用服務,像是DNS、SMTP、POP3、NTP等。在DHCP伺服器的主設定檔/etc/dhcp/dhcpd.conf/etc/dhcp/dhcpd6.conf中,可以使用option命令來設定全域或是子網路區塊的參數。

例如我們要指定DHCP伺服器發配DNS的IP位址或是網域名稱給加入至這個子網路的裝置的話,可以在/etc/dhcp/dhcpd.conf設定檔中撰寫:

option domain-name-servers DNS的IP位址或是網域名稱;

如果有多台DNS,使用逗號,來隔開。

/etc/dhcp/dhcpd6.conf設定檔中撰寫:

option dhcp6.domain-name-servers DNS的IP位址或是網域名稱;

domain-name-serversdhcp6.domain-name-servers這兩個參數用來指定該DHCP伺服器所發配的DNS位址。其它服務的參數對應如下:

  • smtp-server:SMTP。
  • pop-server:POP3。
  • ntp-server:NTP。

設定發配的IP範圍

subnet區塊中,可以使用range命令來啟用並指定要發配給使用這台DHCP伺服器的裝置的IP範圍。如果是在subnet6區塊中,則需使用range6命令。

例如:

subnet 192.168.57.0 netmask 255.255.255.0 {
    range 192.168.57.150 192.168.57.160;
}
subnet6 fe80:0:0:0::/64 {
    range6 fe80::150 fe80::160;
}

以上設定,可以讓DHCP伺服器分別在192.168.57.0/24和fe80:0:0:0::/64子網路中,發配192.168.57.150~192.168.57.160的IPv4位址和fe80::150~fe80::160的IPv6位址。

發配出去的IP位址會有一個租用期限(lease-time),這個期限可以使用default-lease-timemax-lease-time命令來控制,單位是秒。IPv4位址的租約(lease)會存放在/var/lib/dhcp/dhcpd.leases檔案中;IPv6位址的租約(lease)會存放在/var/lib/dhcp/dhcpd6.leases檔案中。

設定MAC位址對應的IP

上面提到的subnet區塊可以針對某個子網路在某範圍的IP位址中選出一個發配出去。這邊要介紹的host區塊則是可以根據發出DHCP請求的裝置的MAC位址,來決定要給它什麼樣的IP位址。

無論在/etc/dhcp/dhcpd.conf/etc/dhcp/dhcpd6.conf中,寫法均如下:

host 可辨識的名稱 {
    hardware ethernet MAC位址;                                                                                                                                          
    fixed-address IP位址;
}

例如:

host server2 {
    hardware ethernet 08:00:27:39:e2:72;                                                                                                                                          
    fixed-address 192.168.57.104;
}

群組化設定

/etc/dhcp/dhcpd.conf/etc/dhcp/dhcpd6.conf設定檔中,命令的撰寫位置會有其影響範圍,下層的區塊會沿用上層區塊的命令,但是在下層區塊中也可以透過命令來覆寫掉上層的設定。

對於那些關聯性很高的設定區塊,我們可以將它們組成group區塊,以共用部份相同的命令。

例如:

group {
    option domain-name-servers 192.168.56.103;
      
    host server2 {
        hardware ethernet 08:00:27:39:e2:72;                                                                                                                                          
        fixed-address 192.168.57.104;
    }

    host server3 {
        hardware ethernet 08:00:27:39:e3:56;                                                                                                                                          
        fixed-address 192.168.57.105;
    }

    subnet 192.168.57.0 netmask 255.255.255.0 {
        range 192.168.57.150 192.168.57.160;
    }
}