Linux
什麼是沒有傳出網路介面的 Linux IP 路由(RTLINK 答案缺少“RTA_OIF”),我如何創建一個用於測試的路由?
當使用 RTLINK 從(網路命名空間的)Linux 核心查詢可用的 IP 路由時,我注意到在一個測試系統上,RTLINK 返回一個沒有
RTA_OIF
屬性的路由,也就是說,沒有指定傳出網路介面。不幸的是,我不知道如何使用該
ip route add
命令重現這種情況(用於測試),並且到目前為止,我所接觸到的任何人都無法解釋最初創建此路由的“什麼”,而沒有任何傳出網路介面的指示。通過查看 Linux 核心原始碼,我注意到傳出網路介面屬性實際上是可選的。但是,我的嘗試ip route add
總是以核心自動添加的傳出網路介面或無法訪問而告終:
ip route add 1.1.1.1/32 via 1.1.1.2
給RTNETLINK answers: Network is unreachable
.下一次(失敗)嘗試:
ip addr add 1.1.1.2/32 dev ens33 ip route add 1.1.1.1/32 via 1.1.1.2 ip route show
…然後給出
1.1.1.1 via 1.1.1.2 dev ens33
,核心自動插入了一個合適的傳出網路介面(因此RTA_OIF
存在,即使我一開始沒有指定它)。搜尋“沒有傳出介面的 linux ip route”或類似的東西不會給我任何可用的結果——除非我在這裡忽略了一些重要的東西。
那麼,如何創建一個(測試)案例,其中我有一個沒有傳出網路介面的 IP 路由?我在這裡俯瞰什麼?
事實證明,沒有傳出網路介面的路由(不是:與路由相關的規則)至少用於以下三個案例:
- 所謂的黑洞路由,IP 堆棧會靜默丟棄與該路由匹配的所有流量。
- 無法到達的路由,IP 堆棧會丟棄所有發往這些路由的流量,並另外觸發 ICMP(v6) 無法到達的響應。
- 禁止路由,IP 堆棧再次丟棄所有流量,也發送 ICMP(v6) 響應,但這一次是“禁止”而不是“無法訪問”。
這些路線可以很容易地創建如下:
# ip route add blackhole 1.2.3.4 # ip route add unreachable 1.2.3.5 # ip route add prohibit 1.2.3.6
ip route show
然後確認這些路由沒有傳出網路介面:$ ip route show ... blackhole 1.2.3.4 unreachable 1.2.3.5 prohibit 1.2.3.6