伺服器架設篇 - RockyLinux 9

第九章、區域網路參數供應者:DHCP, NTP

區域網路的服務中,最重要的就是 DHCP, DNS 這兩個!另外,時間同步的 NTP 也挺重要的!

最近更新時間: 2023/12/04

不論是在家裡、小型辦公室、企業內分部門的辦公室,大部分的環境都還是需要網路的。那網路參數主要由誰分配呢? 當然就是 IP 分享器後端的 DNCP 服務所提供!我們在介紹網路設定時,都還有主機名稱的設定呢!那要由誰提供? 基本上當你由 DHCP 取得 IP 位址後,自然就可以透過 DNS 對應的正反解來取得正確的主機名稱了!所以,主要的區域網路的網路參數分配, 就得要 DHCP 與 DNS 服務喔!DNS 我們在前章已經介紹過,所以這裡主要介紹 DHCP 喔! 另外,不同主機間的時間同步非常重要!例如目前網際網路通用的 https 協定中, 數位簽章憑證就是以時間戳記來確認是否為合法的主機名稱!此時,如果時間戳記有誤,就可能產生很多問題! 所以,在區域網路內架設一部給內部主機同步的時間伺服器,也是可以思考的一個方向!

9.1、區域網路內的網路參數

還記得第四章我們談到過每一部可以連上網路的主機,應該都要有相關的網路參數與主機名稱吧!網路參數有自動取得與手動設定, 想想看,如果你的區域網路內有 50 部主機需要管理好了,那你會跟所有的用戶說好他們的主機參數,然後再教導你的用戶們如何設定? 還得要隨時注意用戶有沒有設定錯誤網路參數?否則,可能會影響到整體工作的進行啊!想想就很煩對吧!如果有伺服器可以提供這個功能, 我們只要讓用戶在開機時,選擇『自動取得 IP』的功能,那網路參數主機名稱就可以自動設定妥當! 這樣也不會有網路參數手動設定錯誤的情況!想想看,這樣比較輕鬆愉快吧!

只是要注意是,IP 位址、子網路遮罩、通訊閘、DNS 伺服器的參數都是由 DHCP (Dynamic Host Configuration Protocol, 動態主機設定協定) 服務提供的,主機名稱則是由其他 DNS (Domain Name Service, 領域名稱服務) 服務提供的! 所以要分兩部份來設定。而某些企業對員工連外的限制比較高,甚至於連網路時間校正的服務通通得要放到企業內部! 所以,那個 NTP (Network Time Protocol) 時間伺服器的設定也是需要處理的。

9.1.1、DHCP 的運作原理

在區域網路裡面,當你的用戶端電腦開機或者是重新啟動網路,然後使用的是自動取得 IP 位址的模式, 那就是啟用 dhcp client 功能的意思!此時用戶端電腦會向整個區域網路進行廣播!這就有點像是你剛剛進到班上, 然後就開始大叫:『我可以坐在哪個位置上?那個誰誰誰可以跟我說一下座位表』這樣的感覺。那你應該就會想到啊, 那個『誰誰誰』應該是要存在的吧?當然,那個就是 DHCP 伺服器本身!你當然可以說那就是班長大人! 整體運作的情況我們可以用下圖來表示:

圖 9.1.1、DHCP 在 client / server 之間運作的情況
圖 9.1.1、DHCP 在 client / server 之間運作的情況(圖片大致參考文末 netmanias 資料改編而來)

整體流程大概可以這樣解釋:

  1. DHCP Discover: 用戶端的 dhcp client 廣播搜尋整個區網:
    此時 client 端電腦還沒有 IP 位址等網路參數可用,所以主要是透過廣播 (broadcast) 的方式,向整個區網探索 DHCP 伺服器的存在。如上圖所示,所以不論是 layer 2 的硬體位址 (網卡卡號) 還是 layer 3 的 IP 位址, 主要目標位址都是廣播位址~而僅有發送者的網卡 (macPC) 會在封包表頭上而已。
  2. DHCP Offer: 伺服器端供給網路參數:
    DHCP 伺服器收到這個要求的封包之後,會先查看自己的 dhcp 設定,然後找出能夠給這個用戶的網路參數, 還有可能會針對這個來源端硬體卡號 (macPC) 給予固定的 IP 位址。確認這些資料可以提供之後,因為已經知道來源的卡號, 因此在 layer 2 主要是以點對點傳輸的 unicast 傳遞資料,但是此時用戶端還沒有 IP 位址,所以 layer 3 還是使用 broadcast 的方式廣播喔!
  3. DHCP Request: 來自用戶端的要求:
    用戶端一般都是能接受該網路參數的,只是會將剛剛收到的 offer 資料回覆給 DHCP server,並向 DHCP server 要求 (request) 這個可用的網路參數!同樣的,此時用戶端還是沒有 IP 位址,但是已經知道了 DHCP server 的網卡卡號, 所以 layer 2 也是 unicast 而 layer 3 則是 broadcast。
  4. DHCP Acknowledgment: 來自伺服器端的確認:
    伺服器在收到用戶端的要求之後,將該網路參數實際發放出去,同時將所有設定 (網路參數與租約時間等) 記錄下來。 但是依舊要注意的是,用戶端在此時還是沒有 IP 位址,因此此時的封包在 layer 2 依舊是 unicast 而在 layer 3 則還是 broadcast 喔!
所謂的廣播 (broadcast) 是發送端送出去的封包,在區域網路內任何主機都可以收到!就是字面上的意義,廣播。 所以的單點傳播 (unicast) 則是發送端與目的端兩者彼此通訊,而不是漫無目的的發送一個廣播而已。

完成這整組流程之後,用戶端將收下來的網路參數設定到自己的系統上!於是就有 IP 位址與相關的 TCP/IP 網路參數了。然後再透過 IP 位址與 DNS 查詢資料的結果,來直接設定好自己的主機名稱! 所以,最終還是需要 DNS 服務!這也是為啥我們在前一章先討論了 DNS 的緣故。

  • 關於 IP 位址的指定:固定與動態 IP 位址

根據圖 9.1.1 以及上述的說明當中,DHCP server 在進行 DHCP offer 的動作時,會去自己的設定檔當中找尋這個用戶的資料。 那從上面的 broadcast 與 unicast 的動作當中,我們也能理解,事實上 DHCP 大概只會知道用戶端的網卡卡號 (MAC Address) 而已。 所以,我們在 DHCP 伺服器的設定上,就可以透過用戶端的卡號來提供該網卡一個固定的 IP 位址,這就是所謂的固定 IP 位址方式。 如果沒有特殊的指定,那麼通常 DHCP 就會依據設定,提供一連續的 IP 位址當中的一個來 offer 給用戶端而已, 這種情況就是所謂的動態 IP 位址設定方式囉。

  • 關於租約所造成的問題與租約期限:

由於 DHCP 服務通常是利用一個池子 (pool) 儲存一段 IP 位址,然後大部分都是透過動態分配的方式分配給來要求網路參數的用戶群。 客戶群總是可能來來去去的,因此,這些網路參數必須要能夠回收才行!於是,就有所謂的租約時間。當用戶端使用這組網路參數超過租約時間, 那 IP 位址與網路參數就會被 DHCP server 回收了。問題是,用戶端使用電腦的時間可能會超過租約時間啊! 所以,一般來說,用戶端系統都會主動的去續約 (renew) 啦!

如果說租約時間是 3600 秒的話,那麼在到達一半的租約時間,也就是 3600/2 = 1800 秒的時候,用戶端就會進行 renew 的動作! 進行租約延期~此時 DHCP server 就會重新訂定租約時間,於是,用戶端電腦又可以有 3600 秒的時間來使用了。當然, 3600 秒只是一個範例, 你可以將租約時間想成 T 小時,所以每隔 0.5T 小時,用戶端電腦就會主動去跟 DHCP server 更新租約的意思啦!所以, 只要用戶端電腦還啟用著,理論上,就不會有租約到期的問題。

那什麼時候租約會到期呢?大概有兩個情況,一個是使用者電腦關閉 (power off),DHCP 伺服器在租約時間到期前, 並沒有發現用戶端來更新租約,自然就過期了。另一種則是用戶端主動告知 server 說要釋出租約!在 windows 系統可以使用『 ipconfig /release 』釋放,在 Linux 則能使用『 dhclient -r [網卡] 』來釋放。

  • 同區網有多部 DHCP 伺服器的困擾:

在無人管理的環境中,或者是比較多實驗室的複雜網路環境下,使用者為了自己的應用,可能會自行安插 IP 分享器, 或者是 wifi AP 存取點在有線網路環境中。然後可能因為安插的網路線錯誤 (應該安插到 WAN 卻插到 LAN),將可能導致區域網路內有多個 DHCP server 的窘境,偏偏這種窘境還真的挺常發生的...這時網路環境會發生什麼問題呢?

因為 DHCP client 的第一步是『 DHCP Discover 的廣播』情況,所以是對整個區網做廣播!於是,DHCP server 是先回應的先贏! 所以,你的用戶端不會知道區域網路裡面的那一部 DHCP server 才是正確的,而是有人回應就大部分接受...也因為這樣,在多部 DHCP server 存在時,你接到的網路參數,有可能就會是錯誤的!那將可能導致你的電腦沒有網際網路的狀況。所以,不要隨便在你無法控制的網路環境中加上 DHCP server...,否則最後被查到有問題的兇手~可能會被吊起來打~

9.1.2、DHCP Relay 的運作原理

回到前一個小節的圖示中,我們知道 DHCP client/server 都是在同一個區域網路裡面,畢竟是透過廣播的方式來進行 DHCP 的探索 (Discover)。 但是,如果你有多個區域網路呢?舉例來說,我們目前的規劃,就有 ap, lan, dmz 等三個內部的區域網路,這樣,要每個區域網路都放一台 DHCP 伺服器嗎?你可能會說,沒關係啊!反正我們的 DHCP server 直接架在 master 骨幹系統上就好!不就解決了!問題是,許多的骨幹系統, 其實是高階的 switch 交換器耶!並不是作業系統啊!那妳就很想要整個環境只搭建一部 DHCP server 而已,不想要這麼多台啊! 未來比較好維護啊!那怎辦?這時就得要透過 DHCP relay (DHCP 中繼服務) 了!

以我們的環境來說,在 master 骨幹系統上面設定好 DHCP relay,然後將所有的 DHCP 封包資訊通通丟給實際負責的 DHCP server 就好了! 其他不用理會~而 DHCP server 就得要設定好不同的區網分享的設定~這樣就好!但是...如同前一小節說的,DHCP 封包並沒有 IP 位址啊! 你也知道網卡卡號不能跨路由~那到底 DHCP relay 是怎麼達到 DHCP 中繼的?基本上可以這樣看:

圖 9.1.2、DHCP Relay 運作的情況
圖 9.1.2、DHCP Relay 運作的情況(圖片大致參考文末 netmanias 資料改編而來)

如上圖所示,步驟還是分成 4 個,只是 DHCP relay 在幫用戶端傳送 DHCP 的時候,必須要知道 DHCP server 的實際 IP 位址, 然後傳輸的 DHCP 資料裡面,可能還得要包含特別的參數,常見使用的參數是 circuit id 這個電路識別碼~一般來說, 骨幹交互器 (switch) 會在封包上面加上埠口號碼這個 circuit id 資訊,讓 DHCP server 去判段封包來自於那一個埠口, 也就知道來自於那一個網段了!而在我們的 Linux DHCP relay 環境下,可以加上用戶端所在網卡的卡號來作為 circuit id! 這樣也能知道用戶端發起的來源位置!

所以,在上圖左邊的畫面跟一般的 DHCP 流程一致,但是在右側 DHCP relay 與 server 之間的交談,就主要通通是 unicast 的溝通方式了! 畢竟彼此都知道對方的實際網路位置啊~

9.1.3、區域網路 DHCP 佈建與 DHCP 伺服器硬體佈建

在我們的虛擬環境中,目前共有 4 個網段,除了外部的 192.168.201.0/24 需要配合你的實際網路環境之外, 其他的無線網路(AP)、LAN 網路、DMZ 網路,都是我們可以自己設定的!而 AP 與 LAN 網路的『用戶端』就像我們說到的情境! 需要自動取得網路參數較佳。DNS 與 NAT 服務倒是可以直接設定到 DMZ 沒有問題!但是 DHCP 伺服器卻通常得要放置到同一個區網內, 這是因為 DHCP 主要是透過區域網路廣播來詢問網路參數提供者的!所以,比較正常的情況下,我們會將 DHCP 服務設定在 master 骨幹系統上!不過呢,骨幹系統的服務是越單純越好,所以原則上,在這份文件中,我們希望所有的服務都不要架設在 master 上面!

所以,底下我們會將 DHCP 獨自放在 DMZ 的網域中,而 NTP 同樣架設在同一部系統上。但是由於還是需要 DHCP relay 的協助, 因此 master 骨幹系統還是得要安裝 DHCP relay 服務才行!只是為了管理方便,我們會將 DHCP relay 的 log 分別放置到不同的登錄檔中, 以方便未來的偵測與維護,讓 master 的登錄紀錄資訊會比較單純~

  • 整體網路環境與服務相關性

根據上述的說明,我們的區域網路與伺服器連線的相關性有點像底下這樣~DHCP/NTP 放置到 DMZ 的網域內, 設定的 DNS 系統則為 192.168.30.211, 192.168.30.212 這樣。DNS 伺服器的架設請參考前一章。

圖 9.1.3、本章節伺服器/用戶端相關性圖示
圖 9.1.3、本章節伺服器/用戶端相關性圖示
  • 處理硬體設定檔 (XML)、硬碟檔 (.img) 等資訊

要先記得,我們的母系統是在 cloud 的主機底下,然後我們複製的伺服器來源檔案,主要是由 server_raw 來的! 現在就讓我們來處理 XML 以及映像檔資料:

# 1. 複製 server_raw 給 server_dhcp 伺服器檔
[root@cloud ~]# cd /kvm/img/
[root@cloud img]# cp server_raw.img server_dhcp.img

# 2. 前往設定 xml 設定檔
[root@cloud img]# cd /kvm/xml/
[root@cloud xml]# cp server_raw.xml server_dhcp.xml
[root@cloud xml]# vim server_dhcp.xml
  <name>server_dhcp</name>
    <loader readonly="yes" type="pflash" secure="no">/usr/share/edk2/ovmf/OVMF_CODE.fd</loader>
    <nvram>/kvm/xml/server_dhcp.uefi.fd</nvram>
      <source file="/kvm/img/server_dhcp.img"/>
      <mac address="52:54:00:00:30:c3"/>
    <graphics type="vnc" port="5933" listen="0.0.0.0" passwd="rocky9">

# 3. 啟動虛擬機器並觀察
[root@cloud xml]# virsh create server_dhcp.xml
[root@cloud xml]# virsh list
 Id   Name                State
-----------------------------------
 1    master              running
 2    client_raw          running
 13   server_dns_master   running
 15   server_dns_slave    running
 16   server_dhcp         running

[root@cloud xml]# netstat -tlunp | egrep '^Pro|qemu'
Proto Recv-Q Send-Q Local Address   Foreign Address  State   PID/Program name
tcp        0      0 0.0.0.0:5909    0.0.0.0:*        LISTEN  786802/qemu-kvm
tcp        0      0 0.0.0.0:5920    0.0.0.0:*        LISTEN  786920/qemu-kvm
tcp        0      0 0.0.0.0:5933    0.0.0.0:*        LISTEN  1015366/qemu-kvm
tcp        0      0 0.0.0.0:5932    0.0.0.0:*        LISTEN  985321/qemu-kvm
tcp        0      0 0.0.0.0:5931    0.0.0.0:*        LISTEN  984148/qemu-kvm
  • 網路佈建規劃

搭建 DHCP 伺服器的硬體不難啊~只是要注意的是,我們的網路參數大概會設定成這樣:

  • IP address: 192.168.30.213/24
  • Gateway: 192.168.30.254
  • DNS: 192.168.30.211, 192.168.30.212
  • DNS server: server.vbird, lan.vbird, ap.vbird
  • hostname: dhcp.server.vbird

底下的動作需要在剛剛啟用的虛擬機底下實做,這是因為我們會修改網路參數的緣故啊!

# 在 DHCP 虛擬機 (VNC 環境) 完成如下的參數設定:
[root@server001 ~]# hostnamectl hostname dhcp.server.vbird
[root@dhcp ~]# nmcli connection modify enp1s0 ipv4.method manual ipv4.addresses 192.168.30.213/24 \
> ipv4.gateway 192.168.30.254 ipv4.dns 192.168.30.211,192.168.30.212 \
> ipv4.dns-search server.vbird,lan.vbird,ap.vbird
[root@dhcp ~]# nmcli connection up enp1s0
[root@dhcp ~]# curl https://linux.vbird.org
# 有回應網頁資訊就對了!
  • 更新 DNS zone file

因為我們多了一個主機名稱的對應,為了讓這部主機的名稱與 IP 位址能對應,所以我們就得要去修改 master DNS 的 server.vbird 的 zone file 內容才行!你應該要在 master DNS (dns1) 上面處理 intranet 的 server.vbird zone file,也就是 /var/named/named.server.vbird 這個檔案內容才對!

# 底下所有的動作都應該要在 dns1 (master DNS) 上面動作:
[root@dns1 ~]# vim /var/named/named.server.vbird
@  IN SOA  dns1.server.vbird. adm.mail.server.vbird. ( 2023120301 3H 15M 1D 600 )
....
dhcp    IN A    192.168.30.213
....

[root@dns1 ~]# vim /var/named/named.192.168.30
@ IN SOA  dns1.server.vbird. adm.mail.server.vbird. ( 2023120301 3H 15M 1D 600 )
...
213     IN PTR  dhcp.server.vbird.
...

[root@dns1 ~]# systemctl restart named-chroot
[root@dns1 ~]# dig +short dhcp.server.vbird
192.168.30.213
[root@dns1 ~]# dig +short -x 192.168.30.213
dhcp.server.vbird.
[root@dns1 ~]# dig +short dhcp.server.vbird @dns2
192.168.30.213
[root@dns1 ~]# dig +short -x 192.168.30.213 @dns2
dhcp.server.vbird.
# 從兩部 DNS 系統上面都看到相同的 IP 位址與主機名稱了!
  • 額外的區網用戶端硬體配置

有 DHCP server 後,當然需要有 client 的硬體才行~我們的 client_raw 系統還活著!所以可以作為 lan 網段的測試, 但那個得要到 DHCP relay 才會用到...目前需要的是在 DMZ 裡面的用戶端!因此,我們還額外製作出一個 DMZ 的測試環境~ 硬體的配置得要在 cloud 母系統喔!

# 1. 複製 server_raw 給 server_dhcp 伺服器檔
[root@cloud ~]# cd /kvm/img/
[root@cloud img]# cp server_raw.img server_10.img

# 2. 前往設定 xml 設定檔
[root@cloud img]# cd /kvm/xml/
[root@cloud xml]# cp server_raw.xml server_10.xml
[root@cloud xml]# vim server_10.xml
  <name>server_10</name>
    <loader readonly="yes" type="pflash" secure="no">/usr/share/edk2/ovmf/OVMF_CODE.fd</loader>
    <nvram>/kvm/xml/server_10.uefi.fd</nvram>
      <source file="/kvm/img/server_10.img"/>
      <mac address="52:54:00:00:30:10"/>
    <graphics type="vnc" port="5940" listen="0.0.0.0" passwd="rocky9">

# 3. 啟動虛擬機器並觀察
[root@cloud xml]# virsh create server_10.xml
[root@cloud xml]# virsh list
 Id   Name                State
-----------------------------------
 1    master              running
 2    client_raw          running
 13   server_dns_master   running
 15   server_dns_slave    running
 16   server_dhcp         running
 17   server_10           running

這部用戶端系統比較有趣,因為 server_10 是跟 server_dhcp 在同一個網域內,所以可以簡單的透過原先 dhcp server 預設的情況來架設好! 這樣大家比較有 full 啦!

9.2、架設 DHCP 服務

DHCP 這個功能有非常多的軟體可以達成,ISC 官網建議使用新的 Kea DHCP 軟體,功能比較強大!不過,在 RHEL 官網中,目前建議還是使用原本的 ISC DHCP 軟體~相關資料請查閱文末的參考資料中。另外,Kea DHCP 目前並沒有推出 DHCP relay 的軟體,所以,relay 還是得用原有的 DHCP relay 就是了。不過,總的來說,對於 DHCP 任務影響不大!我們還是使用原先的 DHCP 伺服器軟體。 另外,跟 DHCP 有關的還有 IP 的版本,IPv4 與 IPv6 使用的服務與設定檔並不相同~IPv6 的設定較為複雜~ 所以,我們底下主要先以 IPv4 為主來介紹的喔~

9.2.1、簡易的設定與啟動 DHCP 服務

在 RHEL 9 的衍生產品中,安裝的 DHCP 伺服器軟體為 dhcp-server,讓我們來安裝好之後瞧瞧這個軟體配置吧!

  • 安裝 dhcp-server 軟體

先將軟體裝起來!

# 安裝/查看 dhcp-server
[root@dhcp ~]# yum -y install dhcp-server
[root@dhcp ~]# rpm -ql dhcp-server
/etc/dhcp
/etc/dhcp/dhcpd.conf           # DHCP 主設定檔:針對 IPv4
/etc/dhcp/dhcpd6.conf          # DHCP 主設定檔:針對 IPv6
....
/usr/sbin/dhcpd                # DHCP 主程式
...
/usr/share/doc/dhcp-server/dhcpd.conf.example  # DHCP 設定範例檔
...
/var/lib/dhcpd/dhcpd.leases    # DHCP 租約紀錄檔:針對 IPv4
/var/lib/dhcpd/dhcpd6.leases   # DHCP 租約紀錄檔:針對 IPv6

主設定檔為 /etc/dhcp/dhcpd.conf,不過,這個檔案基本內容是空的!可以查看的應該是上面表格當中的 dhcpd.conf.example 檔案。 你可以將上述的檔案複製成為 dhcpd.conf,然後再去一個一個修改即可。在設定檔當中的基本語法大致上是這樣:

  • 『 # 』為註解符號;
  • 除了右括號 ")" 後面之外,其他的每一行設定最後都要以『 ; 』做為結尾!重要!
  • 設定項目語法主要為:『 [參數代號] [設定內容] 』,例如:
    default-lease-time 259200;
  • 某些設定項目必須以 option 來設定,基本方式為『 option [參數代碼] [設定內容] 』例如:
    option domain-name "your.domain.name";
  • 針對 DMZ 環境下,同網域的 DHCP 服務設定範例

DHCP 的原理要花比較多時間來處理,設定則相對簡單!假設我們想要達成底下的功能:

  • 不用動態更新用戶端的 DNS 對照 (ddns-update-style)
  • 將登錄檔以 local7 的服務方式處理
  • 分配的網域為 192.168.30.0/24 ,該網域的底下的配置為:
    • 預設租約時間為 1 小時
    • 最大租約時間為 8 小時
    • 主要僅分配出 192.168.30.1 ~ 192.168.30.10 的動態 IP 位址
    • 預設 gateway 為 192.168.30.254
    • 預設 DNS 伺服器為 192.168.30.211, 192.168.30.212
    • 預設的 domain 為 server.vbird

基本項目大概就上面這些而已~接下來就讓我們來一項一項設定好吧!注意喔,底下的主設定檔其實就是搭配上面的清單項目內容建置的! 所以可以搭配著看喔!

# 1. 先設定主設定檔
[root@dhcp ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
log-facility local7;

subnet 192.168.30.0 netmask 255.255.255.0 {
    default-lease-time 3600;
    max-lease-time 28800;
    range 192.168.30.1 192.168.30.10;
    option routers 192.168.30.254;
    option domain-name-servers 192.168.30.211, 192.168.30.212;
    option domain-name "server.vbird";
}
# 每個設定的說明,都請參考上面的清單項目!有搭配清單項目喔!

[root@dhcp ~]# systemctl enable --now dhcpd
[root@dhcp ~]# journalctl -xeu dhcpd.service
....
Dec 03 22:24:46 : Config file: /etc/dhcp/dhcpd.conf
Dec 03 22:24:46 : Database file: /var/lib/dhcpd/dhcpd.leases
Dec 03 22:24:46 : PID file: /var/run/dhcpd.pid
Dec 03 22:24:46 : Internet Systems Consortium DHCP Server 4.4.2b1
....
Dec 03 22:24:46 : Wrote 0 leases to leases file.
Dec 03 22:24:46 : Listening on LPF/enp1s0/52:54:00:00:30:c3/192.168.30.0/24
Dec 03 22:24:46 : Sending on   LPF/enp1s0/52:54:00:00:30:c3/192.168.30.0/24
Dec 03 22:24:46 : Sending on   Socket/fallback/fallback-net
Dec 03 22:24:46 : Server starting service.
# 可以看到主設定檔、租約時間檔、監聽界面資料等!

[root@dhcp ~]# netstat -tlunp
Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name
udp        0      0 0.0.0.0:67    0.0.0.0:*       12637/dhcpd

[root@dhcp ~]# firewall-cmd --list-services
cockpit dhcpv6-client ftp http https ssh
[root@dhcp ~]# firewall-cmd --remove-service={cockpit,dhcpv6-client,ftp,http,https}
[root@dhcp ~]# firewall-cmd --add-service=dhcp
[root@dhcp ~]# firewall-cmd --list-services
dhcp ssh
[root@dhcp ~]# firewall-cmd --runtime-to-permanent
# 最後將防火牆設定妥當就 OK 啦!

基本上,主設定檔就這樣處理完畢啦!接下來就等待用戶端來要求 IP 位址等網路參數而已!

9.2.2、用戶端的設定(含 search) 及伺服端租約檔查閱

現在,讓我們來到 server_10 的系統中,該系統我們已經在 9.1.3 當中建立起來,直接使用 VNC 連線到終端機, 然後將 Network Manager 設定成為使用 dhcp 的功能,不過,還需要加入 domain search 喔!不然 /etc/resolv.conf 不會主動更新 search 的項目!不過我們曾經設定過 NetworkManager 了,所以需要將一些資料移除才行!

# 底下的工作全部都在 server_10 上面完成!預設主機名稱會是 server001
[root@server001 ~]# nmcli connection show enp1s0 | grep ipv4
ipv4.method:         manual
ipv4.dns:            120.114.100.1,168.95.1.1
ipv4.dns-search:     --
ipv4.addresses:      192.168.30.1/24
ipv4.gateway:        192.168.30.254
# 上面這幾個項目,很多都要清空!要增加的是 dns-search 而已

[root@server001 ~]# nmcli connection modify enp1s0 ipv4.method auto ipv4.dns '' \
> ipv4.dns-search 'server.vbird,lan.vbird,ap.vbird' ipv4.addresses '' ipv4.gateway ''
[root@server001 ~]# nmcli connection up enp1s0

[root@server001 ~]# nmcli connection show enp1s0
IP4.SEARCHES[1]:     server.vbird
IP4.SEARCHES[2]:     lan.vbird
IP4.SEARCHES[3]:     ap.vbird
DHCP4.OPTION[1]:     dhcp_client_identifier = 01:52:54:00:00:30:10
DHCP4.OPTION[2]:     dhcp_lease_time = 3600
DHCP4.OPTION[3]:     dhcp_server_identifier = 192.168.30.213
DHCP4.OPTION[4]:     domain_name = server.vbird
DHCP4.OPTION[5]:     domain_name_servers = 192.168.30.211 192.168.30.212
DHCP4.OPTION[6]:     expiry = 1701618387
DHCP4.OPTION[7]:     ip_address = 192.168.30.1
....
DHCP4.OPTION[25]:    routers = 192.168.30.254
DHCP4.OPTION[26]:    subnet_mask = 255.255.255.0
# 可以看到 IP 位址,還有 DHCP server 與租約的相關訊喔!

很簡單的,你的 client 未來都可以擁有這個 IP 位址了~只要不斷線或者因為 IP 位址池子內的 IP 數量被用完, 那你都能使用該 IP 位址啦!通常 DHCP server 都會從 range 的第一個 IP 位址開始發放!所以我們就拿到 192.168.30.1/24 這個 IP 位址囉。

  • DHCP server 的租約時間資料

回到 DHCP server 上面,我們來看看租約時間檔案呈現什麼效果:

[root@dhcp ~]# date
Sun Dec  3 23:00:14 CST 2023

[root@dhcp ~]# cat /var/lib/dhcpd/dhcpd.leases
....
lease 192.168.30.1 {
  starts 0 2023/12/03 14:46:27;    < 時間都在以前!現在變成未來?
  ends 0 2023/12/03 15:46:27;
  cltt 0 2023/12/03 14:46:27;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 52:54:00:00:30:10;  < 會紀錄這部系統的 MAC 卡號喔!
  uid "\001RT\000\0000\020";
  client-hostname "server001";
}

首先,時間不太對勁~怎麼會是過去式?原來 dhcpd 預設紀錄的是 UTC 時間,並不是本地端時間!所以,我們可以嘗試修改成為本地時間。 再來,用戶端主機名稱之前被我們設計過,所以目前的主機名稱並不會隨著 IP 位址與 DNS 的查詢而改變!這就怪怪的! 有個簡單的方法是,直接刪除用戶端的 /etc/hostname 即可!如果想要固定主機名稱,未來可再使用 hostnamectl 重新設定回來即可!

9.2.3、固定 MAC 位址對應 IP 位址及租約紀錄改本地時間

在我們的規劃中,之前建置的 server_10 這部用戶端系統,基本上應該是需要取得 192.168.30.10/24 這樣的 IP 位址才對! 也就是說,我們需要將該系統的 IP 位址對照為固定 IP 位址,而不是隨機的!那要如何處理?其實就是透過硬體位址來指定而已! 另外,我們也想要使用本地端時間取代 UTC 的時間參數設計在租約檔案當中!所以,我們應該要這樣做個修改比較好:

# 
[root@dhcp ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
log-facility local7;
db-time-format local;

subnet 192.168.30.0 netmask 255.255.255.0 {
    default-lease-time 3600;
    max-lease-time 28800;
    range 192.168.30.1 192.168.30.10;
    option routers 192.168.30.254;
    option domain-name-servers 192.168.30.211, 192.168.30.212;
    option domain-name "server.vbird";
}
host "server10" {
    hardware ethernet 52:54:00:00:30:10;
    fixed-address 192.168.30.10;
}
# host 就是固定 IP 位址的設定!要注意 host 需要寫在 global 當中喔!

[root@dhcp ~]# systemctl restart dhcpd
[root@dhcp ~]# journalctl -xeu dhcpd.service
# 盡量不要出現紅字的錯誤!雖然有的錯誤是可忽略的~

上面的特殊字體部份,就是這次新增的設定!host 可以重複出現多次~一個代表一部主機。現在,回到用戶端重新取得 DHCP 傳來的 IP 參數看看:

# 請在 server10 的環境下實做
[root@server10 ~]# nmcli connection up enp1s0
[root@server10 ~]# ip addr show enp1s0 | grep 'inet '
    inet 192.168.30.10/24 brd 192.168.30.255 scope global dynamic noprefixroute enp1s0

這樣,未來這部系統無論進行什麼動作,只要網路卡不變,那麼它取得的 IP 位址,應該就不變了!那麼這時候的 DHCP server 顯示的租約檔案會變怎樣?

[root@dhcp ~]# journalctl -xeu dhcpd.service
....
Dec 04 09:16:10 : DHCPDISCOVER from 52:54:00:00:30:10 via enp1s0
Dec 04 09:16:10 : DHCPOFFER on 192.168.30.10 to 52:54:00:00:30:10 via enp1s0
Dec 04 09:16:10 : Dynamic and static leases present for 192.168.30.10.
Dec 04 09:16:10 : Remove host declaration server10 or remove 192.168.30.10
Dec 04 09:16:10 : from the dynamic address pool for 192.168.30.0/24
Dec 04 09:16:10 : uid lease 192.168.30.1 for client 52:54:00:00:30:10 is duplicate on 192.168.30.0/24
....

[root@dhcp ~]# cat /var/lib/dhcpd/dhcpd.leases
...
lease 192.168.30.1 {
  starts epoch 1701650416; # Mon Dec 04 08:40:16 2023
  ends epoch 1701652570; # Mon Dec 04 09:16:10 2023
  tstp epoch 1701652570; # Mon Dec 04 09:16:10 2023
  cltt epoch 1701650416; # Mon Dec 04 08:40:16 2023
  binding state free;
  hardware ethernet 52:54:00:00:30:10;
  uid "\001RT\000\0000\020";
}

事實上,我們的設定不是很好!因為 192.168.30.0/24 分配的動態網段就是 192.168.30.1 ~ 192.168.30.10,但是固定的 IP 位址卻又提供了 192.168.30.10 這個 IP 位址,於是就衝突了!雖然最終還是發放給用戶端正確的固定 IP 位址,但是在 journalctl 的登錄訊息中, 你可以發現其實這樣不太妥當!一般來說,我們會有預留的 IP 位址以及動態分享出去的 IP 位址範圍,這兩者應該不要重複比較好! 另外,租約檔的時間參數有更新了~使用的是 unix time 的格式,不過後面有提供本地端的正確時間喔!這樣也比較好觀察!

9.3、架設 DHCP relay 服務

接下來開始思考,那麼我們的 AP 網段以及 LAN 網段該如何處理相關的 DHCP 任務?其實也非常簡單,兩個動作! 一個是在 DHCP server 上面設定好分享的方式,這會使用到規範來源類別的 class 部份,以及將動態 IP 分配給特定用戶的 pool 功能。 然後在 master 骨幹上面啟用 dhcp-relay 服務即可!就讓我們來測試測試。

9.3.1、在 DHCP server 上面設定分享的網域 (class and pool)

就如同圖 9.1.3 提到的,我們的用戶端來源可能還有來自 AP 以及 LAN 兩個網段,現在,我們大略將用戶端來源分為三群組:

  • myap:主要來自 ap 網段,透過 agent.circuit-id 是否為 wlp7s0u1 (網卡) 判斷
  • mylan:主要來自 lan 網段,透過 agent.circuit-id 是否為 enp2s0 (網卡) 判斷
  • any:所有來源都在這一段

判斷來源可以使用 class 的分式來分群,其中比較有趣的是 any 這一群,裡面是空的!代表來源都符合的意思!放在最前面的部份就會變這樣:

[root@dhcp ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
log-facility local7;
db-time-format local;
stash-agent-options true;

class "myap" {
  match if option agent.circuit-id = "wlp7s0u1";
  # 判斷代理的電路名稱是否為 wlp7s0u1。若為交換器,這邊通常是埠口號碼
}
class "mylan" {
  match if option agent.circuit-id = "enp2s0";
}
class "any" {
}
....

我們需要避免 192.168.30.0/24 這一個 DMZ 網段的 IP 位址不會分配給其他兩段,所以需要拒絕 myap, mylan 來源的 DHCP 封包要求~ 所以這一段 subnet 我們可以改成這樣:

[root@dhcp ~]# vim /etc/dhcp/dhcpd.conf
subnet 192.168.30.0 netmask 255.255.255.0 {
    default-lease-time 3600;
    max-lease-time 28800;
    option routers 192.168.30.254;
    option domain-name-servers 192.168.30.211, 192.168.30.212;
    option domain-name "server.vbird";
    pool {
      deny members of "myap";
      deny members of "mylan";
      allow members of "any";
      range 192.168.30.1 192.168.30.10;
      # 前面三行在設定拒絕其他兩個網段的封包,最後則全部放行!然後 pool 需要有 range 設定!
    }
}

最後,將分享的其他兩個網段丟上來即可!

[root@dhcp ~]# vim /etc/dhcp/dhcpd.conf
shared-network vbirdlan {
    subnet 192.168.10.0 netmask 255.255.255.0 {
        default-lease-time 1800;
        max-lease-time 7200;
        option routers 192.168.10.254;
        option domain-name-servers 192.168.30.211, 192.168.30.212;
        option domain-name "ap.vbird";
        pool {
            allow members of "myap";
            deny members of "any";
            range 192.168.10.1 192.168.10.100;
        }
    }
    subnet 192.168.20.0 netmask 255.255.255.0 {
        default-lease-time 3600;
        max-lease-time 14400;
        option routers 192.168.20.254;
        option domain-name-servers 192.168.30.211, 192.168.30.212;
        option domain-name "lan.vbird";
        pool {
            allow members of "mylan";
            deny members of "any";
            range 192.168.20.1 192.168.20.100;
        }
    }
}

觀察看看有沒有設定錯誤的問題:

[root@dhcp ~]# systemctl restart dhcpd
[root@dhcp ~]# journalctl -xeu dhcpd.service
# 不能看到錯誤訊息啊!

基本上這樣就設定妥當了!基本上,要注意的就是 (1)class 搭配 match 的符合用戶端特徵的分群紀錄,(2)透過 pool 將不同的來源進行拒絕與放行, (3)透過 shared-network 設定好非在本地端區域網路的其他網域參數設定。這樣就搞定了!等待 master 骨幹系統的 dhcp-relay 設定吧!

9.3.2、在 master 骨幹系統啟用 dhcp-relay 服務

master 骨幹系統啟用 dhcp-relay 挺簡單~大致的步驟就是 (1)安裝軟體,(2)設定服務並且修改參數,(3)查看防火牆有無接受 port 67/udp 這樣即可。讓我們一步一步處理看看:

# 1. 在 master 系統上,安裝好 dhcp-relay,並且查看相關檔案位置:
[root@master ~]# yum -y install dhcp-relay
[root@master ~]# rpm -ql dhcp-relay
/usr/lib/systemd/system/dhcrelay.service
/usr/sbin/dhcrelay
# 上面是服務設定參考檔,以及實際運作資料檔

# 2. 複製服務至開機運作位置,同時修改成為 agent 功能
[root@master ~]# cp /usr/lib/systemd/system/dhcrelay.service /etc/systemd/system/
[root@master ~]# vim /etc/systemd/system/dhcrelay.service
[Unit]
Description=DHCP Relay Agent Daemon
Documentation=man:dhcrelay(8)
Wants=network-online.target
After=network-online.target

[Service]
Type=notify
ExecStart=/usr/sbin/dhcrelay -d --no-pid -a 192.168.30.213
StandardError=null
StandardError=journal
StandardOutput=journal
SyslogFacility=local5

[Install]
WantedBy=multi-user.target

[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable --now dhcrelay.service
[root@master ~]# journalctl -xeu dhcrelay
[root@master ~]# netstat -tlunp
Proto Recv-Q Send-Q Local Address  Foreign Address    PID/Program name
udp        0      0 0.0.0.0:67     0.0.0.0:*          40897/dhcrelay

# 3. 看看防火牆是否正確的運作:
[root@master ~]# nft list chain inet mytable myinput
table inet mytable {
    chain myinput {
        type filter hook input priority filter; policy drop;
        ct state established,related accept
        meta l4proto icmp accept
        iifname "lo" accept
        ip saddr 192.168.201.254 accept
        ip saddr { 10.30.30.0/24, 10.40.40.0/24 } reject with icmp port-unreachable
        iifname "enp1s0" ip saddr 192.168.201.0/24 tcp dport 22 accept
        iifname "enp2s0" tcp dport { 22, 53, 5901-5910 } accept
        iifname "enp2s0" udp dport { 53, 67, 123 } accept
        iifname "wlp7s0u1" tcp dport { 22, 53, 5901-5910 } accept
        iifname "wlp7s0u1" udp dport { 53, 67, 123 } accept
    }
}
# 沒問題!之前就規劃好會啟用 dhcp 了!所以這裡原本就放行 67/udp!

基本設定大概就是這樣!不過,我們希望可以將個別的服務登錄檔分離出來,所以,接下來可以進行一些有趣的變化。

  • 將 dhcrelay 服務的登錄資訊切換到 /var/log/dhcrelay.log 中

在 journalctl 可以輕鬆愉快的找到我們的服務來觀察,那麼能不能將登錄資訊移出 /var/log/messages 呢? 我們在 dhcrelay.service 當中,其實多加入了一個 syslog 的使用類別『SyslogFacility=local5』,所以, 就能夠修改 rsyslog.conf 的內容來切出登錄資訊!簡單作法如下:

# 記得是在 master 底下進行!
[root@master ~]# vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none;local5.none    /var/log/messages
local5.*                                                /var/log/dhcrelay.log

[root@master ~]# systemctl restart rsyslog
[root@master ~]# systemctl restart dhcrelay
[root@master ~]# cat /var/log/dhcrelay.log
# 這樣,就將 dhcrelay 切出來了!
  • 在用戶端測試

接下來,請使用手機或其他 wifi 用戶端軟體,然後點選 masterap 之後,看看測試的情況如何!基本上, 應該要可以讓手機上網了!同時在 lan 網段的 client_raw 系統中,執行如下的動作來啟用 DHCP 看看:

# 底下的動作需要在 client_raw,預設名稱 client001 用戶端系統上面實做!
[root@client001 ~]# rm /etc/hostname
[root@client001 ~]# nmcli connection modify enp1s0 ipv4.method auto ipv4.dns '' \
> ipv4.dns-search 'server.vbird,lan.vbird,ap.vbird' ipv4.addresses '' ipv4.gateway ''
[root@client001 ~]# nmcli connection up enp1s0
[root@client001 ~]# hostnamectl
   Static hostname: (unset)
Transient hostname: client001.lan.vbird
         Icon name: computer-vm
...

[root@client001 ~]# nmcli connection show enp1s0 | grep DHCP
DHCP4.OPTION[1]:      dhcp_client_identifier = 01:52:54:00:00:20:01
DHCP4.OPTION[2]:      dhcp_lease_time = 3600
DHCP4.OPTION[3]:      dhcp_server_identifier = 192.168.30.213
DHCP4.OPTION[4]:      domain_name = lan.vbird
DHCP4.OPTION[5]:      domain_name_servers = 192.168.30.211 192.168.30.212
DHCP4.OPTION[6]:      expiry = 1701663139
DHCP4.OPTION[7]:      ip_address = 192.168.20.1
....
DHCP4.OPTION[25]:     routers = 192.168.20.254
DHCP4.OPTION[26]:     subnet_mask = 255.255.255.0

看起來有真的接收到 DHCP server 提供的網路訊息呢!接下來,到

  • 查看租約情況:

來到 DHCP 伺服器看看租約是否正常紀錄?

[root@dhcp ~]# cat /var/lib/dhcpd/dhcpd.leases
lease 192.168.20.1 {
  starts epoch 1701659539; # Mon Dec 04 11:12:19 2023
  ends epoch 1701663139; # Mon Dec 04 12:12:19 2023
  cltt epoch 1701659539; # Mon Dec 04 11:12:19 2023
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 52:54:00:00:20:01;
  uid "\001RT\000\000 \001";
  option agent.circuit-id "enp2s0";
  client-hostname "client001";
}
lease 192.168.10.1 {
  starts epoch 1701659844; # Mon Dec 04 11:17:24 2023
  ends epoch 1701661644; # Mon Dec 04 11:47:24 2023
  cltt epoch 1701659844; # Mon Dec 04 11:17:24 2023
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 6e:f9:1b:91:c0:04;
  uid "\001n\371\033\221\300\004";
  set vendor-class-identifier = "android-dhcp-13";
  option agent.circuit-id "wlp7s0u1";
  client-hostname "Pixel-4-XL";
}

看起來 OK 喔!這就是分享 DHCP relay 的整體流程囉!提供大家參考!

9.4、架設 NTP 服務

我們在前面的章節裡面就談到過,你的伺服器 (尤其是我們內部主機) 應該要跟網際網路的時間同步!每台主機都時間同步較佳! 那如果內部主機的電腦數量很多了,當然就是我們自己架設一部內部的時間伺服器較佳啊!基本上,時間伺服器使用所謂的 NTP 協定 (Network Time Protocol, NTP) 來互相同步時間~NTP 時間鐘有所謂的階層架構 (stratum),網路上有提供數台第一階與第二階的時間伺服器, 您可以參考如下的網站:

在台灣,你也可以直接找到國家實驗室的 time server: tock.stdtime.gov.tw, clock.stdtime.gov.tw 等。我們的測試機器目前擺在崑山科大, 所以也可以使用 ntp.ksu.edu.tw 這部 NTP 伺服器作為主要參考源!

  • NTP server 的設定

如前所述,我們建議 NTP 放置到與 dhcp 同一部系統上,所以前往 dhcp 伺服器,然後安裝好 chrony 軟體吧!之後就來設定一下相關的參數:

[root@dhcp ~]# yum -y install chrony
[root@dhcp ~]# vim /etc/chrony.conf
#pool 2.rocky.pool.ntp.org iburst
server ntp.ksu.edu.tw iburst
server tock.stdtime.gov.tw iburst
server time.stdtime.gov.tw iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.10.0/24
allow 192.168.20.0/24
allow 192.168.30.0/24
keyfile /etc/chrony.keys
ntsdumpdir /var/lib/chrony
leapsectz right/UTC
logdir /var/log/chrony

[root@dhcp ~]# systemctl restart chronyd
[root@dhcp ~]# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^? ntp.ksu.edu.tw                0   7     0     -     +0ns[   +0ns] +/-    0ns
^? 211-22-103-157.hinet-ip.>     0   7     0     -     +0ns[   +0ns] +/-    0ns
^? 118-163-81-61.hinet-ip.h>     0   7     0     -     +0ns[   +0ns] +/-    0ns

[root@dhcp ~]# netstat -tlunp | egrep '^Proto|chrony'
Proto Recv-Q Send-Q Local Address   Foreign Address  State   PID/Program name
udp        0      0 0.0.0.0:123     0.0.0.0:*                13611/chronyd
udp        0      0 127.0.0.1:323   0.0.0.0:*                13611/chronyd
udp6       0      0 ::1:323         :::*                     13611/chronyd

[root@dhcp ~]# firewall-cmd --add-service=ntp
[root@dhcp ~]# firewall-cmd --list-services
dhcp ntp ssh
[root@dhcp ~]# firewall-cmd --runtime-to-permanent

[root@dhcp ~]# chronyc tracking
Reference ID    : 00000000 ()
Stratum         : 0
Ref time (UTC)  : Thu Jan 01 00:00:00 1970
System time     : 0.000000001 seconds fast of NTP time
Last offset     : +0.000000000 seconds
RMS offset      : 0.000000000 seconds
Frequency       : 11.928 ppm fast
Residual freq   : +0.000 ppm
Skew            : 0.000 ppm
Root delay      : 1.000000000 seconds
Root dispersion : 1.000000000 seconds
Update interval : 0.0 seconds
Leap status     : Not synchronised

不過要注意的是,竟然無法同步!怎麼回事?查了查,看起來非常有可能是因為 master 骨幹系統的防火牆並沒有放行 DMZ 的 NTP 對外的情況! 這真是傷腦筋了!所以,我們得要讓 DMZ 內的系統能夠向外要求 123/udp 的埠口才行!否則無法對外同步!

# 需要在骨幹系統上面實做才行!
[root@master ~]# vim /root/nftables.sh
# part 3: 處理 DMZ 功能
nft add chain inet mytable myforward { type filter hook forward priority filter \; policy accept \; }
nft add rule inet mytable myforward iifname ${dmzif} oifname ${wanif} ct state established,related accept
nft add rule inet mytable myforward iifname ${dmzif} oifname ${wanif} udp dport { 53, 123 } accept
nft add rule inet mytable myforward iifname ${dmzif} oifname ${wanif} tcp dport { 53, 80, 443 } accept
nft add rule inet mytable myforward iifname ${dmzif} oifname ${wanif} reject
nft add rule inet mytable myforward iifname ${dmzif} oifname ${lanif} ct state established,related accept
nft add rule inet mytable myforward iifname ${dmzif} oifname ${lanif} reject

[root@master ~]# sh /root/nftables.sh
[root@master ~]# nft list chain inet mytable myforward
table inet mytable {
        chain myforward {
                type filter hook forward priority filter; policy accept;
                iifname "enp3s0" oifname "enp1s0" ct state established,related accept
                iifname "enp3s0" oifname "enp1s0" udp dport { 53, 123 } accept
                iifname "enp3s0" oifname "enp1s0" tcp dport { 53, 80, 443 } accept
                iifname "enp3s0" oifname "enp1s0" reject
                iifname "enp3s0" oifname "enp2s0" ct state established,related accept
                iifname "enp3s0" oifname "enp2s0" reject
        }
}

很快的設定妥當了!接下來就測試看看用戶端能不能來更新囉!

  • 用戶端測試

前往 client001 系統去編輯 chrony.conf 看看!

# 測試用戶端,所以都在 client001 上面實做喔!
[root@client001 ~]# vim /etc/chrony.conf
server dhcp.server.vbird iburst

[root@client001 ~]# systemctl restart chronyd
[root@client001 ~]# chronyc tracking
Reference ID    : C0A81ED5 (dhcp.server.vbird)
Stratum         : 4
Ref time (UTC)  : Mon Dec 04 04:12:00 2023
System time     : 0.000000016 seconds slow of NTP time
Last offset     : +0.000013772 seconds
RMS offset      : 0.000013772 seconds
Frequency       : 12.326 ppm fast
Residual freq   : +9.654 ppm
Skew            : 0.022 ppm
Root delay      : 0.007695264 seconds
Root dispersion : 0.023577420 seconds
Update interval : 2.0 seconds
Leap status     : Normal

記得最後需要 tracking 追蹤一下!測試看看有沒有問題喔!

修改歷史:
  • 2023/12/03:嘗試說明 DHCP 與 DHCP relay 的運作,但是對於 layer 2 的封包 MAC 位址不是太肯定!網路文章說的都不太一樣!
  • 2023/12/04:快速的將後續的設定處理完畢!大家參考看看!
  • 2023/12/05:雖然 ISC 的 DHCP software 已經 EOL,新的是 Kea DHCP,不過,很多朋友還是習慣 ISC DHCP 啦!反正有其他第三方團隊有在維護就好!
2023/12/04以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計