通过ip rule和自定义路由表实现策略路由,可基于源地址、接口、fwmark等条件进行流量控制,结合iptables标记与路由规则,实现多ISP出口、用户级路由等复杂场景的灵活管理。

在Linux中实现路由过滤和灵活的路由控制,主要依赖于 ip rule 和 ip route 命令,结合策略路由(Policy Routing)机制。传统的路由表是基于目标地址的单一查找,而策略路由允许你根据源地址、接口、防火墙标记等多种条件选择不同的路由表,从而实现更精细的流量控制。
理解策略路由与ip rule的作用
Linux内核维护多个路由表,除了默认的 main 表外,还可以创建自定义路由表。ip rule 用于定义使用哪个路由表来查找路由,规则按优先级顺序执行。
规则匹配的常见条件包括:
- 源IP地址(from)
- 目标IP地址(to)
- 入站接口(iif)
- 防火墙标记(fwmark)
- 优先级(priority)
例如,你可以让来自某个子网的流量走特定的网关,或让标记过的数据包使用独立的路由表。
配置自定义路由表
首先需要定义额外的路由表。路由表编号和名称的映射保存在 /etc/iproute2/rt_tables 文件中。
编辑该文件,添加自定义表:
echo "100 custom_table" >> /etc/iproute2/rt_tables然后为这个表配置路由:
ip route add default via 192.168.2.1 dev eth1 table custom_table ip route add 10.0.0.0/8 dev eth0 src 192.168.2.100 table custom_table添加ip rule规则实现路由过滤
使用 ip rule add 命令添加策略规则,控制数据包使用哪个路由表。
常见用法示例:
- 根据源地址选择路由表:
ip rule add from 192.168.10.0/24 table custom_table priority 100 - 根据防火墙标记选择路由表:
先在iptables中打标记:
iptables -t mangle -A OUTPUT -s 192.168.10.50 -j MARK --set-mark 0x1
然后添加规则:
ip rule add fwmark 0x1 table custom_table priority 200 - 根据入站接口决定路由:
ip rule add iif eth0 table custom_table priority 150
规则优先级数值越小,优先级越高。系统会按优先级顺序匹配规则,一旦匹配就停止。
查看与管理规则和路由
查看当前规则:
ip rule show查看指定路由表的内容:
ip route show table custom_table删除规则(按优先级):
ip rule del priority 100临时规则在重启后会丢失。若需持久化,应将命令写入网络配置脚本,如:
- 在 systemd 系统中使用 network-pre-up 脚本
- 或在 /etc/network/interfaces(Debian)中使用 up 指令
- 或使用 NetworkManager 的 dispatcher 脚本
基本上就这些。通过组合 ip rule、自定义路由表和 iptables 标记,你可以实现复杂的路由过滤和流量分流,比如多ISP出口、基于用户的路由、策略性旁路等场景。关键是理解匹配顺序和路由表选择逻辑,避免规则冲突。不复杂但容易忽略细节。











