使用 systemd-networkd 設定網路組態

方便,容易管理以及配置

對於現在來說,網路是十分重要的一種資源,「網路若不好,人生是黑白的」,現在要你沒有網路大概就跟死了一樣吧 XD。在 Windows 下比較沒有網路問題,畢竟你連選擇都沒有,不過在 Linux 下你選擇就很多了。
從以前 Gnome 提供的 NetworkManager 到現在各式這樣的網路管理器,大家都有各自的優缺點,端看自己想要怎麼選擇了。
於是今天我要介紹的是近期的新秀 systemd 所提供的 systemd-networkd,包含怎麼去設定、調整以及後續的整合,這篇算是前導文,之後還會有一系列的延伸應用。

Network Managers?

說到網路,一定要有東西來管它,那就是「網路管理器(Network Managers)」了,常見的有上述說的 NetworkManager、netctl 及 systemd-networkd,這些東西都是管理整個系統的網路組態,其中當然包含 NIC(Network Interface Controller:網路卡)的管理,以及連線、路由、IP 設定等都是由網路管理器負責。
這樣說起來,網路管理器的身份就非常重要了,除非你不需要網路,那就跟你一點關係都沒有XD。說回來,如果要網路乖乖,除了放一包乖乖外,跟網路管理器搞好關係也是非常重要的事情,只要適當的處理好,之後要修改或是維護都非常的容易,所以第一步就是要選一個你喜歡的網路管理器。

NetworkManager?

你說你不知道要選什麼?也是,雖然本文主題是 systemd-networkd,不過就先從大多數都會有的 NetworkManager 開始吧!但是因為主題不是著重在 NetworkManager 上,所以容許我簡單帶過。
NetworkManager(以下簡稱 NM)名字就跟網路管理器一模一樣,在 systemd 中的 service 就是長這樣大小寫有區分,如果需要操作它還請注意大小寫。
NM 跟 Gnome 的關係非常好,幾乎都會在安裝 Gnome 時連同依賴關係一起安裝,所以選擇 Gnome 系的 Window Manager 都會看見 NM 的蹤影,基本上不會讓你沒有網路用就是了。
NM 有不好嗎?幹麻要換掉它?也不是說 NM 不好,就單純不喜歡,或許對一般使用者來說算是非常親民,易用的設定畫面,還有配合桌面的小工具,其實算是非常方便的,但是對於我來說就稍稍不適合了,又或者對於非使用 Gnome 的人,NM 的優勢也就沒這麼明顯,不過如果你用 Gnome 的話,NM 應該會因為依賴關係無法移除,那就不要理它,把它停用就好 XD。
sudo systemctl disable NetworkManager 給他下去就對了 XD。

systemd-networkd?

簡單說完 NM 了,現在來到主軸 systemd-networkd,其實會選用 systemd-networkd 的關係還有是現在多數發行版都改用 systemd 來取代 System V,所以統一用 systemd 來管理也比較方便,systemd 也提供完整的元件可以使用,而不需要另外安裝東西或依賴,在同一套系統內也比較好釐清之間的關係。所以其實如果沒有特別需求的話(就是一般的使用者啦,只需要上網的那種),我都會比較推薦用 systemd-networkd,目前大多數的情況下都沒有問題,等一下會講說哪種情況下不建議使用。

我該不該用 systemd-networkd?

目前我知道有一種情況你不要用比較好,就是你是直接撥號的 (PPPoE),因為 systemd-networkd 目前不支援 ppp,所以沒有辦法幫你處理這問題,必須藉由 pppd 幫你撥號完才能完成後續,不過本文就先以位於 AP 後面的機器(也就是 AP 幫你撥號完了)為例子,一般家裡多數應該也會是這樣的狀態,無論是用中華電信提供的 DSL 或是額外接的 AP,我應該之後會補一篇用 ppp 接進 systemd-networkd 的文,至少我現在沒有設備可以測試就是了。

DHCP Client?

如果用 NM 的話,有三種方式使用 DHCP,透過 systemd-networkd、dhcpcd 或 dhclient,不過不建議用 dhcpcd,因為因為 NM 不支援透過 dhcpcd取得 IPv6,而 systemd-networkd 自己就可以處理 DHCP 了,也不需要安裝其他元件。

DNS 解析?

一樣的 systemd 提供了 systemd-resolved 負責處理 DNS 解析的工作,除了一般解析外,還支援 DNSSECDNS over TLS、群播 DNS (mDNS) 及 LLNMR,後兩者比較不常見,前兩者算是目前比較新的規範,提昇了 DNS 查詢的安全性。
有關 systemd-resolved 的部份應該會另外寫一篇來說明。

設定 systemd-networkd

終於來到這裡了,在經過上面的講解不知道有沒有更了解 systemd-networkd 扮演什麼角色呢?這裡就再簡單說明一下:

  • 管理網路卡
    • 名稱
    • MTU
    • 雙工模式
    • 還有其他東西
  • 管理網路連線
    • DHCP 設定
    • IP 設定
    • 路由設定
    • 還有其他東西

在 systemd-networkd 中,有三種設定檔,存放在 /etc/systemd/network/ 之中,分別是:

  • .link
    負責處理 NIC 配置。
  • .netdev
    負責處理虛擬 NIC 配置。
  • .network
    負責處理網路連線配置。

在這邊就不提 .netdev 了,一般來說是用不到虛擬 NIC 的。

這檔案攸關 NIC 是否運作正常,這裡貼出一個範例檔案:

[Match]
MACAddress= 01:5a:f3:a8:84:76

[Link]
NamePolicy=kernel database onboard slot path
MACAddressPolicy=persistent
WakeOnLan=magic

[Match] 的部份,只有完全符合其中的設定值,才會把以下的設定都套進這個 NIC 中。範例中是以 MAC 位置做為判斷標準,其他還可以用像是 Driver 作為判斷標準,詳細可以在 systemd.link(5) 找到。
[Link] 的話,包含命名方式、MAC 位置設定、WOL 設定及雙工模式都在這裡設定。範例中的 NamePolicy 是設定命名順序,符合後就停止往後尋找,一般來說是不需要去設定或更動的。MACAddressPolicy 設定 MAC 位置,一般來說也是固定位置,不太需要更動。最後是 WakeOnLan,設定只有 magic 封包可以喚醒電腦,細部設定一樣可以在 systemd.link(5) 找到。
如果你懶的話,可以拿上面的設定檔去用,把 MACAddress= 換成自己的就可以。

設定範例:更改 NIC 名稱

以往都要用更改 udev rule 的方式會有點討厭,NIC 的部份就可以用 .link 檔案做到。

[Link]
NamePolicy=keep
Name=MyNic

[Link] 中改寫這兩行,把 Name= 的值改成自己要的後存檔,重新啟動 systemd-networkd(內建網卡的話應該要重開機?),就會生效了。

設定 .network 檔

確定好 NIC 設定後就是設定網路連線了,以下是一個簡易的設定:

[Match]
Name=enp3s0

[Network]
DHCP=true
IPv6PrivacyExtensions=true

[Match] 跟 .link 檔一樣,全部符合才會採用,條件一樣多元,但是在上面已經以 MAC 位置設定好 NIC 名稱了,所以就直接以 Name= 來指定 NIC 做設定。
(請注意,Name 可以使用萬用字元進行比對,像是 enp* 就會指定到所有 enp 開頭的 NIC)
[Network] 就是最主要設定的部份了,一般來說 DHCP 選項可以設定成:true、ipv4、ipv6,true 的話就是同時使用 IPv4 以及 IPv6,如果不在 IPv6 網路的話就可以只啟用 IPv4 的 DHCP 服務,又或者只需要透過 DHCP 使用 IPv6 的話,下面可以手動設定 IPv4 位置。
其他還有 [Link] [Address] [Route] [DHCP],因為 [Link] 在 .link 中設定過了就不理它,至於其他部份是手動設定才需要輸入的。[Address] [Route] 都可以在 [Network] 中簡單設定,沒有特殊需求也可以不需要獨立寫出來。
另外值得注意的是,在上面的範例中有一條 IPv6PrivacyExtensions=true,這是根據 RFC 4941 所設計的,代表在使用 IPv6 時,如果採用 SLAAC 的方式取得 IPv6 位置,會另外產生一個 IPv6 位置,而不是使用前一個基於 MAC 位置所產生的 IPv6 位置,如果你是用 IPv6 網路的話可以把這個選項加進去。

其他設定檔的細項可以在 systemd.network(5) 中找到。

設定範例:手動指定 IP 位置及 Gateway

[Match]
Name=enp3s0

[Network]
Address=192.168.0.2/24
Gateway=192.168.0.1
DNS=1.1.1.1

結論

看起來應該不會太難吧?自己在摸索的過程中覺得算是很好寫的設定檔,簡單又直覺,很多比較複雜的保持預設值都不會有太大的問題,簡單幾行自己需要的填上去就大公告成了!
歡迎大家改用 systemd-networkd!
然後啊,請記得所有設定檔修改完後都需要重新啟動 systemd-networkd ,也就是 sudo systemctl restart systemd-networkd 要給它執行過一次嘿,不然自己改得很開心卻都沒有套用進去真的會給它氣死。
大致上就這樣吧,有線網路就到這邊了,無線網路可能要等等,要弄的東西更多了,而且在沒有 GUI 的情況下都用指令操作無線網路連線確實是有點複雜,應該是系列文擺在最後再寫吧。

文章於 2023-05-08 01:06 更新

 Share!