背景
有需要要对vxlan的流量做过滤,只允许特定vxlan id的流量访问。
方案调研
通过iptables支持各种策略过滤,但是并没原生的任何插件可以直接支持vxlan报文过滤。后来就想到了2个方案
- U32模块本身支持取报文的特定字段做匹配,因此就想到了使用U32。
- 现在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
参考:
- https://oswalt.dev/2014/03/mtu-considerations-for-vxlan/
- https://ask.wireshark.org/question/10372/sniffing-vxlan-traffic/
- https://support.huawei.com/enterprise/en/doc/EDOC1100004365/f95c6e68/vxlan-packet-format
- https://man7.org/linux/man-pages/man8/iptables-extensions.8.html
- https://netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO-3.html