TLDR:RouterOS之间在wireguard隧道之上使用vxlan扩展二层网络

之前两地的k8s节点是跨三层加入集群,使用CNI插件的overlay网络实现的集群内互通,虚机属于所在区域物理网络下的子网。而vxlan技术是用来跨越三层网络扩展二层子网,方便跨区域迁移虚机,从而看哪边资源充足就开在哪里。

关于以家庭网络开头的文章标题

这俨然又是一个严肃笑话,不过实际上每一次变更倒是都会在git里记录,blog文章只会写重大的网络架构调整。并且记录的是实际运行的网络架构,如果是某个功能测试就不会放在家庭网络系列里了。

这次把自己家vlan200的10.1.2.0/24子网通过vni100通到了父母家,父母家用的是傻瓜交换机,没有802.1q,vxlan接口直接和默认bridge桥在一起了,所以不是个标准场景,不过大差不差就是了。

配置

关于vxlan的概念可以看华为的这篇文章

如果只是建立vxlan隧道的话,理解了vxlan的逻辑之后,操作就很简单。分别创建vxlan接口,创建vtep,隧道就建起来了。vtep对端需要IP可达,而我的场景下只有一端有公网ip,因此需要借助wireguard隧道打通两边的ROS,vtep的remote地址填的是wireguard接口的ip地址。

vxlan接口

vxlan接口

vtep

vtep

同一组vxlan的vni保持一致,端口确保无误。

接下来要让两地的其他设备流量接入vxlan隧道,华为的设备支持dot1q、untag、qinq和default四种类型的二层子接口,加入bridge-domain接入流量。对于routeros来说,就原始了些,需要按照需求创建vlan接口/vlan接口之上创建的vlan接口/物理接口,和vxlan接口加入同一个bridge接入流量。

自己家

自己家

父母家

父母家

至此,自己家vlan200下的设备和父母家默认bridge二层已经打通了,客户端配好同一个cidr下的ip和子网掩码就可以正常通讯了。

网关

由于设备不支持EVPN,似乎没有找到办法实现分布式网关,所以网关保持原样放在了自己家的FortiGate上。缺点是父母家10.1.2.0/24子网下设备的所有三层流量都要到自己家绕一圈,访问同区域的192.168.31.0/24子网也是如此。

MTU问题

routeros默认的vxlan接口mtu是1450,而proxmox虚拟机的默认mtu是1500,vxlan就有几率对数据包进行分片。遇到的具体表现是ping包的icmp正常,http请求正常,https请求客户端发出Client hello后没有收到Server hello。意识到MTU问题后将虚拟机网卡的mtu调整为1450后正常。

运营商UDP Qos

k8s节点加入集群后刚开始一切正常,FortiGate正常收到了新节点的BGP路由,直到发现晚间cilium组件在不停重启,wireguard隧道有丢包。看了一眼隧道流量,想到自己家和父母家分别是联通和电信,估摸着是被运营商Qos了。于是套了一层udp2raw,封装成tcp包进行传输,暂时还没有出问题。