![OVS 接口中用于数据包过滤的 Iptables 替代方案](https://linux22.com/image/96633/OVS%20%E6%8E%A5%E5%8F%A3%E4%B8%AD%E7%94%A8%E4%BA%8E%E6%95%B0%E6%8D%AE%E5%8C%85%E8%BF%87%E6%BB%A4%E7%9A%84%20Iptables%20%E6%9B%BF%E4%BB%A3%E6%96%B9%E6%A1%88.png)
我刚刚意识到iptables
我应用于开放 Vswitch 接口的所有规则都不匹配。
我使用 iptables 来标记一些数据包,然后使用 TC(流量控制)过滤器根据 Iptables 匹配将数据包放入不同的优先级队列中。这适用于每个接口,甚至适用于 Linux 桥(使用 -m physdev 模块)。
如果我不能用 iptables 标记它们,如何过滤通过 ovs 接口的数据包并将它们放入不同的优先级队列?
规则(简化):
iptables -w -t mangle -A POSTROUTING -m physdev --physdev-out interface-name -m ttl --ttl-lt 10 ! -p 89 -j MARK --set-mark 10
tc filter add dev interface-name parent 1:0 protocol all prio 1 handle 10 fw flowid 1:10
然后我使用 HTB 作为优先级,假设有两个队列 1:10 和 1:20。该规则应将所有 ttl < 10 的流量(而不是 OSPF)发送到第一个队列 1:10。
答案1
这是一个老问题。您必须知道您的发行版如何处理 netfilter 内核模块。有时它会被加载,诀窍是创建一个规则来标记它们,然后拆分。mangle 链有点棘手。
将其添加为您的第一个标记规则:
iptables -t mangle -A POSTROUTING -m physdev --physdev-out interface-name -j MARK --set-mark 10
第二个问题是您的发行版可能无法编译和/或加载xt_mark
内核模块。用于lsmod | grep xt_mark
检查它是否存在。
有时我也会遇到 OVS 和 iptables 的问题。我发现 iptables 是 90 年代的一个很棒的工具,但我觉得它现在有点过时了。 “检查您的发行版如何处理 netfilter 的模块”对于理解您的问题非常重要。
如果你只是想标记你的包而 iptables 没有其他目的,你可以使用 OVS 工具,名为ovs-ofctl有pkt_mark
选项。