Linux 策略路由詳解
概述
在Linux中,我們通常使用route
命令來做路由資訊的管理。但是該命令僅僅只能用於基本路由資訊的管理,面對功能更加強大的基於策略的路由機制,route
命令就顯得捉襟見肘。在傳統路由演算法中,只能基於目的地址進行路由選擇。但是如果對路由選擇有更復雜的要求,比如針對不同源地址、傳輸層埠甚至是payload進行更細緻的路由控制,傳統的基於目的地址的路由表就無法滿足需求了,需要使用功能更加強大的路由策略資料庫routeing database: RPDB
來處理。
命令安裝
安裝很簡單,按照如下命令安裝即可。
# 檢視iproute是否安裝 # 檢視iproute版本 ]# ip -V ip utility, iproute2-ss170501 # 安裝 yum install iproute -y
路由策略資料庫(RPDB)
RPDB是存放策略的資料庫,被策略匹配的資料包會執行相關的操作,可以透過ip rule
來管理。
在系統啟動時,核心會配置三條預設策略:
# 透過ip rule show可以檢視當前RPDB中的規則 ]# ip rule show 0: from all lookup local # 優先順序為0,匹配任意源地址,查詢local路由錶轉發 32766: from all lookup main # 優先順序為32766,匹配任意源地址,查詢main路由錶轉發 32767: from all lookup default # 優先順序為32767,匹配任意源地址,查詢default路由錶轉發 1. local路由表是一個特殊的路由表,包含本地地址和廣播地址的高優先順序控制路由, 例如訪問127.0.0.1就是參考的這條規則。 2. main路由表是一個通用路由表,正常透過route -n命令操作的就是這個路由表。 3. default路由表預設是一個空表,除非有特別的要求,否則保持為空即可。
每條策略路由的規則由一個選擇器
和一個動作
組成,RPDB按照優先順序順序進行規則匹配,優先順序數字越小越優先。被選擇器
匹配的報文會執行對應的操作,操作如果成功,則根據指定的路由轉發資料,之後終止RPDB匹配,如果執行失敗,則報錯並且終止RPDB匹配。否則RPDB將繼續執行下一條規則。
ip rule命令說明
# 執行ip rule help可以檢視幫助資訊,如果需要更詳細的幫助資訊,可以執行man ip-rule ]# ip rule help Usage: ip rule { add | del } SELECTOR ACTION ip rule { flush | save | restore } ip rule [ list [ SELECTOR ]] SELECTOR := [ not ] [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ] [ iif STRING ] [ oif STRING ] [ pref NUMBER ] [ l3mdev ] [ uidrange NUMBER-NUMBER ] ACTION := [ table TABLE_ID ] [ nat ADDRESS ] [ realms [SRCREALM/]DSTREALM ] [ goto NUMBER ] SUPPRESSOR SUPPRESSOR := [ suppress_prefixlength NUMBER ] [ suppress_ifgroup DEVGROUP ] TABLE_ID := [ local | main | default | NUMBER ]
選擇器(SELECTOR)
from PREFIX: 根據源地址字首匹配 to PREFIX: 根據目的地址字首匹配 tos TOS: 根據ip包頭TOS欄位的值進行匹配 fwmark FWMARK[/MASK]: 配合iptables -t mangle 打標記,根據標記進行匹配 iif STRING: 選擇要匹配的資料包的輸入介面。 oif STRING: 選擇要匹配的出介面裝置。只對來自本地套接字並與裝置繫結的報文有效 pref NUMBER: 規則的優先順序。這裡的pref可以替換成priority或者order,效果是一樣的。
動作(ACTION)
table TABLE_ID: 在規則匹配的時候,指定使用的路由表,被匹配的資料包將按照指定的路由表進行路由。此處的table也可以替換為lookup,效果是一樣的。 blackhole: 丟棄匹配的資料包。 unreachable: 丟棄匹配的資料包,並生成"Network is unreachable"錯誤。 prohibit: 丟棄匹配的資料包,並生成"Communication is administratively prohibited"錯誤。
檢視策略
]# ip rule show 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
新增策略
# 來自192.168.22.3的資料包,都參考id為10的路由表進行轉發 ip rule add from 192.168.22.3 table 10 # 設定規則的優先順序為100,發往192.168.23.0/24的資料包,都參考id為100的路由表進行轉發 ip rule add to 192.168.23.0/24 table 20 pref 100 # 給協議是tcp,源地址是192.168.24.0/24,目的埠是80的資料包,在路由前打上1的標記 iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80 -s 192.168.24.0/24 -j MARK --set-mark 1 # 將標記為1的資料包,參考id為iptables_table的路由表進行轉發 ip rule add fwmark 1 table iptables_table # 來自192.168.25.0/24的資料包都將丟棄 ip rule add from 192.168.25.0/24 blackhole ip rule add from 192.168.26.0/24 unreachable ip rule add from 192.168.27.0/24 prohibit
注意,新增動作是table TABLE_ID
時,預設情況下,只能新增數字,如果新增的是字元的話,會有如下報錯。
]# ip rule add from 192.168.22.3 table iptables_table Error: argument "iptables_table" is wrong: invalid table ID
這就帶來一個問題,如果時間久了,就不知道自己當時新增的這個路由表是啥意思了。所以需要有一個數字和字元的對應關係。這個對應關係,就儲存在/etc/iproute2/rt_tables
這個檔案裡。
# 編輯/etc/iproute2/rt_tables,新增iptables_table表的id為100 ]# cat /etc/iproute2/rt_tables # # reserved values # 255 local 254 main 253 default 0 unspec # 自定義路由表 100 iptables_table # # local # #1 inr.ruhep
新增之後,就可以正常執行ip rule add from 192.168.22.3 table iptables_table
了。並且執行ip rule show
的時候,路由表也是按照定義的字元顯示。
刪除策略
# 根據路由表刪除 ip rule del table iptables_table # 根據來源地址刪除 ip rule del from 192.168.22.0/24 # 根據優先順序刪除 ip rule del pref 100 # 根據標記刪除 ip rule del fwmark 100
路由表管理
目前看,透過ip rule
命令,可以根據不同的規則,選擇不同的路由表來轉發資料。那麼如何對不同的路由表做管理呢? 很簡單,只要在正常執行的命令之後,加上table TABLE_ID
即可。
檢視路由表路由條目
# ip route show等價於ip route show table main,也就是查的是預設的main路由表 ip route show # 檢視指定目標的路由 ip route show 192.168.22.0/24 # 檢視指定路由表iptables_table中的路由 ip route show table iptables_table ip route show table 100
新增路由
# 向iptables_table中新增預設路由 ip route add default via 192.168.22.1 dev eth1 src 192.168.22.3 table iptables_table ]# ip route show table 100 default via 192.168.22.1 dev eth1 src 192.168.22.3
刪除路由
# 刪除iptables_table路由表中的路由 ip route del default via 192.168.22.1 dev eth1 src 192.168.22.3 table iptables_table
京東雲官網最新活動:https://www.jdcloud.com/cn/pages/jinqiucaigou
相關文章
- linux 路由表設定 之 route 指令詳解2020-04-28Linux路由
- linux新增策略路由python指令碼(待完善)2020-05-27Linux路由Python指令碼
- 同源策略詳解2018-09-10
- 路由策略2024-04-06路由
- 前端路由模式詳解2020-12-09前端路由模式
- HDFS balance策略詳解2021-09-09
- Flutter進階:路由、路由棧詳解及案例分析2019-03-04Flutter路由
- OSPF 路由協議詳解(一)2022-04-10路由協議
- 瀏覽器路由 API 詳解2019-04-22瀏覽器路由API
- 01、路由策略簡介2024-03-25路由
- Vue 路由傳值(傳參)詳解2019-09-09Vue路由
- Linux at命令詳解2021-11-04Linux
- linux LVM詳解2020-01-21LinuxLVM
- Linux top詳解2020-08-15Linux
- 詳解Linux Inode2021-01-18Linux
- linux管道詳解2018-03-17Linux
- linux——管道詳解2018-03-15Linux
- 深度詳解GaussDB bufferpool快取策略2020-09-15快取
- Sharding-JDBC分片策略詳解(二)2020-12-04JDBC
- 動態路由 - OSPF 一文詳解2020-09-09路由
- Linux sort 命令詳解2024-12-02Linux
- Linux xattr 命令詳解2024-11-29Linux
- Linux locate 命令詳解2024-11-30Linux
- Linux firewalld 命令詳解2024-11-26Linux
- Linux iptables 命令詳解2024-11-27Linux
- Linux netstat 命令詳解2024-11-22Linux
- Linux history 命令詳解2024-12-01Linux
- Linux sed 命令詳解2024-11-19Linux
- Linux awk 命令詳解2024-11-20Linux
- Linux ss 命令詳解2024-11-23Linux
- Linux nc 命令詳解2024-11-24Linux
- linux top命令詳解2024-01-12Linux
- 詳解Linux chkconfig命令2022-04-28Linux
- Linux diff命令詳解2021-09-09Linux
- Linux 目錄詳解2020-05-22Linux
- Linux screen 命令詳解2020-09-10Linux
- Linux find 命令詳解2020-09-11Linux
- Linux詳解 --- 程式管理2022-01-27Linux