关于路由策略数据库(RPDB)

simple
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_tabl


ADI推出高度集成的电源管理降压型控制器——LTC3372
物联网模组供应商移远通信上市首日大涨44%
高低温湿热交变试验箱的均匀度受什么影响
单片机通用调试方法与思路
特斯拉上市八年以来,第三次实现季度盈利
关于路由策略数据库(RPDB)
俄罗斯政府将比其他国家更开放地在其领土上开展比特币采矿业务
USB控制器芯片及其在图像采集中的应用
高速数据采集记录系统
艾迈斯欧司朗LED照明产品助力未来智慧城市的建设
Essential Phone仍有望升级Android 11 可自行尝试刷入
美国商务部长:英伟达“能够、将会且应该”向中国出售AI芯片
诺基亚8曝光,没有什么能够阻挡诺基亚了!
国内隔膜设备需求超500亿元
在音频放大电路中采用D类放大器提高效率
AI能够给帮助在纳斯卡线条中发现新的地理标志
物联网协议怎样才是最适合的
《中国工业互联网产业经济发展白皮书(2020)》
区块链将是跨境支付的未来
区块链想要大规模的应用关键是什么