l一個是緩存路由(fib),是自動學習生成自動管理的,用戶沒必要去干預,但是內核還是提供了方法讓用戶可以去清空它。但是用戶不能設置它的項,但是可以根據這個緩存更新的原理從外部影響他。
l路由表:一共有256個,在內核中是一個數組,可以配置讓內核使用其中的一個或者多個。默認的是使用0,254,255這三個。一般大家關系都是254號的main路由,route 命令看到的和操作的都是這個路由表。255是local路由,還包含了廣播地址等,0是全路由,還包括了ipv6的,是最全面的。但是254的主路由是最容易看,也是用戶最關心的,所以route命令只操作這個路由表。選擇使用哪個路由表叫做留有策略,這個也是可以通過ip rule命令配置的。
l單播。目的地址是某一個ip,一般是手動添加的。
l網段。這個是最常見的,到達某個網段需要從哪裡發送出去
lNat。是的,nat也是路由的一種,他會修改掉ip的地址域為要到達的地址。之所以nat也是路由的一種是因為,nat也是一種形式的路由。這個nat和iptable的nat是同時存在的兩種不同的機制。
lUnreachable:不可達類型的路由。我們經常看到不可達,通常是因為沒有配置到目的地址的路由,或者是配置的不對。但是還可以單獨的配置一個不可達類型的路由,即使他是可達的。
lProhibit:禁止類型的路由。到某個地址的路由默認都是添加的如何到達,但是也可以添加如何禁止。同樣是到某個網段或地址的路由,可以在某個網口上設置其禁止,這個與實際的到不了不再一個層次。這個是查路由的時候路由表告訴你的這個網段是被禁止的。
lBlackhole:到達目標網段的所有數據包都可以查到,但是都會直接被丟棄。也就是這是一個欺騙的路由條目。你以為你查到了,你以為你發出去了,其實都被悄悄地丟掉了。
這些種類的路由由於功能和路由策略重合,同時使用比較混亂,所以如果要實現復雜的路由,就應該使用路由策略規則,而不是這裡的路由類型。
路由表的查詢匹配算法一般是lpm(longest prefix match),這種算法適合於不同精細度的網段,允許匹配最精細的網段設置,如果沒有更精細的則匹配當前的。最不精細的等級就是0.0.0.0網段,可以匹配全部的網段。
每一個路由表都對應一個路由策略,默認的路由策略最簡單,就是查詢表即可。默認也有3個路由策略:
所以,我們自己添加了一個0,254,255之外的路由表之後,這個路由表也是不會正常的工作的,路由表只是數據庫,查不查詢,怎麼查詢是由路由策略決定的。自己添加了路由表之後要想讓這個路由表被查詢,需要添加一個對應的路由策略。默認的路由策略都是lookup,就是我們通常意義的查詢行為,還有其他的路由策略行為:
lNat:查詢到的路由是用來做nat的。對應的路由表中一般是有很多nat類型的路由表
lUnreachable:所有在對應的路由表中查到的路由條目都給出unreachable的答案
lProhibit:所有在對應的路由表中查到的路由條目都給出prohibit的答案
lBlackhole:所有在對應的路由表中查到的路由條目都直接丟棄
路由策略從第一個開始向後查詢,進入查詢每個策略對應的路由表,如果查到了,就采取對應的路由策略規定的行為。
路由會現在緩存(fib)中查找,找不到則到路由表中查找。但是這個在路由表中查找並不但單純的去查表,網上很多資料都是描述的仿佛是直接去查路由表,匹配目的地址,但這已經是2.2版本內核之前的事情了。現在的流程復雜的多。
以前的路由查找,只是單純的根據目的ip地址來進行lpm匹配查詢,而現在的策略路由支持根據其他的域,比如源地址,tos,來的端口等來決定匹配的策略(這些叫做selector)。當然,路由表還是單純的目的地址匹配,支持多種匹配的是路由策略(rule)。