使用 FRR 在 Linux 上设定 BGP EVPN

写在前面

你是否有打通异地的大二层需求选择什么方案而纠结?你是否还在为各种大二层 VPN 的组网工具不被专业路由设备支持而懊恼?
此篇的目的就是如何在 multicast 和 broadcast 不可用的情况下 ,通过 BGP EVPN 的方式打通多地的多个二层网络(VXLAN over WireGuard/IPSec/etc)。
也算是针对今年年初所配置的东西的一个总结和复习。

平时大家听过的 BGP 用的最多的是负责 IP 层的控制平面,主要传递的是路由和下一跳的信息和路由的各种属性。在 BGP EVPN(Ethernet Virtual Private Network) 中则是负责以太网层的控制平面,主要传递的则是 MAC 地址和其对应的 VTEP。
既然是 BGP ,我们也可以配合 OSPF 等动态路由协议进行多条路的选择和自动 failover,构建一个多地的大二层网络也非常的方便,网内也可在不同地区配置多个路由反射器(route reflector),以减少 iBGP 会话(session)的数量,减少故障发生的可能性。BGP 自身也可以进行过滤的操作,可以进行更严格的控制。
这种组网的方式也被绝大多数专业路由设备所支持,并且可以不依赖第三方服务。

在开始之前,我们仍然推荐读者先了解 VXLAN 的基础。可以查阅下方参考资料的第二个链接,本篇中不再重复。

Note: 如果想要简单一些的打通二层的组网工具的话,可以考虑使用 ZeroTier 和 Tinc,只要有 Linux 就可以用了,把接口往需要的地方一桥接,就 OK 了。

环境介绍

路由反射器使用 Alpine Linux 3.18,路由器 使用 Debian 12,均采用 FRRouting 8.5.2。
VNI 使用 100 和 200。 包括两个 VTEP,两个路由反射器。 本地回环地址就加到 dummy 接口上了,也是 rt1 和 rt2 各自的 VTEP IP。
目的是将 Region1 和 Region2 的 VM1 和 VM2,VM3 和 VM4 各自的二层网络打通。
IP 地址规划: Router 正排,Route Reflector 反排。

名称 IP/Prefix
evpn-rt1 loopback 192.168.224.1/32
evpn-rt2 loopback 192.168.224.2/32
evpn-rr1 loopback 192.168.224.254/32
evpn-rr2 loopback 192.168.224.253/32
WireGuard Iface 169.254.1.0/30
br-rr1 169.254.2.0/30
br-rr2 169.254.3.0/30

iBGP session 采用 ASN 为 65001。
图:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
+---------------------------+(br-rr1)                   (br-rr2)+---------------------------------+
|   Region1:                +----(RR1)                 (RR2)----+ Region2:                        |
|   +-----+(vni100)         |                                   |               +------+ (vni100) |
|   | vm1 +-----+ (bridged) |                                   | (bridged)+----+ vm2  |          |
|   +-----+     | +--------+|                                   |+-------+ |    +------+          |
|   +-----+     +-+ VTEP 1 =+=======(VXLAN over WireGuard)======+= VTEP 2+-+    +------+          |
|   | vm3 +-----+ +--------+| (WireGuard iface uses 169.254/30) |+-------+ +----+ vm4  |          |
|   +-----+(vni200)         |                                   |               +------+ (vni200) |
+---------------------------+                                   +---------------------------------+
抽象出来则是:
+---------------------------------+                   +----------------------------------+
|vm1 <----> br100 <---> vxlan100 <+===================+> vxlan100 <---> br100 <----> vm2 |
|vm3 <----> br200 <---> vxlan200 <+===================+> vxlan200 <---> br200 <----> vm4 |
+---------------------------------+                   +----------------------------------+

本次假定 WireGuard 隧道已经配置完毕,过程涵盖 OSPF 和 iBGP 的配置。

正文

OSPF 部分

配置各自的 Loopback 接口

对于 evpn-rt1:

1
2
ip link add dummy2 type dummy
ip link set dummy2 up

此处的 dummy 接口为承载 loopback 地址所用,可在接口设定之时使用 ip addr add 192.168.224.1/32 dev dummy2 手动加上 loopbck 地址,也可使用 frr 的 zebra 在接口设定之时配置上地址。
其余节点照葫芦画瓢即可。

配置各自节点的 OSPFv2

此处我们使用 IPv4 作为 VTEP IP,就使用 OSPFv2 了。
先编辑 /etc/frr/daemons ,将 bgpd 和 ospfd 改为 yes 以启用 bgpd 和 ospfd。
再进入 vtysh 配置 OSPF 的 router-id,接口和 cost,导入内核时设定的src地址。
此处为 evpn-rt1 配置 OSPFv2。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ip router-id 192.168.224.1
!
interface br-rr1
 ! set transport address for br-rr1
 ip address 169.254.2.1/30
 ip ospf area 0
 ip ospf cost 1
exit
!
interface dummy2
 ! set loopback address for dummy interface
 ip address 192.168.224.1/32
 ip ospf area 0
 ip ospf passive
exit
!
interface vxlan-wg
 ! set transport address for vxlan-wg
 ip address 169.254.1.1/30
 ip ospf area 0
 ip ospf cost 10
exit
!
router ospf
 ospf router-id 192.168.224.1
exit
!
ip prefix-list ospf-routes seq 5 permit 192.168.224.0/24 ge 24
!
route-map ospf-vxlan permit 10
 match ip address prefix-list ospf-routes
 ! set source address for ospf routes
 set src 192.168.224.1
exit
!
ip protocol ospf route-map ospf-vxlan
!

其余的 evpn-rt2, evpn-rr1, evpn-rr2 节点照葫芦画瓢即可。

配置完成之后我们可以用这个检查:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
evpn-rt1# show ip ospf route
============ OSPF network routing table ============
N    169.254.1.0/30        [10] area: 0.0.0.0
                           directly attached to vxlan-wg
N    169.254.2.0/30        [1] area: 0.0.0.0
                           directly attached to br-rr1
N    169.254.3.0/30        [11] area: 0.0.0.0
                           via 169.254.1.2, vxlan-wg
N    192.168.224.1/32      [1] area: 0.0.0.0
                           directly attached to dummy2
N    192.168.224.2/32      [11] area: 0.0.0.0
                           via 169.254.1.2, vxlan-wg
N    192.168.224.254/32      [2] area: 0.0.0.0
                           via 169.254.2.2, br-rr1
N    192.168.224.253/32      [12] area: 0.0.0.0
                           via 169.254.1.2, vxlan-wg

============ OSPF router routing table =============

============ OSPF external routing table ===========

evpn-rt1# show ip fib ospf 
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

O>* 192.168.224.2/32 [110/11] via 169.254.1.2, vxlan-wg, weight 1, 00:07:51
O>* 192.168.224.254/32 [110/2] via 169.254.2.2, br-rr1, weight 1, 00:04:21
O>* 192.168.224.253/32 [110/12] via 169.254.1.2, vxlan-wg, weight 1, 00:06:03
evpn-rt1# quit
root@evpn-rt1:~# ip r
default via 192.168.80.1 dev lan onlink 
10.196.0.0/24 dev mgmt-vnc proto kernel scope link src 10.196.0.1 
169.254.1.0/30 dev vxlan-wg proto kernel scope link src 169.254.1.1 
169.254.2.0/30 dev br-rr1 proto kernel scope link src 169.254.2.1 
192.168.20.0/24 dev br0 proto kernel scope link src 192.168.20.3 linkdown 
192.168.80.0/24 dev lan proto kernel scope link src 192.168.80.5 
192.168.224.2 nhid 66 via 169.254.1.2 dev vxlan-wg proto ospf src 192.168.224.1 metric 20 
192.168.224.254 nhid 64 via 169.254.2.2 dev br-rr1 proto ospf src 192.168.224.1 metric 20 
192.168.224.253 nhid 66 via 169.254.1.2 dev vxlan-wg proto ospf src 192.168.224.1 metric 20 

可以看到,所有路由器的环回地址都进入了 OSPF 了,并已正确导入 FIB 。

BGP EVPN 部分

配置 VXLAN 和 bridge 接口

因为实际上是 evpn-rt1 和 evpn-rt2 作流量的转发,我们在这两个上配置接口即可。
我们将会在 rt1 上开两个 bridge 接口,br100 给 vm1 , br200 给 vm3。rt2 上也将 br100 给 vm2 ,br200 给 vm4,并且分别创建 vni 为 100 和 200 的 VXLAN 接口,并将它们分别加到 br100 和 br200 上。

1
2
3
4
5
6
7
8
pic:
+-----------------------------------------------------+
|+---------+         +------------+                 +=|======>>>>>
||         | (vnet1) |            |    +------------+ | 
||  VM 1   +---------+   br100    +----+  VXLAN100  ==|======>>>>> (forward traffic)
|+---------+         +------------+    +------------+ |
| Hypervisor VTEP                                   +=|======>>>>>
+-----------------------------------------------------+

具体步骤:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
lo_addr=192.168.224.1
for vni in 100 200; do
    # create bridge
    ip link add br${vni} type bridge
    # create VXLAN interface with corresponding vni
    ip link add vxlan${vni} type vxlan \
        local ${lo_addr} \
        dstport 4789 \
        id ${vni} \
        nolearning
    # attach VXLAN interface to bridge
    ip link set vxlan${vni} master br${vni} addrgenmode none
    ip link set vxlan${vni} type bridge_slave neigh_suppress on learning off
    ip link set vxlan${vni} up
    ip link set br${vni} up
done

加完接口之后,我们可以用 show interface 来检查。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
evpn-rt1# show interface vxlan100
Interface vxlan100 is up, line protocol is up
  Link ups:       1    last: 2023/07/23 17:50:49.98
  Link downs:     3    last: 2023/07/23 17:50:49.97
  vrf: default
  index 45 metric 0 mtu 1500 speed 4294967295 
  flags: <UP,BROADCAST,RUNNING,MULTICAST>
  Type: Ethernet
  HWaddr: 8e:d9:0c:54:15:a5
  Interface Type Vxlan
  Interface Slave Type Bridge
  VxLAN Id 100 VTEP IP: 192.168.224.1 Access VLAN Id 1

  Master interface: br100
  protodown: off 
evpn-rt1# show interface vxlan200
Interface vxlan200 is up, line protocol is up
  Link ups:       1    last: 2023/07/23 17:50:50.00
  Link downs:     3    last: 2023/07/23 17:50:49.99
  vrf: default
  index 47 metric 0 mtu 1500 speed 4294967295 
  flags: <UP,BROADCAST,RUNNING,MULTICAST>
  Type: Ethernet
  HWaddr: 9a:9c:c6:80:ad:d4
  Interface Type Vxlan
  Interface Slave Type Bridge
  VxLAN Id 200 VTEP IP: 192.168.224.1 Access VLAN Id 1

  Master interface: br200
  protodown: off

可以看到 frr 已经正确识别到 vxlan100 和 vxlan200 各自加到了 br100 和 br200 上,并且 VTEP IP 也已经正确配置。 此时 BGP 会话尚未建立,我们可以检查一下 vm1 加到 br100 接口上的网卡:

1
2
3
4
5
6
7
8
evpn-vm1:~# ping ff02::1%eth0
PING ff02::1%eth0 (ff02::1%2): 56 data bytes
64 bytes from fe80::5054:ff:fe35:e985: seq=0 ttl=64 time=0.149 ms
64 bytes from fe80::68b8:8fff:fea2:5609: seq=0 ttl=64 time=0.535 ms (DUP!)
^C
--- ff02::1%eth0 ping statistics ---
1 packets transmitted, 1 packets received, 1 duplicates, 0% packet loss
round-trip min/avg/max = 0.149/0.342/0.535 ms

可以看到,vm1 的接口上,目前整个大二层中只有它自己和物理机上的 br100。

配置 FRR

路由反射器(Route Reflector)

此处给 evpn-rr1 配置,evpn-rr2 也可类比配置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
router bgp 65001
 bgp router-id 192.168.224.254
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 bgp cluster-id 192.168.224.254
 bgp route-reflector allow-outbound-policy
 neighbor vxlan-rrclient peer-group
 neighbor vxlan-rrclient remote-as 65001
 neighbor vxlan-rrclient update-source 192.168.224.254
 neighbor vxlan-rrclient capability extended-nexthop
 ! allow 192.168.224.0/24 to automatically establish sessions.
 bgp listen range 192.168.224.0/24 peer-group vxlan-rrclient
 !
 address-family l2vpn evpn
  neighbor vxlan-rrclient activate
  neighbor vxlan-rrclient route-reflector-client
  advertise-all-vni
 exit-address-family
exit
!

路由器(Router)

此处只需要将所有路由器都配置到连接到路由反射器(route reflector)即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
router bgp 65001
 bgp router-id 192.168.224.1
 no bgp default ipv4-unicast
 neighbor vxlan-rr peer-group
 neighbor vxlan-rr remote-as 65001
 neighbor vxlan-rr update-source 192.168.224.1
 neighbor vxlan-rr capability extended-nexthop
 ! Route reflectors placed here
 neighbor 192.168.224.254 peer-group vxlan-rr
 neighbor 192.168.224.253 peer-group vxlan-rr
 !
 address-family l2vpn evpn
  neighbor vxlan-rr activate
  advertise-all-vni
 exit-address-family
exit
!

配置完成之后,我们可以在 evpn-rt1 上检查一下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
evpn-rt1# show bgp sum

L2VPN EVPN Summary (VRF default):
BGP router identifier 192.168.224.1, local AS number 65001 vrf-id 0
BGP table version 0
RIB entries 7, using 1344 bytes of memory
Peers 2, using 1449 KiB of memory
Peer groups 1, using 64 bytes of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
192.168.224.254   4      65001        21        14        0    0    0 00:02:49            6        6 N/A
192.168.224.253   4      65001        25        19        0    0    0 00:08:48            6        6 N/A

Total number of neighbors 2
evpn-rt1# show evpn mac vni all

VNI 200 #MACs (local and remote) 2

Flags: N=sync-neighs, I=local-inactive, P=peer-active, X=peer-proxy
MAC               Type   Flags Intf/Remote ES/VTEP            VLAN  Seq #'s
52:54:00:5f:23:da remote       192.168.224.2                        0/0
52:54:00:0c:a5:24 local        vnet20                               0/0

VNI 100 #MACs (local and remote) 2

Flags: N=sync-neighs, I=local-inactive, P=peer-active, X=peer-proxy
MAC               Type   Flags Intf/Remote ES/VTEP            VLAN  Seq #'s
52:54:00:29:ce:c0 remote       192.168.224.2                        0/0
52:54:00:35:e9:85 local        vnet19                               0/0

我们也可以通过下述方法检查发送的 MAC + VTEP 信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
evpn-rt1# show bgp l2vpn evpn 
BGP table version is 9, local router ID is 192.168.224.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
EVPN type-1 prefix: [1]:[EthTag]:[ESI]:[IPlen]:[VTEP-IP]:[Frag-id]
EVPN type-2 prefix: [2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]
EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP]
EVPN type-4 prefix: [4]:[ESI]:[IPlen]:[OrigIP]
EVPN type-5 prefix: [5]:[EthTag]:[IPlen]:[IP]

   Network          Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 192.168.224.1:2
 *> [3]:[0]:[32]:[192.168.224.1]
                    192.168.224.1                      32768 i
                    ET:8 RT:65001:100
Route Distinguisher: 192.168.224.1:3
 *> [2]:[0]:[48]:[52:54:00:0c:a5:24]
                    192.168.224.1                      32768 i
                    ET:8 RT:65001:200
 *> [3]:[0]:[32]:[192.168.224.1]
                    192.168.224.1                      32768 i
                    ET:8 RT:65001:200
Route Distinguisher: 192.168.224.2:2
 *>i[3]:[0]:[32]:[192.168.224.2]
                    192.168.224.2            0    100      0 i
                    RT:65001:100 ET:8
 * i                 192.168.224.2            0    100      0 i
                    RT:65001:100 ET:8
Route Distinguisher: 192.168.224.2:3
 *>i[3]:[0]:[32]:[192.168.224.2]
                    192.168.224.2            0    100      0 i
                    RT:65001:200 ET:8
 * i                 192.168.224.2            0    100      0 i
                    RT:65001:200 ET:8

Displayed 5 out of 7 total prefixes

以及使用 bridge 工具查看对应信息是否已经插入了桥的转发数据库(FDB)。

1
2
3
root@evpn-rt1:~# bridge fdb show dev vxlan100 | grep dst
00:00:00:00:00:00 dst 192.168.224.2 self permanent
52:54:00:29:ce:c0 dst 192.168.224.2 self extern_learn 

可以看到 frr 已经正确给 kernel 提供了信息。

我们可以上 evpn-vm1 验证一下 vxlan100 的连通性。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
evpn-vm1:~# ping ff02::1%eth0
PING ff02::1%eth0 (ff02::1%2): 56 data bytes
64 bytes from fe80::5054:ff:fe35:e985: seq=0 ttl=64 time=0.308 ms
64 bytes from fe80::68b8:8fff:fea2:5609: seq=0 ttl=64 time=0.863 ms (DUP!)
64 bytes from fe80::d0dc:61ff:fecd:44e9: seq=0 ttl=64 time=1.674 ms (DUP!)
64 bytes from fe80::5054:ff:fe29:cec0: seq=0 ttl=64 time=2.276 ms (DUP!)
^C
--- ff02::1%eth0 ping statistics ---
1 packets transmitted, 1 packets received, 3 duplicates, 0% packet loss
round-trip min/avg/max = 0.308/1.280/2.276 ms

可以看到, evpn-vm1 所接的 br100 已与另一个 region 的 br100 和 vm2 打通。

我们再来看 evpn-vm3 验证一下 vxlan200 的连通性。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
evpn-vm3:~# ping ff02::1%eth0
PING ff02::1%eth0 (ff02::1%2): 56 data bytes
64 bytes from fe80::5054:ff:fe0c:a524: seq=0 ttl=64 time=0.297 ms
64 bytes from fe80::3c93:ebff:feaf:393a: seq=0 ttl=64 time=1.078 ms (DUP!)
64 bytes from fe80::9431:83ff:fe41:4e73: seq=0 ttl=64 time=1.886 ms (DUP!)
64 bytes from fe80::5054:ff:fe5f:23da: seq=0 ttl=64 time=1.975 ms (DUP!)
^C
--- ff02::1%eth0 ping statistics ---
1 packets transmitted, 1 packets received, 3 duplicates, 0% packet loss
round-trip min/avg/max = 0.297/1.309/1.975 ms

evpn-vm3 所接的 br200 已与另一个 region 的 br200 和 vm4 打通。
至此, 整个的流程就走完了。
接下来就是快乐的 cheatsheet 时间!

Cheatsheet: /etc/frr/frr.conf

  1. 路由器(Routers)的配置文件:使用 evpn-rt1 作为示例。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
frr version 8.5.2
frr defaults traditional
hostname evpn-rt1
service integrated-vtysh-config
!
ip router-id 192.168.224.1
!
interface br-rr1
 ip address 169.254.2.1/30
 ip ospf area 0
 ip ospf cost 1
exit
!
interface dummy2
 ip address 192.168.224.1/32
 ip ospf area 0
 ip ospf passive
exit
!
interface vxlan-wg
 ip address 169.254.1.1/30
 ip ospf area 0
 ip ospf cost 10
exit
!
router bgp 65001
 bgp router-id 192.168.224.1
 no bgp default ipv4-unicast
 neighbor vxlan-rr peer-group
 neighbor vxlan-rr remote-as 65001
 neighbor vxlan-rr update-source 192.168.224.1
 neighbor vxlan-rr capability extended-nexthop
 neighbor 192.168.224.254 peer-group vxlan-rr
 neighbor 192.168.224.253 peer-group vxlan-rr
 !
 address-family l2vpn evpn
  neighbor vxlan-rr activate
  advertise-all-vni
 exit-address-family
exit
!
router ospf
 ospf router-id 192.168.224.1
exit
!
ip prefix-list ospf-routes seq 5 permit 192.168.224.0/24 ge 24
!
route-map ospf-vxlan permit 10
 match ip address prefix-list ospf-routes
 set src 192.168.224.1
exit
!
ip protocol ospf route-map ospf-vxlan
!
  1. 路由反射器(route reflectors)的配置文件: 使用 evpn-rr1 作为示例。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
frr version 8.5.1
frr defaults traditional
hostname evpn-rr1
log syslog informational
!
ip router-id 192.168.224.254
!
interface dummy2
 ip address 192.168.224.254/32
 ip ospf area 0
 ip ospf passive
exit
!
interface eth1
 ip address 169.254.2.2/30
 ip ospf area 0
 ip ospf cost 1
exit
!
router bgp 65001
 bgp router-id 192.168.224.254
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 bgp cluster-id 192.168.224.254
 bgp route-reflector allow-outbound-policy
 neighbor vxlan-rrclient peer-group
 neighbor vxlan-rrclient remote-as 65001
 neighbor vxlan-rrclient update-source 192.168.224.254
 neighbor vxlan-rrclient capability extended-nexthop
 bgp listen range 192.168.224.0/24 peer-group vxlan-rrclient
 !
 address-family l2vpn evpn
  neighbor vxlan-rrclient activate
  neighbor vxlan-rrclient route-reflector-client
  advertise-all-vni
 exit-address-family
exit
!
router ospf
 ospf router-id 192.168.224.254
exit
!
ip prefix-list ospf-routes seq 5 permit 192.168.224.0/24 ge 24
!
route-map ospf-vxlan permit 10
 match ip address prefix-list ospf-routes
 set src 192.168.224.254
exit
!
ip protocol ospf route-map ospf-vxlan
!

Fixup: MTU 问题的(有点坏的)解决方式(2024.04)

实际使用了一段时间之后,发现跨 Site 时 Route Server 发送的路由,接收端接收不全,并且会出现 flap 的现象。随后请教了群友,得到了以下的解决方式:

一句话总结,大概就是 WireGuard 内套一层 GRE 隧道,GRE 隧道配上 ignore-df + nopmtudisc 即可。 之后就是 GRE Tunnel 的 local 和 remote 配上 WireGuard 内的传输地址。GRE MTU 设置为 9000+,GRE 内配上 ptp 地址之后跑 OSPF 就好。

于是就变成了 VXLAN over GRE over WireGuard。WireGuard 负责隧道加密,GRE 负责 igndf+nopmtudisc,VXLAN 最后。

命令大概就长这样:
ip link add $IFACE type gre local 169.254.44.1 remote 169.254.44.2 nopmtudisc ignore-df

如果路过的大佬有更优雅的解决方式,欢迎评论区提出。(物理拉线是不可能的,绝对是不可能的,我也想物理拉线,呜呜呜

参考资料

本篇用到的

  1. Vincent Bernat - VXLAN: BGP EVPN with FRR
  2. FRRouting - Docs - EVPN

补充资料

  1. Fun with veth-devices, Linux bridges and VLANs in unnamed Linux network namespaces – IV
  2. Vincent Bernat - VXLAN & Linux

补充说明

  1. WireGuard 接口、与路由反射器连接的接口,都要记得配上ptp地址作为传输地址喔,本例 cheatsheet 使用的是 169.254.x.x/30 地址。
  2. frr 的 interface 设定中可以加上 ip address 来让 zebra 设定地址,或者自行在开接口的时候设定也是可以的。
  3. 承载 loopback address 接口的 dummy 接口设定为了 passive,因为并不需要往这个接口上发 ospf hello。
  4. frr 对于 evpn route-map 中 match evpn vni 似乎暂时不可用了。具体可见 Github issues。(2024.04)

结尾

此篇文章很大程度上依赖了 Vincent Bernat 的博文,以及感谢 Kusakabe Shi 对此方面示例配置文件的给出,以及群友的指教。
其实还有一点我还是没有写出,就是 VXLAN 接口加到 Linux Bridge 上之后在 bridge 上开启 bridge vlan filtering。之后在 bridge 上进行 tag/untag 之类的操作,这样在 vni 很多的时候就可以不用一个 vni 开一个 bridge了,比较遗憾。如果有读者感兴趣的话可以阅读补充资料,可以很大程度上起到帮助。
下一篇可能会写(水)这个?

Built with Hugo
Theme Stack designed by Jimmy