ip rule 和 route
{Back to Index}

Table of Contents

1 route table

linux 系统中,可以自定义从 1-252 个路由表,其中,linux 系统默认维护了 4 个路由表:

bash-4.4# cat /etc/iproute2/rt_tables
#
# reserved values
#
255     local
254     main
253     default
0       unspec
  • 0: 系统保留表
  • 253 (default): 被 rule 32767 引用,用于处理没有匹配到任何路由的数据
  • 254 (main): 被 rule 32766 引用,当没有指明表名时,定义的路由都是放在这里, 是平时用的最多的表
  • 255 (local): 保存本地接口地址,广播地址, 由系统维护,用户不得更改其中的内容

指定表名添加路由:

# 在表 100 中添加默认路由
ip route add default via 172.31.0.1 dev eth0 table 100

2 rule

rule 是一种基于 策略 的路由方式,使用起来比较灵活(因为和路由表之间是低耦合的), 这里说的策略指的是能够根据目的网段,报文大小,端口,IP 地址,数据包标签(MARK)等条件来决定使用哪个路由表,例如:

# 对于源地址为 192.203.80/24 的数据包使用路由表 100 决定路由
ip rule add from 192.203.80/24 table 100 prio 220

内核默认有三条 rule :

$> ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
# 第一列表示优先级
  • rule 0: 优先级最高,对应 local 路由表
  • rule 32766: 对应 main 路由表
  • rule 32767: 对于没有匹配前面任何策略的数据包,系统使用这个策略进行处理

2.1 rule 和 route 的关系

规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。

ip_rule.png

Figure 1: rule 与 route

3 常见操作

3.1 降低 rule 0 的优先级

bash-4.4# ip rule add prio 1000 table local # 创建一个优先级较低的 rule ,还是指向 local 表
bash-4.4# ip rule del prio 0                # 删除 rule 0
bash-4.4# ip rule add fwmark 100 prio 10 tab 10 # 自定义基于标签的规则和对应的路由表
bash-4.4# ip ru
10:     from all fwmark 0x64 lookup 10
1000:   from all lookup local
32766:  from all lookup main
32767:  from all lookup default

3.2 查看数据包路由决策

使用 ip route get 来检查数据包的路由决策信息:

[root@ip-172-31-15-228 ec2-user]# ip route get 8.8.8.8 from 172.31.13.130 iif veth-1
RTNETLINK answers: No route to host
[root@ip-172-31-15-228 ec2-user]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@ip-172-31-15-228 ec2-user]# ip route get 8.8.8.8 from 172.31.13.130 iif veth-1
8.8.8.8 from 172.31.13.130 via 172.31.0.1 dev eth0 table 10001
    cache iif veth-1

有几点需要注意:1

  1. ip route get 会检查是否开启 IP 转发功能 ,如果返回 No route to host ,需要先开启 IP 转发功能
  2. 由 iptables/netfilter 架构可以知道,路由决策是后于 DNAT(nat/PREROUTING) 和先于 SNAT(nat/POSTROUTING) 的, 因此 from 后面的 IP 须是原始 IP (SNAT 时) ,或是转换后的 IP (DNAT 时)
  3. 如果出现错误 RTNETLINK answers: Invalid cross-device link ,则需要禁用 rp_filter 2

Footnotes:

Author: Hao Ruan (ruanhao1116@gmail.com)

Created: 2020-03-02 Mon 17:03

Updated: 2021-08-17 Tue 11:23

Emacs 27.1 (Org mode 9.3)