天天看點

linux之路由知識之ip route 指令中的疑惑[通俗易懂]

大家好,又見面了,我是你們的朋友全棧君。

1.基礎知識

1.1 路由 (Routing)

1.1.1 路由政策 (使用 ip rule 指令操作路由政策資料庫)

基于政策的路由比傳統路由在功能上更強大,使用更靈活,它使網絡管理者不僅能夠根據目的位址而且能夠根據封包大小、應用或IP源位址等屬性來選擇轉發路徑。

ip rule 指令:

  • Usage: ip rule [ list | add | del ] SELECTOR ACTION (add 添加;del 删除; llist 清單)
  • SELECTOR := [ from PREFIX 資料包源位址] [ to PREFIX 資料包目的位址] [ tos TOS 服務類型][ dev STRING 實體接口] [ pref NUMBER ] [fwmark MARK iptables 标簽]
  • ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 網絡位址轉換][ prohibit 丢棄該表| reject 拒絕該包| unreachable 丢棄該包]
  • [ flowid CLASSID ]
  • TABLE_ID := [ local | main | default | new | NUMBER ]

例子:

  • ip rule add from 192.203.80/24 table inr.ruhep prio 220 通過路由表 inr.ruhep 路由來自源位址為192.203.80/24的資料包
  • ip rule add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320 把源位址為193.233.7.83的資料報的源位址轉換為192.203.80.144,并通過表1進行路由

在 Linux 系統啟動時,核心會為路由政策資料庫配置三條預設的規則:

  • 0 比對任何條件 查詢路由表local(ID 255) 路由表local是一個特殊的路由表,包含對于本地和廣播位址的高優先級控制路由。rule 0非常特殊,不能被删除或者覆寫。
  • 32766 比對任何條件 查詢路由表main(ID 254) 路由表main(ID 254)是一個通常的表,包含所有的無政策路由。系統管理者可以删除或者使用另外的規則覆寫這條規則。
  • 32767 比對任何條件 查詢路由表default(ID 253) 路由表default(ID 253)是一個空表,它是為一些後續處理保留的。對于前面的預設政策沒有比對到的資料包,系統使用這個政策進行處理。這個規則也可以删除。

不要混淆路由表和政策:規則指向路由表,多個規則可以引用一個路由表,而且某些路由表可以沒有政策指向它。如果系統管理者删除了指向某個路由表的所有規則,這個表就沒有用了,但是仍然存在,直到裡面的所有路由都被删除,它才會消失。

(資料來源)

1.1.2 路由表 (使用 ip route 指令操作靜态路由表)

所謂路由表,指的是路由器或者其他網際網路網絡裝置上存儲的表,該表中存有到達特定網絡終端的路徑,在某些情況下,還有一些與這些路徑相關的度量。路由器的主要工作就是為經過路由器的每個資料包尋找一條最佳的傳輸路徑,并将該資料有效地傳送到目的站點。由此可見,選擇最佳路徑的政策即路由算法是路由器的關鍵所在。為了完成這項工作,在路由器中儲存着各種傳輸路徑的相關資料——路由表(Routing Table),供路由選擇時使用,表中包含的資訊決定了資料轉發的政策。打個比方,路由表就像我們平時使用的地圖一樣,辨別着各種路線,路由表中儲存着子網的标志資訊、網上路由器的個數和下一個路由器的名字等内容。路由表根據其建立的方法,可以分為動态路由表和靜态路由表。

linux 系統中,可以自定義從 1-252個路由表,其中,linux系統維護了4個路由表:

  • 0#表: 系統保留表
  • 253#表: defulte table 沒特别指定的預設路由都放在改表
  • 254#表: main table 沒指明路由表的所有路由放在該表
  • 255#表: locale table 儲存本地接口位址,廣播位址、NAT位址 由系統維護,使用者不得更改

路由表的檢視可有以下二種方法:

  • ip route list table table_number
  • ip route list table table_name

路由表序号和表名的對應關系在 /etc/iproute2/rt_tables 檔案中,可手動編輯。路由表添加完畢即時生效,下面為執行個體:

  • ip route add default via 192.168.1.1 table 1 在一号表中添加預設路由為192.168.1.1
  • ip route add 192.168.0.0/24 via 192.168.1.2 table 1 在一号表中添加一條到192.168.0.0網段的路由為192.168.1.2

以下面的路由表為例:

Destination    Netmask    Gateway          Interface    Metric0.0.0.0    0.0.0.0    192.168.123.254    192.168.123.88    1 #預設路由,目的位址不在本路由表中的資料包,經過本機的 192.168.123.88 接口發到下一個路由器 192.168.123.254127.0.0.0    255.0.0.0    127.0.0.1    127.0.0.1    1        #發給本機的網絡包192.168.123.0    255.255.255.0    192.168.123.68    192.168.123.68    1 #直連路由。目的位址為 192.168.123.0/24 的包發到本機 192.168.123.88 接口192.168.123.88    255.255.255.255    127.0.0.1    127.0.0.1    1        #目的位址為 192.168.123.88的包是發給本機的包192.168.123.255    255.255.255.255    192.168.123.88    192.168.123.88    1 #廣播包的網段是 192.168.123.0/24,經過 192.168.123.88 接口發出去224.0.0.0    224.0.0.0    192.168.123.88    192.168.123.88    1             #多點傳播包,經過 192.168.123.88 接口發出去255.255.255.255    255.255.255.255    192.168.123.68    192.168.123.68    1 #全網廣播包Default Gateway: 192.168.123.254           

複制

各字段說明:

  • destination:目的網段
  • mask:與網絡目标位址相關聯的網掩碼(又稱之為子網路遮罩)。子網路遮罩對于 IP 網絡位址可以是一适當的子網路遮罩,對于主機路由是 255.255.255.255 ,對于預設路由是 0.0.0.0。如果忽略,則使用子網路遮罩 255.255.255.255。定義路由時由于目标位址和子網路遮罩之間的關系,目标位址不能比它對應的子網路遮罩更為詳細。換句話說,如果子網路遮罩的一位是 0,則目标位址中的對應位就不能設定為 1。
  • interface:到達該目的地的本路由器的出口ip
  • gateway: 下一跳路由器入口的 ip,路由器通過 interface 和 gateway 定義一調到下一個路由器的鍊路。通常情況下,interface 和 gateway 是同一網段的metric 跳數,該條路由記錄的品質,一般情況下,如果有多條到達相同目的地的路由記錄,路由器會采用metric值小的那條路由

根據子網路遮罩,可以将路由分為三種類型:

  • 主機路由:機路由是路由選擇表中指向單個IP位址或主機名的路由記錄。主機路由的Flags字段為H。
Destination    Gateway       Genmask        Flags     Metric    Ref    Use    Iface
-----------    -------     -------            -----     ------    ---    ---    -----
10.0.0.10     192.168.1.1    255.255.255.255   UH       0    0      0    eth0           

複制

  • 網絡路由:網絡路由是代表主機可以到達的網絡。網絡路由的Flags字段為N。例如,在下面的示例中,本地主機将發送到網絡192.19.12的資料包轉發到IP位址為192.168.1.1的路由器。
Destination    Gateway       Genmask      Flags    Metric    Ref     Use    Iface
-----------    -------     -------         -----    -----   ---    ---    -----
192.19.12     192.168.1.1    255.255.255.0      UN      0       0     0    eth0           

複制

  • 預設路由:當主機不能在路由表中查找到目标主機的IP位址或網絡路由時,資料包就被發送到預設路由(預設網關)上。預設路由的Flags字段為G。
Destination    Gateway       Genmask    Flags     Metric    Ref    Use    Iface
-----------    -------     ------- -----      ------    ---    ---    -----
default       192.168.1.1     0.0.0.0    UG       0        0     0    eth0           

複制

設定和檢視路由表都可以用 route 指令,設定核心路由表的指令格式是:route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]

其中:

  • add : 添加一條路由規則,del : 删除一條路由規則,-net : 目的位址是一個網絡,-host : 目的位址是一個主機,target : 目的網絡或主機
  • netmask : 目的位址的網絡掩碼,gw : 路由資料包通過的網關,dev : 為路由指定的網絡接口

比如:

  • route add 0.0.0.0 mask 0.0.0.0 192.168.12.1
  • route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 metric 7

(資料來源:(1),(2),(3))

關于 src 屬性:

當一個主機有多個網卡配置了多個 IP 的時候,對于它産生的網絡包,可以在路由選擇時設定源 IP 位址。比如:

ip route add 78.22.45.0/24 via 10.45.22.1 src 10.45.22.12 (發到 78.22.45.0/24 網段的網絡包,下一跳的路由器 IP 是 10.45.22.1,包的源IP位址設為10.45.22.12)。

要注意的是,src 選項隻會影響該 host 上産生的網絡包。如果是一個被路由的外來包,明顯地它已經帶有了一個源 IP 位址,這時候,src 參數的配置對它沒有任何影響,除非你使用 NAT 來改變它。對 Neutron 來說,qrouter 和 qif namespace 中的路由表中的 src 都沒有實際意義,因為它們隻會處理外來的網絡包。

1.1.3 路由分類之靜态路由

靜态路由是指由使用者或網絡管理者手工配置的路由資訊。當網絡的拓撲結構或鍊路的狀态發生變化時,網絡管理者需要手工去修改路由表中相關的靜态路由資訊。靜态路由資訊在預設情況下是私有的,不會傳遞給其他的路由器。當然,網管員也可以通過對路由器進行設定使之成為共享的。靜态路由一般适用于比較簡單的網絡環境,在這樣的環境中,網絡管理者易于清楚地了解網絡的拓撲結構,便于設定正确的路由資訊。

linux之路由知識之ip route 指令中的疑惑[通俗易懂]

以上面的拓撲結構為例,在沒有配置路由的情況下,計算機1 和 2 無法互相通信,因為 1 發給 2 的包在到達路由器 A 後,它不知道怎麼轉發它。B 也同樣。管理者可以配置如下的靜态路由來實作 1 和 2 之間的通信:

計算機配置預設網關:

  • 計算機1 上:route add default gw 192.168.1.1
  • 計算機2 上:route add default gw 192.168.3.1

路由器配置:

  • R1 上:ip route 192.168.3.0 255.255.255.0 f0/1 (意思為:目标網絡位址為 192.168.3.0/24 的資料包,經過 f0/1 端口發出)
  • R2 上:ip route 192.168.1.0 255.255.255.0 f0/1 (意思為:目标網絡位址為 192.168.1.0/24 的資料包,經過 f0/1 端口發出)

或者

  • R1 上:ip route 192.168.3.0 255.255.255.0 192.168.2.2 (意思為:要去 192.168.3.0/24 的資料包,下一路由器 IP 位址為 192.168.2.2)
  • R2 上:ip route 192.168.1.0 255.255.255.0 192.168.2.1

(來源:靜态路由_百度百科)

1.1.4 路由分類之動态路由

動态路由是指路由器能夠自動地建立自己的路由表,并且能夠根據實際情況的變化适時地進行調整。它是與靜态路由相對的一個概念,指路由器能夠根據路由器之間的交換的特定路由資訊自動地建立自己的路由表,并且能夠根據鍊路和節點的變化适時地進行自動調整。當網絡中節點或節點間的鍊路發生故障,或存在其它可用路由時,動态路由可以自行選擇最佳的可用路由并繼續轉發封包。

常見的動态路由協定有以下幾個:路由資訊協定(RIP)、OSPF(Open Shortest Path First開放式最短路徑優先)、IS-IS(Intermediate System-to-Intermediate System,中間系統到中間系統)、邊界網關協定(BGP)是運作于 TCP 上的一種自治系統的路由協定。

(來源:動态路由_百度百科)

1.1.5 ip rule,ip route,iptables 三者之間的關系

以一例子來說明:公司内網要求192.168.0.100 以内的使用 10.0.0.1 網關上網 (電信),其他IP使用 20.0.0.1 (網通)上網。

  1. 首先要在網關伺服器上添加一個預設路由,當然這個指向是絕大多數的IP的出口網關:ip route add default gw 20.0.0.1
  2. 之後通過 ip route 添加一個路由表:ip route add table 3 via 10.0.0.1 dev ethX (ethx 是 10.0.0.1 所在的網卡, 3 是路由表的編号)
  3. 之後添加 ip rule 規則:ip rule add fwmark 3 table 3 (fwmark 3 是标記,table 3 是路由表3 上邊。 意思就是凡事标記了 3 的資料使用 table3 路由表)
  4. 之後使用 iptables 給相應的資料打上标記:iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 – 192.168.0.100 -j MARK –set-mark 3

因為 mangle 的處理是優先于 nat 和 fiter 表的,是以在資料包到達之後先打上标記,之後再通過 ip rule 規則,對應的資料包使用相應的路由表進行路由,最後讀取路由表資訊,将資料包送出網關。

(來源:使用 ip route , ip rule , iptables 配置政策路由。這裡 有一個更詳細的例子)

linux之路由知識之ip route 指令中的疑惑[通俗易懂]

這裡可以看出 Netfilter 處理網絡包的先後順序:接收網絡包,先 DNAT,然後查路由政策,查路由政策指定的路由表做路由,然後 SNAT,再發出網絡包。

1.1.6 Traceroute 工具

我們在 linux 機器上,使用 traceroute 來獲知從你的計算機到網際網路另一端的主機是走的什麼路徑。當然每次資料包由某一同樣的出發點(source)到達某一同樣的目的地(destination)走的路徑可能會不一樣,但基本上來說大部分時候所走的路由是相同的。在 MS Windows 中該工具為 tracert。 在大多數情況下,我們會在linux主機系統下,直接執行指令行:traceroute hostname;而在Windows系統下是執行tracert的指令: tracert hostname。

  • 指令格式:traceroute [參數] [主機]
  • 指令功能:traceroute 指令讓你追蹤網絡資料包的路由途徑,預設資料包大小是 40Bytes,使用者可另行設定。
  • 具體參數格式:traceroute [-dFlnrvx][-f<存活數值>][-g<網關>…][-i<網絡界面>][-m<存活數值>][-p<通信端口>][-s<來源位址>][-t<服務類型>][-w<逾時秒數>][主機名稱或IP位址][資料包大小]
  • 指令參數:
    • -d 使用Socket層級的排錯功能,-f 設定第一個檢測資料包的存活數值TTL的大小,-F 設定勿離斷位,-g 設定來源路由網關,最多可設定8個,-i 使用指定的網絡界面送出資料包,-I 使用ICMP回應取代UDP資料資訊,-m 設定檢測資料包的最大存活數值TTL的大小,-n 直接使用IP位址而非主機名稱。
    • -p 設定UDP傳輸協定的通信端口,-r 忽略普通的Routing Table,直接将資料包送到遠端主機上,-s 設定本地主機送出資料包的IP位址,-t 設定檢測資料包的TOS數值。
    • -v 詳細顯示指令的執行過程,-w 設定等待遠端主機回報的時間,-x 開啟或關閉資料包的正确性檢驗。

(1)例子

[root@localhost ~]# traceroute www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
1 192.168.74.2 (192.168.74.2) 2.606 ms 2.771 ms 2.950 ms
2 211.151.56.57 (211.151.56.57) 0.596 ms 0.598 ms 0.591 ms
3 211.151.227.206 (211.151.227.206) 0.546 ms 0.544 ms 0.538 ms
4 210.77.139.145 (210.77.139.145) 0.710 ms 0.748 ms 0.801 ms
5 202.106.42.101 (202.106.42.101) 6.759 ms 6.945 ms 7.107 ms
6 61.148.154.97 (61.148.154.97) 718.908 ms * bt-228-025.bta.net.cn (202.106.228.25) 5.177 ms
7 124.65.58.213 (124.65.58.213) 4.343 ms 4.336 ms 4.367 ms
8 202.106.35.190 (202.106.35.190) 1.795 ms 61.148.156.138 (61.148.156.138) 1.899 ms 1.951 ms
9 * * *
30 * * *           

複制

說明:

  • 記錄按序列号從1開始,每個紀錄就是一跳 ,每跳表示一個網關,我們看到每行有三個時間,機關是 ms,其實就是 -q 的預設參數。
  • 探測資料包向每個網關發送三個資料包後,網關響應後傳回的時間;如果您用 traceroute -q 4 www.58.com ,表示向每個網關發送4個資料包。
  • 有時我們 traceroute 一台主機時,會看到有一些行是以星号表示的。出現這樣的情況,可能是防火牆封掉了ICMP 的傳回資訊,是以我們得不到什麼相關的資料包傳回資料。
  • 有時我們在某一網關處延時比較長,有可能是某台網關比較阻塞,也可能是實體裝置本身的原因。當然如果某台 DNS 出現問題時,不能解析主機名、域名時,也會 有延時長的現象;您可以加-n 參數來避免DNS解析,以IP格式輸出資料。
  • 如果在區域網路中的不同網段之間,我們可以通過 traceroute 來排查問題所在,是主機的問題還是網關的問題。如果我們通過遠端來通路某台伺服器遇到問題時,我們用到traceroute 追蹤資料包所經過的網關,送出IDC服務商,也有助于解決問題;但目前看來在國内解決這樣的問題是比較困難的,就是我們發現問題所在,IDC服務商也不可能幫助我們解決。

(2)原理

Traceroute 程式的設計是利用 ICMP 及 IP header 的 TTL(Time To Live)欄位(field)。

  1. 首先,traceroute 送出一個 TTL 是 1 的 IP datagram(其實,每次送出的為3個40位元組的包,包括源位址,目的位址和包發出的時間标簽)到目的地,當路徑上的第一個路由器(router)收到這個datagram 時,它将TTL減1。此時,TTL變為0了,是以該路由器會将此 datagram 丢掉,并送回一個「ICMP time exceeded」消息(包括發IP包的源位址,IP包的所有内容及路由器的IP位址),traceroute 收到這個消息後,便知道這個路由器存在于這個路徑上。
  2. 接着,traceroute 再送出另一個TTL 是 2 的datagram,發現第2 個路由器……
  3. 然後,traceroute 每次将送出的 datagram 的 TTL 加1來發現另一個路由器,這個重複的動作一直持續到某個datagram 抵達目的地。當datagram到達目的地後,該主機并不會送回ICMP time exceeded消息,因為它已是目的地了,那麼traceroute如何得知目的地到達了呢?

Traceroute 在送出 UDP datagrams 到目的地時,它所選擇送達的 port number 是一個一般應用程式都不會用的号碼(30000 以上),是以當此 UDP datagram 到達目的地後該主機會送回一個「ICMP port unreachable」的消息,而當traceroute 收到這個消息時,便知道目的地已經到達了。是以traceroute 在Server端也是沒有所謂的Daemon 程式。Traceroute提取發 ICMP TTL 到期消息裝置的 IP 位址并作域名解析。每次 ,Traceroute 都列印出一系列資料,包括所經過的路由裝置的域名及 IP位址,三個包每次來回所花時間。

(以上資料來自網際網路)

參考網址:了解 OpenStack 高可用(HA)(3):Neutron 分布式虛拟路由(Neutron Distributed Virtual Routing) – SammyLiu – 部落格園

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/161152.html原文連結:https://javaforall.cn