ip rule是双网卡策略路由唯一可行入口,因内核路由决策早期必须靠它在查主表前插入条件分支;ip route只管“怎么走”,ip rule决定“用哪张表查”,缺之则两网卡共用main表无法区分策略。

为什么 ip rule 是双网卡策略路由的唯一可行入口
因为内核路由决策发生在 packet 进入协议栈早期,必须靠 ip rule 在查主路由表前插入条件分支——ip route 只管“怎么走”,而 ip rule 决定“用哪张表来查”。没有它,两个网卡共用 main 表,根本无法区分来源/目标策略。
常见错误是只配 ip route add ... via ... dev eth1,结果所有流量(包括本该走 eth0 的)全被拉到 eth1,甚至导致 SSH 断连。本质是漏了规则优先级和表绑定。
-
ip rule顺序严格从上到下匹配,数字越小优先级越高(默认 0–32767) - 每条 rule 必须明确指定
table,且该 table 需提前用ip route add table X ...初始化 - 策略依据只能是:源 IP(
from)、目标 IP(to)、fwmark(需配合 iptables/mangle)、接口(iif/oif)
如何为隔离区网卡(如 eth1)建立独立路由表并绑定规则
假设 eth0(192.168.1.100/24)走默认出口,eth1(10.0.100.10/24)专用于隔离区访问(如仅允许访问 10.0.200.0/24),且该网卡不参与默认路由。
关键不是“加一条路由”,而是“切断默认表对 eth1 子网的感知 + 建立专用查表路径”:
- 先创建独立表名映射:
echo "200 isolatable" >> /etc/iproute2/rt_tables(避免用纯数字,提升可读性) - 清空 eth1 接口自动添加的直连路由(防止干扰):
ip route flush dev eth1 - 手动加隔离区路由:
ip route add 10.0.200.0/24 via 10.0.100.1 dev eth1 table isolatable - 加规则:所有从 eth1 IP 发出的包,强制查
isolatable表:ip rule add from 10.0.100.0/24 table isolatable - 加兜底规则(防回环):
ip rule add to 10.0.100.0/24 table isolatable
注意:没加 ip rule add fwmark 1 table isolatable 就别碰 iptables MARK,否则规则永远不触发。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
如何用 iptables + fwmark 实现基于端口/协议的动态策略分流
纯 IP 段规则太粗,真实隔离常需“数据库端口只走 eth1,HTTP 走 eth0”。这时必须用 fwmark 桥接 netfilter 和路由子系统。
典型组合链路:iptables -t mangle -A OUTPUT -p tcp --dport 3306 -j MARK --set-mark 1 → ip rule add fwmark 1 table isolatable
-
MARK值必须是十进制整数,且ip rule中 fwmark 匹配不支持掩码(fwmark 0x1等价于fwmark 1,但写成0x1易被忽略) - OUTPUT 链标记影响本机发出包;PREROUTING 标记影响入向包(需配合
iif规则) - 务必禁用反向路径过滤:
sysctl -w net.ipv4.conf.eth1.rp_filter=0,否则带 mark 的包可能被内核丢弃
为什么重启后策略全失效?三个必须持久化的点
ip rule 和 ip route table X 全部内存态,reboot 后清零。只保存 /etc/network/interfaces 或 NetworkManager 配置远远不够。
- 规则本身要写入启动脚本:
/etc/network/if-up.d/99-policy-route(Debian/Ubuntu)或/etc/sysconfig/network-scripts/route-eth1(RHEL/CentOS) -
rt_tables条目必须存在,否则ip rule add table isolatable报错RTNETLINK answers: No such file or directory - 若用 systemd,别依赖
network-online.target—— 它不保证ip rule已加载,应设为After=network.target并Type=oneshot
最易被忽略的是:不同发行版对 ip route flush dev X 的容忍度不同,某些云镜像在 ifup 过程中会重加直连路由,导致你的 isolatable 表被绕过。实测有效做法是,在规则加载后追加 ip route del 10.0.100.0/24 dev eth1 table main 显式删除冲突项。










