Linux

什麼是沒有傳出網路介面的 Linux IP 路由(RTLINK 答案缺少“RTA_OIF”),我如何創建一個用於測試的路由?

  • November 28, 2018

當使用 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.2RTNETLINK 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 路由?我在這裡俯瞰什麼?

事實證明,沒有傳出網路介面的路由(不是:與路由相關的規則)至少用於以下三個案例:

  1. 所謂的黑洞路由,IP 堆棧會靜默丟棄與該路由匹配的所有流量。
  2. 無法到達的路由,IP 堆棧會丟棄所有發往這些路由的流量,並另外觸發 ICMP(v6) 無法到達的響應。
  3. 禁止路由,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

引用自:https://unix.stackexchange.com/questions/484453