到目前为止,我们已经了解了 iproute 的工作原理,并且多次提到了 netfilter。现在是浏览 Rusty 的非常不可靠指南 的好时机。Netfilter 本身可以在 这里 找到。
Netfilter 允许我们过滤数据包或修改它们的首部。一个特殊的功能是我们可以用一个数字标记一个数据包。这可以通过 --set-mark 功能完成。
例如,此命令标记所有发往端口 25 的数据包,即外发邮件
# 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 语句以排除某些主机,或者我们可以插入一个优先级较低的规则,该规则指向我们例外主机的主表。
我们还可以使用此功能来遵守 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/?] |