第 11 章. Netfilter & iproute - 标记数据包

到目前为止,我们已经了解了 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/?]

另请参阅 第 15.5 节,在 Cookbook 中。