在命令行中使用 nmcli 來管理網路連接
nmcli 命令賦予你直接在 Linux 命令行操作 NetworkManager 工具的能力。它是 NetworkManager 軟體包集成的一部分,通過使用一些 應用程序介面(API)來獲取 NetworkManager 的功能。
nmcli
發佈於 2010 年,用以替代其他配置網路介面和連接的方法,例如 ifconfig。因為它是一個 命令行界面(CLI)工具,被設計用在終端窗口和腳本中,所以對於那些工作在沒有 圖形用戶界面(GUI)的系統的管理員來說,它是一個非常理想的工具。
ncmli 的語法
nmcli
命令可以使用選項來更改它的行為,使用子命令來告訴 nmcli
想使用它的那部分功能,使用操作來告訴 nmcli
你想執行什麼操作。
$ nmcli <選項> <子命令> <操作>
nmcli
一共有 8 個子命令,每個子命令有一些相關的網路操作:
help
提供有關nmcli
命令和使用方法的幫助信息general
返回 NetworkManager 的狀態和總體配置信息networking
提供命令來查詢某個網路連接的狀態和啟動、禁用連接的功能radio
提供命令來查詢某個 WiFi 網路連接的狀態和啟動、禁用連接的功能monitor
提供命令來監控 NetworkManager 的活動並觀察網路連接的狀態改變connection
提供命令來啟用或禁用網路介面、添加新的連接、刪除已有連接等功能device
主要被用於更改與某個設備(例如介面名稱)相關聯的連接參數或者使用一個已有的連接來連接設備secret
註冊nmcli
來作為一個 NetworkManager 的秘密代理,用以監聽秘密信息。這個子命令很少會被用到,因為當連接到網路時,nmcli
會自動做這些事
簡單的示例
首先,我們驗證一下 NetworkManager 正在運行並且 nmcli
可以與之通信:
$ nmcli general
STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN
connected full enabled enabled enabled enabled
探測總是管理一個系統的首要部分。為了列出內存或磁碟上的網路連接配置,可以使用下面的命令:
$ nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 ac3241e4-b424-35d6-aaa7-07498561688d ethernet enp0s3
Wired connection 2 2279d917-fa02-390c-8603-3083ec5a1d3e ethernet enp0s8
Wired connection 3 52d89737-de92-35ec-b082-8cf2e5ac36e6 ethernet enp0s9
上面的命令使用了 connection
子命令中的 show
操作。
用來運行上面這個例子的測試機器上運行著 Ubuntu 20.04,它安裝了 3 個網路適配器:enp0s3
、enp0s8
和 enp0s9
。
連接管理
理解 nmcli
的術語是非常重要的。一個網路 連接 包含了一個連接的所有信息。你可以將它看作一個網路 配置 。「連接」包含了與其相關的所有信息,包括 數據鏈路層 和 IP 地址信息 。它們是 OSI 網路模型 中的第 2 和第 3 層。
當你在 Linux 上配置網路時,通常來說你是在為某個網路設備(它們是安裝在一個電腦中的網路介面)配置連接。當一個連接被某個設備所使用,那麼就可以說這個連接被 激活 或者 上線 了,反之是 停用 或 下線 。
添加網路連接
nmcli
允許你快速地創建網路連接並同時為該連接指定參數。為了通過使用「有線連接 2」 enp0s8
來創建一個新的連接,你可以利用 sudo
來運行下面的命令:
$ sudo nmcli connection add type ethernet ifname enp0s8
Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully added.
其中 type
選項指定需要一個 Ethernet 類型的連接,而 ifname
(介面名)選項指定你想要為這個連接使用的網路介面設備。
讓我們看看發生了什麼變化:
$ nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 ac3241e4-b424-35d6-aaa7-07498561688d ethernet enp0s3
Wired connection 2 2279d917-fa02-390c-8603-3083ec5a1d3e ethernet enp0s8
Wired connection 3 52d89737-de92-35ec-b082-8cf2e5ac36e6 ethernet enp0s9
ethernet-enp0s8 09d26960-25a0-440f-8b20-c684d7adc2f5 ethernet --
通過上圖可以看到新的連接 ethernet-enp0s8
已經創建好了。它的 通用唯一標識符 (UUID)也一同被賦予,並且其連接類型為 「Ethernet」。我們可以使用 up
子命令再加上連接名稱(或 UUID)來使得這個連接被激活:
$ nmcli connection up ethernet-enp0s8
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
再次查看激活的連接:
$ nmcli connection show --active
NAME UUID TYPE DEVICE
Wired connection 1 ac3241e4-b424-35d6-aaa7-07498561688d ethernet enp0s3
ethernet-enp0s8 09d26960-25a0-440f-8b20-c684d7adc2f5 ethernet enp0s8
Wired connection 3 52d89737-de92-35ec-b082-8cf2e5ac36e6 ethernet enp0s9
可以看到新的連接 ethernet-enp0s8
現在已經被激活了,並且與 enp0s8
網路介面設備綁定。
調整連接
nmcli
命令使得調整現有連接的參數變得更加容易。也許你想將某個網路介面從 動態主機配置協議 (DHCP)改為靜態 IP 地址。
假設你需要為你的新連接分配一個固定的 IP 地址 192.168.4.26
,那麼你需要使用兩個命令,一個用於設定 IP 地址,另一個用來將獲取 IP 地址的方法改為 manual
(手動):
$ nmcli connection modify ethernet-enp0s8 ipv4.address 192.168.4.26/24
$ nmcli connection modify ethernet-enp0s8 ipv4.method manual
記得指定 子網掩碼,在我們這個測試的連接中,它是 無類域間路由 (CIDR)中的 255.255.255.0
或 /24
為了使得你的更改生效,你需要通過停止再重新啟用該連接。下面的第一個命令是停用該連接,第二個命令則是啟用它:
$ nmcli connection down ethernet-enp0s8
Connection 'ethernet-enp0s8' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
$ nmcli connection up ethernet-enp0s8
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)
假如你想將連接設置為使用 DHCP,則需要將上面的 manual
改為 auto
(自動):
$ nmcli connection modify ethernet-enp0s8 ipv4.method auto
設備管理
nmcli
命令中的 device
子命令允許你管理安裝在你電腦中的網路介面。
檢查設備狀態
可以使用下面的命令來快速檢查所有網路介面的狀態:
$ nmcli device status
DEVICE TYPE STATE CONNECTION
enp0s3 ethernet connected Wired connection 1
enp0s8 ethernet connected ethernet-enp0s8
enp0s9 ethernet connected Wired connection 3
lo loopback unmanaged --
顯示設備詳情
為了檢查某個網路介面的詳情,可以使用 device
子命令中的 show
操作。假如你不提供某個設備的名稱,那麼會獲取並展示所有設備的詳情。你可以上下翻動來查看這些信息。
要查看你最近添加的連接所對應的設備 enp0s8
,你可以使用下面的命令,請注意驗證它使用的 IP 地址是否為先前你要求設置的那個:
$ nmcli device show enp0s8
GENERAL.DEVICE: enp0s8
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 08:00:27:81:16:20
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: ethernet-enp0s8
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/6
WIRED-PROPERTIES.CARRIER: on
IP4.ADDRESS[1]: 192.168.4.26/24
IP4.GATEWAY: --
IP4.ROUTE[1]: dst = 192.168.4.0/24, nh = 0.0.0.0, mt = 103
IP6.ADDRESS[1]: fe80::6d70:90de:cb83:4491/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 103
IP6.ROUTE[2]: dst = ff00::/8, nh = ::, mt = 256, table=255
上面的輸出非常細緻,它主要顯示了下面這些內容:
- 網路介面名稱,在這個示例中是
enp0s8
,它是 udev 分配的 - 網路連接類型,在這個示例中是物理的 Ethernet 連接
- 設備的 媒介訪問控制 (MAC)地址,它被用來在網路中識別該設備
- 最大傳輸單元,在單個傳輸中最大協議數據單位的大小,任何大於這個大小的數據將被分為多個包來進行傳輸
- 該設備當前已經處於連接狀態
- 這個設備使用的連接名稱是
ethernet-enp0s8
- 這個設備使用的 IP 地址如上面所要求的那樣,被設置為
192.168.4.26/24
其他的信息則是與這個設備連接的網路相關的默認路由和網關設置信息。
nmcli 的互動式編輯器
儘管 nmcli
是一個命令行工具,但它還包含一個基本的互動式編輯器,edit
子命令將為你指定的連接打開一個互動式編輯器,例如:
$ nmcli connection edit ethernet-enp0s8
它將顯示少量的幫助文字,接著是 nmcli
的命令提示符:
===| nmcli interactive connection editor |===
Editing existing '802-3-ethernet' connection: 'ethernet-enp0s8'
Type 'help' or '?' for available commands.
Type 'print' to show all the connection properties.
Type 'describe [<setting>.<prop>]' for detailed property description.
You may edit the following settings: connection, 802-3-ethernet (ethernet), 802-1x, dcb, sriov, ethtool, match, ipv4, ipv6, tc, proxy
nmcli>
假如你輸入 print
然後敲擊 Enter
鍵, nmcli
將列舉出與這個介面相關的所有屬性。這些屬性有很多,你可以上下翻動來查看這個列表:
===============================================================================
Connection profile details (ethernet-enp0s8)
===============================================================================
connection.id: ethernet-enp0s8
connection.uuid: 09d26960-25a0-440f-8b20-c684d7adc2f5
connection.stable-id: --
connection.type: 802-3-ethernet
connection.interface-name: enp0s8
connection.autoconnect: yes
connection.autoconnect-priority: 0
connection.autoconnect-retries: -1 (default)
connection.multi-connect: 0 (default)
connection.auth-retries: -1
connection.timestamp: 1593967212
connection.read-only: no
connection.permissions: --
connection.zone: --
connection.master: --
connection.slave-type: --
connection.autoconnect-slaves: -1 (default)
connection.secondaries: --
如果你想將你的連接改為 DHCP,則請輸入 goto ipv4
然後敲 Enter
鍵:
nmcli> goto ipv4
You may edit the following properties: method, dns, dns-search, dns-options, dns-priority, addresses, gateway, routes, route-metric, route-table, routing-rules, ignore-auto-routes, ignore-auto-dns, dhcp-client-id, dhcp-iaid, dhcp-timeout, dhcp-send-hostname, dhcp-hostname, dhcp-fqdn, dhcp-hostname-flags, never-default, may-fail, dad-timeout
nmcli ipv4>
你想改變的屬性是 method
,再繼續敲 set method auto
然後敲 Enter
鍵:
nmcli ipv4> set method auto
Do you also want to clear 'ipv4.addresses'? [yes]:
假如你想讓這個連接清除掉這個靜態 IP 地址,則請敲 Enter
鍵,如果要保留,則輸入 no
然後敲 Enter
鍵。假如你想在將來再次使用它,你可以保留這個 IP 地址。即便存儲了一個靜態的 IP 地址,如果 method
被設置為 auto
,它仍然會使用 DHCP。
最後輸入 save
來保存你的更改:
nmcli ipv4> save
Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully updated.
nmcli ipv4>
輸入 quit
來離開 nmcli
的互動式編輯器窗口。假如你不想離開,可以輸入 back
來回到最開始的命令行提示符界面,然後繼續使用這個編輯器。
nmcli 的更多內容
瀏覽互動式編輯器,你就可以看到 nmcli
有多少設定和每個設定有多少屬性。互動式編輯器是一個簡潔的工具,但如果需要在命令行或者在腳本中使用 nmcli
,你還是需要使用常規的命令行版本。
現在你有了這些基礎知識,你還可以查看 nmcli
的 man 頁面 來查看它還可以提供什麼更多功能。
via: https://opensource.com/article/20/7/nmcli
作者:Dave McKay 選題:lujun9972 譯者:FSSLC 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive