Linux

ip route get 將地址辨識為任播

  • July 17, 2014
# ip route get 1.2.3.4
anycast 1.2.3.4 dev eth0  src 5.6.7.8

問題是它如何知道地址是任播?(這顯然是真的)。

更新:

呈現為任播路由:

root@hv2 ~ # ip route get 1.2.3.4
anycast 1.2.3.4 dev eth0  src 5.6.7.8 
   cache 

但在列表中不可見:

root@hv2 ~ # ip route list|grep 1.2.3.4|wc -l
0

但可以刪除它,然後恢復正常(anycast不再):

root@hv2 ~ # ip route del anycast 1.2.3.4 dev eth0
root@hv2 ~ # ip route get 1.2.3.4
1.2.3.4 via 5.6.7.8 dev eth0  src 9.10.11.12 
   cache 

如果您查看iproute2 gitweb,您會看到它顯示了RTN_ANYCAST核心路由結構上設置的位的狀態。如果您將其與核心原始碼 (rtnetlink.h)交叉引用,您將看到以下註釋:

   RTN_ANYCAST,            /* Accept locally as broadcast,
                              but send as unicast */

如果您查看手冊頁,您會看到地址的任播狀態是由配置確定的(特別是anycast在指定要添加的地址時添加關鍵字)。根據man 8 ip

  IFADDR := PREFIX | ADDR peer PREFIX [ broadcast ADDR ] [ anycast ADDR ]
          [ label STRING ] [ scope SCOPE-ID ]

  ...
          anycast   -   _not  implemented_  the  destinations are anycast
          addresses assigned to this host.  They are mainly equivalent to
          local with one difference: such addresses are invalid when used
          as the source address of any packet.

從手冊的第一部分開始,它聲明當您指定地址時,您可以指示堆棧它是一個任播地址。在不檢查核心原始碼的情況下,我想當您添加任播地址時,任播位會傳播到相應的路由表條目,該條目將在添加地址時創建。

我不確定“未實現”部分是否完全正確,因為看起來 iproute2 確實將任播標誌傳遞給系統呼叫。所以看起來如果核心支持任播,它應該可以工作。但是我沒有測試過,所以我不知道。

引用自:https://serverfault.com/questions/611284