指令比較:ifconfig vs ip
在 Linux 系統中,管理和查詢網路介面設定是最常見的操作之一。過去我們習慣使用 ifconfig,但在現代 Linux 發行版中,ip 指令已經成為標準的替代方案。
1. 基本差異與背景
| 特性 | ifconfig | ip |
|---|---|---|
| 所屬套件 | net-tools | iproute2 |
| 狀態 | 已過時 (Deprecated) | 現代標準 (Modern Standard) |
| 核心介面 | 使用較舊的 ioctl 系統呼叫 | 使用較新、效能更好的 netlink 通訊端 |
| 功能範圍 | 主要針對網路介面 (IP 網址、MAC、MTU 等) | 功能全面 (包含介面、路由、ARP 快取、Tunnel、Network Namespace 等) |
ifconfig 長期以來是管理網路的標準工具,但因其架構限制與缺乏新層級網路技術的支援,在多數現代 Linux 發行版 (如 CentOS 7+, Ubuntu 18.04+, Debian) 中已經被棄用甚至預設不予安裝,取而代之的是功能 更強大的 iproute2 工具集中的 ip 指令。
2. 常用指令對照表
如果你已經熟悉 ifconfig,可以透過以下對照表快速學習 ip 的同等操作:
查詢網路資訊
| 任務 | ifconfig (與舊版套件) | ip 指令 |
|---|---|---|
| 顯示所有啟用的介面 | ifconfig | ip addr show 或縮寫 ip a |
| 顯示所有介面 (含已關閉) | ifconfig -a | ip link show 或縮寫 ip l |
| 顯示特定介面 (如 eth0) | ifconfig eth0 | ip addr show eth0 或 ip a show dev eth0 |
| 顯示介面統計資訊 | ifconfig eth0 | ip -s link show eth0 |
修改網路設定
| 任務 | ifconfig | ip 指令 |
|---|---|---|
| 啟用介面 (Up) | ifconfig eth0 up | ip link set eth0 up |
| 停用介面 (Down) | ifconfig eth0 down | ip link set eth0 down |
| 設定 IP 與遮罩 | ifconfig eth0 192.168.1.10 netmask 255.255.255.0 | ip addr add 192.168.1.10/24 dev eth0 |
| 移除 IP 設定 | 通常使用 ifconfig eth0 0 | ip addr del 192.168.1.10/24 dev eth0 |
| 清除介面所有 IP | 無直接指令 | ip addr flush dev eth0 |
| 修改 MAC 位址 | ifconfig eth0 hw ether 00:11:22:33:44:55 | ip link set dev eth0 address 00:11:22:33:44:55 |
路由與 ARP (搭配其他 net-tools 工具)
以往我們會用到 route 和 arp 指令,現在都可以整合到 ip 中呼叫:
| 任務 | 舊版工具 net-tools | ip 指令 |
|---|---|---|
| 顯示路由表 | route -n | ip route show 或 ip r |
| 新增預設閘道 | route add default gw 192.168.1.1 | ip route add default via 192.168.1.1 |
| 顯示 ARP 快取表 | arp -an | ip neigh show 或 ip n |
3. 為什麼要改用 ip 指令?
- 功能更強大:除了基本的 IP 設定之外,
ip指令可以設定 Policy Routing (策略路由)、建置 Tunnel 工具、處理 Network Namespace,這些都是 Docker 和 Kubernetes 等雲端原生技術底層依賴的網路功能 (ifconfig無法做到)。 - 輸出更好解析:
ip提供了 JSON 格式輸出的選項 (例如ip -j a),在撰寫腳本和自動化維運時非常好用。 - 一致性的語法:
ip指令的語法採用ip [OPTIONS] OBJECT [COMMAND]的邏輯 (例如:ip addr show、ip route add),架構分明,相較於ifconfig大雜燴的寫法更容易記憶與擴展。
總結:雖然老派的 Linux 使用者可能對 ifconfig 依賴甚深,但擁抱 ip 指令絕對是現代 Linux 系統管理與容器化技術的必備技能。
4. 補充:在 macOS 上沒有 ip 指令?
如果你在 Mac 的終端機(Terminal 或 iTerm2)上輸入 ip a 或 ip,可能會出現 command not found: ip:
zsh: command not found: ip
這是因為 ip 指令(iproute2 套件)是 Linux 專屬的工具。
macOS 的底層是基於 BSD 作業系統,而不是 Linux。在 BSD 系統(包含 macOS、FreeBSD 等)中,網路設定依然維持使用傳統的工具:
- 查看或設定網路介面:
ifconfig - 查看路由:
netstat -nr或route - 查看 ARP 表:
arp -an
解決方案:
- 直接使用
ifconfig:在 macOS 開發或日常使用上,習慣使用ifconfig即可。 - 安裝
iproute2mac(如果你真的想在 Mac 上用ip): 可以透過 Homebrew 安裝一個名為iproute2mac的 Python 封裝工具,它會把ip指令的語法轉換成 macOS 系統認得的ifconfig/route指令。安裝後,你就可以在 Mac 上快樂地使用brew install iproute2macip a和ip r了。