# 路由策略 ## 顺序 ip rule,ip tables,ip route 的顺序 如下: - 当内核收到一个数据包时,它会先查看 ip rule 中的路由策略,根据数据包的特征(如源地址、目标地址、标记等)选择一个路由表。 ```bash ip rule add fwmark 1 table table1 #查看到标记为1 的选择table1 ip rule add fwmark 2 table table2 #查看到标记为2 的选择table2 ``` - 内核会在选定的路由表中查找匹配的路由条目,根据数据包的目标地址选择一个出口网卡或网关。 ```bash ip route list table [num/name] 查看指定[num/name]的路由表的 路由条目 ``` - 接着,内核会将数据包发送到 iptables 的 mangle 表和 nat 表的 prerouting 链,根据用户定义的规则对数据包进行修改或转换(如更改 IP 头、执行 DNAT 等)。 ``` sysctl -w net.ipv4.conf.eth2.rp_filter=0 # ip route flush cache ``` - 然后,内核会根据修改后的数据包重新查看 ip rule 和 ip route,选择一个新的出口网卡或网关。 - 接着,内核会将数据包发送到 iptables 的 filter 表的 forward 链,根据用户定义的规则对数据包进行过滤或转发(如接受、丢弃、拒绝等)。 - 然后,内核会将数据包发送到 iptables 的 mangle 表和 nat 表的 postrouting 链,根据用户定义的规则对数据包进行修改或转换(如更改源地址、执行 SNAT 等)。 - 最后,内核会将数据包发送出去。 ``` ip route add default dev eth0 table table1 #将所有不匹配任何其他路由的数据包,通过eth0发出去 并使用路由表table1 ``` ``` root@wim:/# ip route show table tuntable default dev eth1 scope link root@wim:/# ip rule list 0: from all lookup 128 0: from all fwmark 0x2 lookup tuntable 0: from all fwmark 0x2 lookup tuntable 1: from all lookup local 32766: from all lookup main 32767: from all lookup default root@wim:/# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.40.0 * 255.255.255.0 U 0 0 0 eth0 192.168.50.0 * 255.255.255.0 U 0 0 0 br-lan root@wim:/# ip route 192.168.40.0/24 dev eth0 proto kernel scope link src 192.168.40.3 192.168.50.0/24 dev br-lan proto kernel scope link src 192.168.50.3 ```