通过iptables做VXLAN的vni过滤

背景

有需要要对vxlan的流量做过滤,只允许特定vxlan id的流量访问。

方案调研

通过iptables支持各种策略过滤,但是并没原生的任何插件可以直接支持vxlan报文过滤。后来就想到了2个方案

  1. U32模块本身支持取报文的特定字段做匹配,因此就想到了使用U32。
  2. 现在7U的服务器上的iptables是支持bpf的,可以支持使用’-m bpf –bytecode’ 添加编译好的字节码做过滤。

但实际上使用bpf需要单独弄一个工具去生成这个二进制的代码,长期的维护性不是太好,所以虽然最终2个方案都走通了 还是支持选了u32.

我们都知道一个IP报文 里 IP 头是20字节,TCP是20字节,UDP是8个字节,VXLAN是8字节。vxlan的包头如下

,VXLAN报文本身是封装在UDP报文内,因此一个针对vxlan报文简单的U32匹配可以按下面的逻辑来生产

20 ip+ 8 UDP + 1 VXLAN flags +3 Reserved =32的位置就是VNID左边,因此下面的表达式就可刚好是VNID的区域

-p udp -m udp -m u32 –u32 “32>>8=xxxx”

考虑到可能IP头有option,因此也有一个改进的版本

–u32 “0>>22&0x3C@12>>8=xxx”

详细的原因可以参考:https://netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO-3.html

参考:

  1. https://oswalt.dev/2014/03/mtu-considerations-for-vxlan/
  2. https://ask.wireshark.org/question/10372/sniffing-vxlan-traffic/
  3. https://support.huawei.com/enterprise/en/doc/EDOC1100004365/f95c6e68/vxlan-packet-format
  4. https://man7.org/linux/man-pages/man8/iptables-extensions.8.html
  5. https://netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO-3.html

此条目发表在net分类目录。将固定链接加入收藏夹。