最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Linux 路由三大件

2023-08-15 16:31 作者:補給站Linux內(nèi)核  | 我要投稿

對于 Linux 網(wǎng)絡,好奇心強的同學一定思考過兩個問題:

  • 當我們發(fā)出一個包的時候,Linux 是如何決策該從哪個網(wǎng)卡(假設有多個網(wǎng)卡)、哪個下一跳發(fā)出這個包,用什么 IP 作為 source......

  • 當 Linux 收到一個包時,又是如何決定往哪里送的,是發(fā)送給本地程序、其他虛擬接口,還是轉(zhuǎn)發(fā)到其他機器......

今天,我們就來分析這兩個問題的核心所在:路由。

我們學習計算機網(wǎng)絡的時候,一般都會了解到基于目的地址(cidr)的路由(ip route),但是在 Linux 2.0 之后,RPDB (Routing Policy DataBase)誕生了,引入了更豐富的路由策略(ip rule)。除此以外,我們還可以通過?iptables?來操縱數(shù)據(jù)包,作為路由策略實施的依據(jù),間接地影響路由過程。

至此,我們就認識了 Linux 路由的三大件。那么,三大件分別是什么原理,又是是如何交互的呢?且看下文分析。

注:雖然 Linux 提出了 nftables 來替換 iptables,但 iptables 仍然是事實上的標準

RPDB

首先我們來看看 RPDB,RPDB 由兩部分組成,一個是?rule?列表,一個是?routing table?列表。

rule

ip rule?命令可以展示所有的?rule,每個?rule?由 selector(依據(jù)什么特征選擇包) 和對應 action(對包做什么) 組成。

selector 主要有幾種類型:

  • 出/入接口的 index,如 eth0、eth1

  • fwmark: 包攜帶的標記

  • Tunnel id

  • src/dst addr/port

  • type of service

  • priority

  • ......

action 主要由幾種類型:

  • 傳遞給特定的?route

  • 跳轉(zhuǎn)到其它的?rule

  • Drop/reject 這個包

  • ......

routing table

routing table?最開始只有一個,RPDB 后引入了多個(可以通過?cat /etc/iproute2/rt_tables?查看),默認有三個:

  • local,dst 為本地或者廣播地址的路由

  • main,默認的路由

  • default,一般為空,為后處理預留空間

ip route?命令默認展示的是 main table,ip route show table local?形式可以展示其它 table。

routing table?里面每個?route?代表了?dst 為某個/些/類地址?的數(shù)據(jù)包應該?通過哪個渠道?轉(zhuǎn)發(fā)。route?由幾部分組成:

  • types

    • unicast,單播,最常見

    • unreachable,丟包并返回 ICMP 消息

    • blackhole, 默默丟包

    • ......

  • socpe,目標地址的范圍:?cat /etc/iproute2/rt_scopes,默認有三個

    • link,只在本設備有效,通常是直連

    • host,只在本機有效

    • global,全局有效,可傳播,是默認值

    • ......

  • proto,路由由誰創(chuàng)建和維護:?/etc/iproute2/rt_protos,默認有三個

    • kernel,內(nèi)核創(chuàng)建,長期有效

    • boot,臨時的

    • static,手動創(chuàng)建,override 動態(tài)路由(由路由協(xié)議維護entry)

    • ......

  • preference,優(yōu)先級,一般都是數(shù)字越小,優(yōu)先級越高

  • dev,通過的設備名字,如 eth0

  • nexthop,下一跳

  • src,設置發(fā)出包的 src ip

  • ......

RPDB 運行邏輯

參考 fib_lookup 函數(shù):如果你沒有動過 RPDB,那么直接用 mian table 進行路由查找(fib_table_lookup)了;如果動過,則通過?__fib_lookup/fib_rules_lookup 進行 rule 匹配,匹配邏輯為:

  • 無論是出還是入方向的每個包,都會遍歷所有 rule,按照 priority,由 0 開始

  • 第一個匹配的 rule 會執(zhí)行 action

  • 如果 action 是 lookup route table,則用對應 table 進行路由查找(fib_table_lookup),如果查找失敗,則繼續(xù)執(zhí)行下一個 rule

  • 如果沒有任何 rule 匹配,則報錯

路由查找邏輯為:

  • 最長前綴匹配(也是被認為最精準的)的 route 被選中

  • 如果有多個匹配,則 preference、tos/dscp、自然順序都會被進行考慮,最后僅剩一個匹配

  • 如果沒有匹配,則返回 rule 匹配,繼續(xù)檢查下一個 rule

iptables

iptables 主要用于包過濾、修改和 NAT。再次拿出下面這張神圖,來闡釋它五大表和五大鏈,及其生效順序和范圍:

原圖:https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg



【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ?


三大件的交互過程

了解了各自原理之后,我們當然想知道它們是怎么交互的。上面那張圖實際上已經(jīng)闡釋了他們之間的交互,不過下面這張圖能看得更清晰:

原圖:http://www.adminsehow.com/2011/09/iptables-packet-traverse-map/

實踐

這是一個完全沒動過的環(huán)境:

我們現(xiàn)在來設計一個需求:源端口為 30300 的包,默默丟棄;源端口為 30301 的包,丟棄并報錯;源端口為 30302 的包,用新的?route table?轉(zhuǎn)發(fā)。
先看看實施前的結(jié)果,用 taobao.com 來測試

雖然實現(xiàn)這個需求有很多方式,但是我這里為了演示三大件的交互而選擇了下面的這種方式:

首先需要標記這三種類型的包,由于是本地發(fā)包,我們采用 mangle output

iptables -t mangle -L?展示,iptables -t mangle -F?清理。

然后增加相應的?route table

以及 rule

結(jié)果發(fā)現(xiàn) 30302 依然能通,但是 30300 和 30301 都超時了,沒看出來返回的錯誤。
采用 traceroute 的 tcp 模式作為測試工具則能夠看出一些差別。

ip rule add from all fwmark 2 unreachable?對應結(jié)果也確實符合期望



原文作者:九零后程序員



Linux 路由三大件的評論 (共 條)

分享到微博請遵守國家法律
静乐县| 富平县| 柳江县| 祁门县| 镶黄旗| 沧源| 屏南县| 莆田市| 甘德县| 庐江县| 巫溪县| 黎城县| 隆昌县| 阜新| 锡林浩特市| 镶黄旗| 新晃| 丰镇市| 广德县| 郁南县| 平塘县| 荃湾区| 如皋市| 长垣县| 炉霍县| 普兰县| 青海省| 甘孜县| 长宁县| 恭城| 黑河市| 永泰县| 酒泉市| 宁陕县| 高台县| 达州市| 江门市| 黎川县| 鸡东县| 五寨县| 鄄城县|