假如您有一个强大的路由器﹐那您或许要满足各适其式的不同人等之需。路由原则就能让您透过多组路由表格﹐见招拆招。
如果您真的需要这个功能﹐请确定您的核心有将 "IP: advanced router" 和 "IP: policy routing" 功能编译进来。
在核心进行路由判断的时候﹐它要找出哪一个表格以便查询。在预设情况之下﹐会有三个表格。旧的 'route' 工具会修改 main 和 local 表格﹐(预设上)和 ip 工具一样就是了。
预设规则如下﹕
[ahu@home ahu]$ ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
这个表格列示出全部规则的优先次序。我们不难发现所有规则都适用于所有封包('from all')。'main' 表格我们前面已经看过 了﹐可以用 ip route ls
看到其输出结果﹐不过﹐ 'local' 和 'default' 表格则是新的。
若想玩些高难度动作﹐我们可以产生新规则﹐然后指向不同表格﹐而改写整个系统的路由规则。
当存在更多对应规则时﹐核心是如何确切处置的﹐请参考 Alexey 兄之 ip-cref 文件。
还是让我们再用一个真实范例来说好了﹐我有两个(实际上在我退掉之前有 3 个) cable modem ﹐连接到一台 Linux NAT ('masqauerading') router 上面去。住在这里的人付钱给我使用 internet。假设其中一个租客只单纯的探访 hotmail 而想少付一点钱。对我来说当然没问题啦﹐只是您会被分配到较低阶的 cable modem 而已。
那台 '较快' 的 cable mode 的位址是 212.64.94.251﹐同时以 PPP 连接到 212.64.94.1 那里去。而那台 '较慢' 的 cable modem 使用的是变动位址﹐目前在此范例中是 212.64.78.148﹐同时连接到 195.96.98.253 去。
关于本机的表格﹐如下﹕
[ahu@home ahu]$ ip route list table local
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1
broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1
local 212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251
broadcast 10.255.255.255 dev eth0 proto kernel scope link src 10.0.0.1
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
大部份我们都知道是什么了﹐只有其中一部份需要特别指定而已。嗯﹐也不难找啦。其 '预设(default)' 表格目前是空的。
那先让我们看看 'main' 表格吧﹕
[ahu@home ahu]$ ip route list table main
195.96.98.253 dev ppp2 proto kernel scope link src 212.64.78.148
212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251
10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1
127.0.0.0/8 dev lo scope link
default via 212.64.94.1 dev ppp0
我们现在先产生一条新规则﹐取名为 'John'﹐是为我们假设的房客而设的。虽然﹐我们可以全部用号码来做﹐不过﹐如果我们将表格加入 /etc/iproute2/rt_tables 的话﹐会更加容易些。
# echo 200 John >> /etc/iproute2/rt_tables
# ip rule add from 10.0.0.10 table John
# ip rule ls
0: from all lookup local
32765: from 10.0.0.10 lookup John
32766: from all lookup main
32767: from all lookup default
接下来﹐我们只需增加 Johns 表格﹐同时清空(flush) route cache 就好﹕
# ip route add default via 195.96.98.253 dev ppp2 table John
# ip route flush cache
好了﹐这样就行了。剩下的﹐就作为我们读者的练习﹐在 ip-up 下做做看吧。