Learning Objectives
- 看懂 eno1、ens33、enp0s3、wlp3s0 這類網路卡名稱的命名原則
- 用 ip a、ip -br a、ip route、ip link、resolvectl status、ping、ss 檢查網路狀態
- 在 Ubuntu Server 用 netplan 設定固定 IP、預設閘道與 DNS,用 netplan try/apply 套用
- 在 Ubuntu 桌面版用 NetworkManager 的 nmcli 新增、修改與切換連線設定
網路卡的名字從哪裡來
早期的 Linux 把第一張有線網路卡叫 eth0、第二張叫 eth1。問題是這個順序由開機時偵測的先後決定,
多張網路卡的伺服器重新開機後,eth0 和 eth1 可能對調,設定就套錯了網路卡。
現在的 systemd(udev)改用可預測的網路介面名稱(Predictable Network Interface Names):依韌體、匯流排位置等硬體資訊命名,
只要硬體不變,名稱就不變。代價是名稱比 eth0 難讀。
名稱的前兩個字母是類型:
| 前綴 | 類型 |
|---|---|
en |
乙太網路(Ethernet,有線網路) |
wl |
無線區域網路(WLAN,Wi-Fi) |
ww |
無線廣域網路(WWAN,行動網路) |
後面接位置資訊,systemd 依下列順序取第一個可用的:
| 規則 | 寫法 | 例子 | 意思 |
|---|---|---|---|
| 1. 主機板內建(韌體提供的編號) | o<編號> |
eno1 |
主機板上的第 1 張網路卡 |
| 2. PCI Express 熱插拔插槽編號 | s<插槽> |
ens33 |
插槽 33(VMware 虛擬機常見) |
| 3. 實體位置(PCI 匯流排與插槽) | p<匯流排>s<插槽> |
enp0s3、wlp3s0 |
匯流排 0、插槽 3 的有線網卡(VirtualBox 常見);匯流排 3、插槽 0 的無線網卡 |
| 4. MAC 位址 | x<MAC> |
enx78e7d1ea46da |
預設不使用,要另外設定 |
| 5. 都不適用時 | 傳統名稱 | eth0 |
核心原本給的名稱 |
lo 是本機迴路(loopback),代表機器自己,位址是 127.0.0.1。
投影片提到的
em1、p3p4是 Dell 的 biosdevname 命名方式,在 Ubuntu 上很少見到。
檢查網路狀態的指令
| 指令 | 用途 |
|---|---|
ip a(ip addr) |
每張網路卡的狀態、MAC 位址、IP 位址 |
ip -br a |
簡短版:一張網路卡一行,看名稱、狀態與 IP 最快 |
ip route(ip r) |
路由表;default via 10.0.2.2 就是預設閘道 |
ip link |
只看網路卡本身(是否啟用、MAC),不看 IP |
resolvectl status |
目前使用的 DNS 伺服器(Ubuntu 由 systemd-resolved 管理 DNS,/etc/resolv.conf 裡的 127.0.0.53 是它在本機的代理) |
ping -c 3 8.8.8.8 |
測試能否連到某台主機;-c 3 送 3 次就停,不加會一直送,按 Ctrl+C 停止 |
ss -tln |
本機正在等待連線的 TCP 連接埠:-t TCP、-l 只看等待中的(LISTEN)、-n 用數字顯示 |
nslookup example.com |
查網域名稱對應的 IP |
連不上網時,可以由近到遠逐步檢查:
ip -br a:網路卡是不是UP、有沒有拿到 IPip route找出閘道,ping -c 3 閘道:區域網路通不通ping -c 3 8.8.8.8:能不能連到外面(用 IP,不經過 DNS)ping -c 3 example.com:DNS 能不能把名稱轉成 IP;第 3 步通、這一步不通,就是 DNS 的問題
投影片的 ifconfig、route、netstat 屬於較舊的 net-tools 套件,Ubuntu 預設沒有安裝,執行時會提示 sudo apt install net-tools。
新的寫法是 ip a、ip route、ss,功能都涵蓋得到。
CentOS/RHEL 與 Ubuntu 的設定方式對照
投影片的變更網路設定是 CentOS 的做法。Ubuntu 的對應如下:
| 項目 | CentOS/RHEL(投影片) | Ubuntu 24.04 |
|---|---|---|
| 設定檔 | /etc/sysconfig/network-scripts/ifcfg-網卡名稱 |
/etc/netplan/*.yaml(netplan) |
| 套用設定 | systemctl restart network 或重啟 NetworkManager |
sudo netplan try 或 sudo netplan apply |
| 實際管理網路的程式 | NetworkManager | Server 版:systemd-networkd;桌面版:NetworkManager |
| 命令列工具 | nmcli |
Server 版用 netplan 設定檔;桌面版也可以用 nmcli |
| DNS 設定 | /etc/resolv.conf 的 nameserver |
寫在 netplan 的 nameservers;用 resolvectl status 查看 |
netplan 是 Ubuntu 的網路設定層:你用 YAML 寫下「想要的網路設定」,netplan 再轉成 systemd-networkd 或 NetworkManager 看得懂的設定。
在 Ubuntu Server 用 netplan 設定固定 IP
伺服器要讓別人連進來,通常需要固定 IP。安裝時預設用 DHCP 自動取得,設定檔大致長這樣:
# /etc/netplan/50-cloud-init.yaml(預設:DHCP)
network:
version: 2
ethernets:
enp0s3:
dhcp4: true
改成固定 IP 192.168.100.100/24、閘道 192.168.100.254、DNS 8.8.8.8:
network:
version: 2
ethernets:
enp0s3: # 網路卡名稱,要和 ip a 看到的一樣
dhcp4: false # 不用 DHCP
addresses:
- 192.168.100.100/24 # IP 位址/遮罩長度(/24 就是 255.255.255.0)
routes:
- to: default # 預設路由
via: 192.168.100.254 # 經過這個閘道
nameservers:
addresses: [8.8.8.8] # DNS 伺服器
寫 YAML 的注意事項:
- 縮排只能用空格,不能用 Tab;同一層要對齊(習慣每層 2 個空格),縮排錯了設定就會讀錯或報錯
addresses要寫成IP/遮罩長度,只寫 IP 會出現 invalid prefix length 的錯誤- 舊教學的
gateway4: 192.168.100.254已經被淘汰,套用時會出現`gateway4` has been deprecated, use default routes instead的警告;請改用routes的to: default搭配via - 設定檔的權限要是
600(只有 root 能讀寫),權限太寬鬆時 netplan 會警告Permissions for ... are too open;用sudo chmod 600 檔名修正 - 用 cloud-init 安裝的系統,
50-cloud-init.yaml開頭的註解會提醒:這個檔案由 cloud-init 產生,重新開機可能被改回去。要長期使用自己的設定,依註解說明建立/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg,寫入network: {config: disabled}
編輯完成後套用:
sudo netplan try # 先試用:120 秒內按 Enter 確認,沒按就自動還原
sudo netplan apply # 直接套用
透過 SSH 遠端改網路設定時,建議用 netplan try:設定錯了導致連線中斷,時間到會自動還原,不會把自己鎖在門外。
編輯設定檔可以用上一課的 sudo nano /etc/netplan/50-cloud-init.yaml;下面的練習用 sudo tee 檔案 << EOF 一次寫入整份內容,tee 會把內容寫進檔案、同時印在螢幕上。
改之前先備份一份。備份檔名不要以 .yaml 結尾,否則 netplan 也會把備份當成設定讀進去。
在 Ubuntu 桌面版用 nmcli
Ubuntu 桌面版由 NetworkManager 管理網路,可以在「設定 → 網路」用圖形介面改,也可以用命令列工具 nmcli。
NetworkManager 區分兩個概念:
- device(裝置):實體的網路卡,例如
enp0s3 - connection(連線設定檔):一組設定(DHCP 或固定 IP、閘道、DNS…)。同一張網路卡可以有好幾個設定檔,一次只啟用一個
| 指令 | 作用 |
|---|---|
nmcli dev status |
每個裝置的狀態與正在使用的連線(dev 是 device 的縮寫) |
nmcli con show |
列出所有連線設定檔(con 是 connection 的縮寫);加 --active 只看啟用中的 |
nmcli con show 名稱 |
某個設定檔的詳細內容 |
sudo nmcli con add con-name demo type ethernet ifname enp0s3 ipv4.method manual ipv4.addresses 192.168.100.100/24 ipv4.gateway 192.168.100.254 ipv4.dns 8.8.8.8 autoconnect yes |
新增名為 demo 的固定 IP 設定檔,開機自動連線 |
sudo nmcli con modify demo ipv4.dns 8.8.8.8,1.1.1.1 |
修改設定檔;改完要重新 up 才生效 |
sudo nmcli con up demo |
啟用 demo;同一張網路卡原本的設定檔會被停用 |
sudo nmcli con down demo |
停用 demo |
投影片把設定存到
/etc/sysconfig/network-scripts/ifcfg-*是 CentOS 的位置,Ubuntu 沒有這個目錄。 Ubuntu Server 預設沒有安裝 NetworkManager,執行nmcli會出現Command 'nmcli' not found;Server 版請用前面的 netplan。
想一想:網路卡名稱與檢查指令
網路卡名稱 wlp3s0 代表什麼?
ping -c 3 8.8.8.8 成功,但 ping -c 3 example.com 出現 Name or service not known,最可能是哪裡有問題?
想知道這台機器的預設閘道,應該看哪個指令的輸出?
想一想:netplan 與 nmcli
下列 netplan 設定,哪一個寫法會讓套用時出現淘汰警告?
透過 SSH 遠端修改伺服器的網路設定,為什麼建議用 sudo netplan try 而不是直接 apply?
在 Ubuntu 桌面版用 sudo nmcli con modify demo ipv4.dns 1.1.1.1 改了 DNS,卻沒有生效,還要做什麼?
重點精華回顧
- 網路卡名稱:
en有線、wl無線、ww行動網路;o主機板內建、s熱插拔插槽、p…s…PCI 位置、xMAC;都不適用才用eth0。 - 檢查網路:
ip -br a、ip a、ip route、ip link、resolvectl status、ping -c、ss -tln;由近到遠:網卡 → 閘道 → 外部 IP → 網域名稱。 ifconfig、netstat、route屬於沒有預裝的 net-tools,新寫法是ip與ss。- Ubuntu Server 用 netplan:
/etc/netplan/*.yaml、權限 600、縮排只用空格;固定 IP 寫dhcp4: false、addresses、routes的to: default加via、nameservers;gateway4已淘汰。 - 套用:
sudo netplan try(遠端修改時用,會自動還原)或sudo netplan apply。 - Ubuntu 桌面版用 NetworkManager:
nmcli dev status、nmcli con show、con add、con modify、con up;改完要重新up。