迄今为止我们已经了解了iproute是如何工作的,并且多次提到了netfilter。这里,你正好可以趁机看一看Rusty出名地不可靠的指南. Netfilter本身可以在这里找到。
Netfilter可以让我们进行包过滤或者篡改数据包头。有一个特别的功能就是我们可以给数据包打上一个数字标记。使用--set-mark机制就可以。
例如,这个命令把所有发往25/tcp(发出邮件)的数据包都打上了标记:
# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 25 \
-j MARK --set-mark 1
比如说,11545.html">我们有多个连接,一个是按流量计费的,比较贵但是很快,另一个是包月的,但是比较慢。我们当然愿意让发送电子邮件的数据包走那条比较便宜的路由。
我们已经给那些数据包打上了标记“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位,来给不同服务类型的数据包打上不同的标记,再为它们分别建立规则。你甚至可以利用这种方法让诸如ISDN线路支持交互业务。
不用说,这当然也可以用于正在进行NAT(“伪装”)的机器上。
重要提醒:我们收到报告说MASQ和SNAT功能与数据包标记有冲突。Rusty Russell在这个帖子中作了解释。关闭反方向的过滤就可以正常工作。
注意:想给数据包打标记的话,你的内和需要一些配置:
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/?]