Netfilter可以让我们进行包过滤或者篡改数据包头。有一个特别的功能就是我们
可以给数据包打上一个数字标记。使用--set-mark机制就可以。
例如,这个命令把所有发往25/tcp(发出邮件)的数据包都打上了标记:
# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 25  -j MARK --set-mark 1
已经给那些数据包打上了标记“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 功能与数据包标记有冲突。需要关闭反方向的过滤就可以正常工作。
注意:想给数据包打标记的话,你的内核需要一些配置:
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/?]