VXLAN L3 覆盖 Wireguard L3,具有 VLAN-VNI 映射

VXLAN L3 覆盖 Wireguard L3,具有 VLAN-VNI 映射

希望这是正确的地方 - 我最初在网络工程上发布了帖子,但它被关闭了,并且我被指向服务器故障。

我目前正在尝试使用 VXLAN 在两个站点之间设置 L2 桥接以提供 L2 连接,并使用 Wireguard 作为传输/L3。我之前使用 GRE over Wireguard 做过类似的第 2 层桥接,效果非常好,但现在我正在尝试更好地了解 VXLAN,并希望用 VXLAN 替换 GRE 隧道。

我一直在尝试利用这些信息这里这里但就我而言,我无法让流量通过站点之间的非Wireguard IP。

我有两台安装了 bridge-utils 的 Debian 机器。它们还运行 nftables,并设置了丢弃所有 DHCP 流量的规则,因为当我第一次设置 GRE 隧道时,我的机器最终从远程网络获得了分配的 IP。但其他一切都设置为允许,并且仅通过 Wireguard 端口对外公开

主机 A 设置如下:

Wireguard wg0 - 172.30.100.1/24
Bridge br0 - 10.0.0.160/24

主机 B 设置如下:

Wireguard wg0 - 172.30.100.2/24
Bridge br0 - 10.1.0.160/24

Wireguard配置AllowedIPs仅适用于 Wireguard 子网172.30.100.0/24。这适用于 GRE 配置,我认为也适用于 VXLAN,因为 VXLAN 流量封装在 Wireguard 隧道内。主机可以在其 Wireguard IP 上相互 ping 和 ssh,因此该位工作正常。

两座桥梁均设有港口ens18bridge-vlan-aware yesbridge-vids 1-4096/etc/network/interfaces

我有一个基于我上面发布的第一个链接中的“配方 2”的脚本,即具有多个 VNI 的单个隧道。该脚本的想法是将 VXLAN 接口添加到vx0br0等待wg0启动后(使用 systemd 服务),然后循环执行 VLAN/VNI 映射。

#!/bin/bash

# Gets Wireguard interface IP address.
wgip=`ip a s wg0 | egrep -o 'inet [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | cut -d' ' -f2`

ip link add vx0 type vxlan dstport 4789 external local $wgip dev wg0 # Creates vxlan with wg0 IP as local
#Here is where I may be going wrong but I've tried various combinations ^^^

sleep 1
ip link set dev vx0 master br0 # Adds vxlan to bridge
bridge link set dev vx0 vlan_tunnel on # Enables vlan tunnel on vxlan

# Maps each VLAN to VNIs across the tunnel.
for vlan in 10 20 30; do
        bridge vlan add vid $vlan dev vx0
        bridge vlan add vid $vlan dev ens18
        bridge vlan add dev vx0 vid $vlan tunnel_info id $vlan

# Think I can remove the below line if I switch to BGP-EVPN for learning later?
bridge fdb append 00:00:00:00:00:00 dev vx0 vni $vlan dst 10.1.0.160

done

ip link set dev vx0 up

我可能完全走错了路,但如果上面有任何不对劲的地方,任何正确的指导都将不胜感激!

(这甚至可能只是路由问题而不是配置问题。Wireguard 配置设置为 Table=off,这是我在 GRE/WG 配置中做的)

更新 看起来设置行external中的标志vx0引起了问题。如果我将其更改为以下内容,并将静态 FDB 条目更改为远程wg0IP 而不是远程ens18IP,我就可以 ping 主机到主机:

ip link add vx0 type vxlan dstport 4789 vni 1000 local $wgip dev wg0

然后看起来未标记的流量通过 VNI 1000,并且 VID 10、20 和 30 映射到它们各自的 VNI。

该标志的作用是什么external,导致原始配置无法工作?是因为缺少 VID 1 的明确映射吗?

答案1

你解决这个问题了吗?我并没有像你尝试的那样尝试桥接带有 VLAN 标记的中继接口,只是普通的访问接口,但我认为它的行为与我刚刚开始的工作没有什么不同,因为我正在跨接所有其他以太网和 IP 帧,如生成树、arp 等。因此,如果 802.1q 参与其中,我认为这无关紧要。

我的设置:

数据中心 1 中的服务器 1。接口 ens192 没有 IP,并且连接到映射到 VLAN 100 的访问端口。ens224 是公共 IP,并连接到本地 VLAN 80,但为了举例说明,我们将其称为 10.0.1.10/24。wireguard 有一个典型的通用设置,其中此节点是 192.168.0.1。

数据中心 2 中的服务器 2。接口 ens192 没有 IP,并且连接到映射到 VLAN 200 的访问端口。ens224 是公共 IP,并连接到本地 VLAN 90,我们将其称为 172.16.0.10/24。wireguard 是 192.168.0.2。

我正在使用 ubuntu+netplan,因此我的 yaml 对于服务器 1 如下所示,对于服务器 2 也一样,只是 IP 发生了变化:

network:
  ethernets:
    ens192:
      mtu: 1500
      dhcp4: false
      dhcp6: false
      accept-ra: false
      link-local: [ ]
    ens224:
      #mtu: 1400
      mtu: 1500
      addresses:
      - 10.0.1.10/24
      gateway4: 10.0.1.1
      nameservers:
        addresses:
        - 8.8.8.8
  version: 2

Wireguard 配置非常简单:

[Interface]
Address = 192.168.0.1/24
SaveConfig = true
ListenPort = 1240
PrivateKey = privkey

[Peer]
PublicKey = pubkey
AllowedIPs = 192.168.0.2/32
Endpoint = 172.16.0.10:1240

应用该配置,接下来安装 bridge-utils 包。

最后,我为 VNI 150 设置了 vxlan 接口(嘿,介于 100 和 200 之间),使用 wireguard IP 作为本地和远程默认端口。创建桥接接口。将 vlan 100 接口(ens192)绑定到桥接器,将 vxlan150 绑定到桥接器,关闭生成树,因为它会干扰两侧的交换机(如果我愿意,我甚至可以拥有冗余的 wireguard 桥接器,并让 STP 在网络端解决问题),然后启动接口:

ip link add vxlan150 type vxlan id 150 local 192.168.0.1 remote 192.168.0.2 dstport 0
brctl addbr bridge150
brctl addif bridge150 ens192
brctl addif bridge150 vxlan150
brctl stp bridge150 off
ip link set up dev vxlan150
ip link set up dev bridge150

一旦我禁用了防火墙,数据包就开始大量涌入,远程 VLAN 200 成为本地 VLAN 100 的一部分。远程端的生成树看到本地端根端口的通告,并进行了正常的重新收敛。如果您要连接两个都具有冗余路径、本地第三层转发等的网络,这显然需要谨慎处理,因为如果操作错误并将此链接粘在中间,可能会导致真正的循环和/或隔离。

性能似乎很棒。我只需要对防火墙进行一些调整,这样就可以让它在面向公众的接口上保持活动状态。

相关内容