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 的关系
规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。
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
ip route get
会检查是否开启 IP 转发功能 ,如果返回No route to host
,需要先开启 IP 转发功能- 由 iptables/netfilter 架构可以知道,路由决策是后于 DNAT(nat/PREROUTING) 和先于 SNAT(nat/POSTROUTING) 的,
因此
from
后面的 IP 须是原始 IP (SNAT 时) ,或是转换后的 IP (DNAT 时) - 如果出现错误
RTNETLINK answers: Invalid cross-device link
,则需要禁用rp_filter
2