到目前为止﹐我们已经见识过 iproute 的能耐了﹐而 netfilter 也曾数度提及。现在是要好好的看看 Rusty's Remarkably Unreliable Guides 的时候了。而 netfilter 的芳踪﹐可以从 这里 觅得。
Netfilter 可以让我们过滤封包﹐或是修改它们的标头(headers)。其中一绝是我们可以用号码将封包标识起来﹐用 --set-mark 就可以做到。
举个例子﹐下面的命令将所有送给 port 25 的封包标﹐也就是外送邮件﹐给识起来﹕
# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 25 \
-j MARK --set-mark 1
让我们假设有多条连线﹐其中一个比较快(当然每一 magabyte 也较贵)﹐而另一个比较慢﹐但使用固定价格。我们理所应当想把外送邮件走那个较便宜的 router 。
我们已经将封包标识为 '1' 了﹐现在就指引路由原则资料库做如下事情﹕
# echo 201 mail.out >> /etc/iproute2/rt_tables
# ip rule add fwmark 1 table mail.out
# ip rule ls
0: from all lookup local
32764: from all fwmark 1 lookup mail.out
32766: from all lookup main
32767: from all lookup default
现在我们产生 mail.out 表格﹐将个路由指向较慢但也较便宜的线路﹕
# /sbin/ip route add default via 195.96.98.253 dev ppp0 table mail.out
大功告成﹗假如我们想要网开一面﹐有很多办法可以做到的。我们可以修改 netfilter 的叙述﹐将某些特定主机豁免出来﹐或是为哪些豁免主机插入一条规则﹐使用较低的优先值指向 main 表格。
我们还可以运用此一绝技来实践 TOS 位元(bits)﹐只需将封包以不同数字标识为不同等服务类型﹐同时建立规则将之跑起来即可。用此办法﹐我们甚至指定一条 ISDN 线路给互动连线呢。
值得一提的是﹐此法在 NAT('masquerading') 主机上也同具功效哦。
非常重要﹕我们收到一个报告指出 MASQ 和 SNAT 至少和封包标识会有所抵触。Rusty Russel 已在如下网页作过解释﹕ this posting。请关闭逆向路径过滤功能﹐以解决此一问题。
请留意﹕您需要将某些核心选项打开才行﹕
IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [Y/n/?]
IP: policy routing (CONFIG_IP_MULTIPLE_TABLES) [Y/n/?]
IP: use netfilter MARK value as routing key (CONFIG_IP_ROUTE_FWMARK) [Y/n/?]
另外﹐还请看看 Cookbook 中的 Transparent web-caching using netfilter, iproute2, ipchains and squid 。