前陣子因為實驗需求,我經常使用 ip route 和 route 來操作與查看 routing table。在這段期間,我做了不少研究和實驗,現在趁著記憶還很清晰,把這些知識整理成文章分享給大家。
ip route 路由表記錄格式
每條 route entry 的基本格式如下:
<destination> via <gateway> dev <interface> proto <protocol> src <source> <options>
讓我們來看看各個欄位的含義:
default:預設路由,當封包無法匹配到其他更具體的 routing rules 時,就會套用這條路由。via <gateway>:指定 next hop 的 IP address,系統會透過這個 gateway 來轉發封包。dev <interface>:指定用來傳送該路由流量的 network interface,例如eth0。proto <protocol>:標示路由的來源,最常見的有:kernel:系統開機時由 kernel 自動建立。就算修改這個條目,系統很有可能重新建立它dhcp:透過 DHCP protocol 動態取得static:管理員手動設定
scope:定義路由的作用範圍:global:具有 gateway 的 unicast route,可轉發到外部網路link:local direct route,不需經過 gateway 即可到達host:僅針對 local host 的路由
metric:route priority,數字越小代表優先級越高src:指定 source IP address,用於設定 local interface 在該路由下使用的 IP。換句話說,當你的電腦要使用這條路由傳送封包時,它會使用這個 IP 位址作為封包的「發送者地址」
特別要注意的是,src option 僅會影響該 host 本身產生的網路封包。對於那些經由本機轉發的封包,因為它們本身就已經帶有 source IP,所以 src 參數的設定不會對它們造成影響,除非你特別使用 NAT 來進行修改。
ip route 與 route -n 輸出欄位的對照與說明
在 Linux 系統中,ip route 和 route -n 都是查看 routing table 的常見工具。說到這兩個指令的差異,雖然就排版的角度來看,我個人比較喜歡 route -n 的呈現方式,但不得不說 ip route 確實有它的優勢:不僅在大多數 Linux distributions 中都是預設安裝的,而且還能提供更豐富的路由資訊。
讓我們透過實際的例子來看看,這兩個指令的輸出該如何轉換和解讀:

route -n的輸出:
0.0.0.0 172.22.112.1 0.0.0.0 UG 0 0 0 eth0ip route的輸出:
default via 172.22.112.1 dev eth0 proto kernel
這條路由的含義是:當封包無法匹配到其他路由規則時(也就是預設路由),系統會將流量透過 eth0 介面發送到閘道器 172.22.112.1。
讓我們來看看欄位的對應關係:
- Destination:
route -n中的0.0.0.0對應到ip route中的default關鍵字,兩者都代表預設路由。 - Gateway: 兩個指令都清楚地標示出閘道器的 IP 位址是
172.22.112.1(分別以Gateway和via表示)。 - Genmask: 在
route -n中使用0.0.0.0作為子網路遮罩,表示會匹配所有 IP。而在ip route中,這個概念已經包含在default關鍵字裡了。 - Flags:
route -n中的UG旗標包含兩層含義:U(Up):表示路由已啟用G(Gateway):表示此路由需要透過閘道器轉發
- Iface: 兩者都指出使用的是
eth0介面(分別以Iface和dev表示)。 - Others:
Metric、Ref和Use這些資訊在ip route的預設輸出中是看不到的。
再來看另一個例子:

route -n的輸出:
172.18.0.0 0.0.0.0 255.255.255.0 U 0 0 0 my-brip route的輸出:
172.18.0.0/24 dev my-br proto kernel scope link src 172.18.0.1 linkdown
這條路由告訴我們:前往 172.18.0.0/24 網路的流量應該透過 my-br interface 傳送,並使用 172.18.0.1 作為來源 IP。不過要特別注意的是,因為 linkdown 狀態顯示該 interface 目前處於關閉狀態,所以這條路由實際上是無法使用的。
讓我們來看看欄位的對應關係:
- Destination: 兩者都指向
172.18.0.0這個網段,但ip route採用更現代的 CIDR notation/24。 - Gateway:
route -n中的0.0.0.0表示這是 directly connected network,不需要 gateway。同樣地,ip route中沒有viakeyword 也是相同的意思。 - Netmask:
255.255.255.0等同於 CIDR 的/24notation。 - Flags: 這裡就能看出
ip route的優勢了 —— 它不只顯示了基本的U(Up)status,還額外標示出linkdownstatus,讓我們立即知道 interface 已經關閉。 - Others:
src 172.18.0.1:指定 interface 的 IP addressscope link:表示這是 local direct routeproto kernel:說明這條 route 是由 kernel 所設定的
絕大多數情況,
route -n輸出的Genmask=255.255.255.255時,Flags 會包含H。對應route -n輸出的欄位是subnet mask=/32。意思是這個路由規則,只服務 1 個特定 IP。
ip route 常用指令
1# 新增一條 route entry2# ip route add [type] [prefix] via [next-hop] dev [interface] [table table-id] [src source-ip]3ip route add 192.168.0.0/24 via 192.168.1.1 dev eth04
5# 移除特定的 route entry6# ip route delete <route-spec>7# <route-spec> 不需要照順序,也不需要全部條件命中8ip route delete default via 192.168.1.1 dev eth09
10# 顯示 routing table 的內容11# 預設只會顯示 main table(table id 254)12ip route show table all13# 也可以指定特定 table14ip route show table local15
2 collapsed lines
16# 清除 routing cache17ip route flush cache