网络拓扑
拓扑说明
实验环境是一台 16G 内存的主机。上面使用 vmware 运行了三个虚拟机,运行的系统为 ubuntu-19.04。三个虚拟机采用 host-only 模式连接。
- spine,leaf1,leaf2 三个设备均为 ubuntu-19.04. 上面运行了 FRR 程序。
- host1,host2,host3,host4 为网络命名空间。
- underlay 网络采用的是二层模式 (局限于实验条件)
整个实验是一个比例缩小的数据中心 spine-leaf 模型。leaf2 还需要作为边界网关,使用默认路由将流量发送到公网,同时作为 firewall(这里只进行了 nat)。
leaf 作为 border 和 vtep 的功能细化图
实验功能说明
- 整个数据中心一个租户,使用 vni:100 作为租户的 l3vni
- 租户使用了三个 subnet。1.1.1.0/24 子网有两个虚机,分布在两个 vtep 下,使用 10 作为 l2vni。2.2.2.0/24 和 3.3.3.0/24 都只有一个虚机。5.5.5.0/24 作为 relay 子网用于连接 default-vrf 和 evpn-vrf。
- 整个实验需要实现租户内所有主机互通,同时主机可以访问公网。(暂时不能实现公网访问虚机,需要申请 floating-ip 才可以,申请了公网 IP 后,可以在 default-vrf 中做 1:1 nat 实现互访)
spine 配置
bgp evpn 配置
router bgp 7677
bgp router-id 192.168.59.130
bgp bestpath as-path multipath-relax
neighbor fabric peer-group
neighbor fabric remote-as external
neighbor 192.168.59.128 peer-group fabric
neighbor 192.168.59.129 peer-group fabric
!
address-family l2vpn evpn
neighbor fabric activate
exit-address-family
!
leaf1 配置
接口配置
# 开启转发
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -p
#添加 host1
sudo ip netns add host1
sudo ip link add veth1 type veth peer name eth0 netns host1
sudo ip netns exec host1 ip link set lo up
sudo ip netns exec host1 ip link set eth0 up
sudo ip netns exec host1 ip addr add 1.1.1.1/24 dev eth0
sudo ip netns exec host1 ip route add default via 1.1.1.254 dev eth0
sudo ip link add br10 type bridge
sudo ip link add vxlan10 type vxlan id 10 local 192.168.59.128 dstport 4789 nolearning
sudo ip link set br10 up
sudo ip link set veth1 up
sudo ip link set vxlan10 up
sudo ip link set veth1 master br10
sudo ip link set vxlan10 master br10
sudo ip addr add 1.1.1.254/24 dev br10
sudo ip link set dev br10 address 00:00:01:02:03:10 #分布式二层网关,mac 需要一致
#添加 host2
sudo ip netns add host2
sudo ip link add veth2 type veth peer name eth0 netns host2
sudo ip netns exec host2 ip link set lo up
sudo ip netns exec host2 ip link set eth0 up
sudo ip netns exec host2 ip addr add 2.2.2.2/24 dev eth0
sudo ip netns exec host2 ip route add default via 2.2.2.254 dev eth0
sudo ip link add br20 type bridge
sudo ip link set br20 up
sudo ip link set veth2 up
sudo ip link set veth2 master br20
sudo ip addr add 2.2.2.254/24 dev br20
#添加 vni 100,作为 l3vni
sudo ip link add br100 type bridge
sudo ip link add vxlan100 type vxlan id 100 local 192.168.59.128 dstport 4789 nolearning
sudo ip link set br100 up
sudo ip link set vxlan100 up
sudo ip link set vxlan100 master br100
#sudo ip addr add 5.5.5.254/24 dev br100 切记,作为 l3vni 的 svi 接口不能配置 IP,否则收到 type- 5 路由不会安装。sudo ip link set dev br100 address 00:00:01:02:03:04 #这个是路由 mac
#添加 vrf
sudo ip link add evpn-vrf type vrf table 100
sudo ip link set evpn-vrf up
sudo ip link set br100 master evpn-vrf
sudo ip link set br10 master evpn-vrf
sudo ip link set br20 master evpn-vrf
bgp evpn 配置
vrf evpn-vrf
vni 100
exit-vrf
!
router bgp 7675
bgp router-id 192.168.59.128
bgp bestpath as-path multipath-relax
neighbor fabric peer-group
neighbor fabric remote-as external
neighbor 192.168.59.130 peer-group fabric
!
address-family l2vpn evpn
neighbor fabric activate
advertise-all-vni
exit-address-family
!
router bgp 7675 vrf evpn-vrf
!
address-family ipv4 unicast
network 2.2.2.0/24
exit-address-family
!
address-family l2vpn evpn
advertise ipv4 unicast
exit-address-family
!
注:
vrf evpn-vrf
vni 100
exit-vrf
这段指令表示指定了一个 l3vni
router bgp 7675 vrf evpn-vrf
!
address-family l2vpn evpn
advertise ipv4 unicast
exit-address-family
!
这段指令 advertise ipv4 unicast 表示宣告 RT- 5 路由。
切记: 一定不能为 l3vni 对应的 svi 添加 IP 地址,否则 type5 路由不能正确下内核。
leaf2 配置
接口配置
# 开启转发
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -p
#添加 host3
sudo ip netns add host3
sudo ip link add veth3 type veth peer name eth0 netns host3
sudo ip netns exec host3 ip link set lo up
sudo ip netns exec host3 ip link set eth0 up
sudo ip netns exec host3 ip addr add 3.3.3.3/24 dev eth0
sudo ip netns exec host3 ip route add default via 3.3.3.254 dev eth0
# 添加网桥,将 veth3 加入网桥
sudo ip link add br30 type bridge
sudo ip link set br30 up
sudo ip link set veth3 up
sudo ip link set veth3 master br30
sudo ip addr add 3.3.3.254/24 dev br30
#添加 host4
sudo ip netns add host4
sudo ip link add veth4 type veth peer name eth0 netns host4
sudo ip netns exec host4 ip link set lo up
sudo ip netns exec host4 ip link set eth0 up
sudo ip netns exec host4 ip addr add 1.1.1.2/24 dev eth0
sudo ip netns exec host4 ip route add default via 1.1.1.254 dev eth0
sudo ip link add br40 type bridge
sudo ip link add vxlan10 type vxlan id 10 local 192.168.59.129 dstport 4789 nolearning
sudo ip link set vxlan10 up
sudo ip link set vxlan10 master br40
sudo ip link set br40 up
sudo ip link set veth4 up
sudo ip link set veth4 master br40
sudo ip addr add 1.1.1.254/24 dev br40
sudo ip link set dev br40 address 00:00:01:02:03:10 #分布式二层网关,mac 需要一致
#添加 vni 100,作为 l3vni
sudo ip link add br100 type bridge
sudo ip link add vxlan100 type vxlan id 100 local 192.168.59.129 dstport 4789 nolearning
sudo ip link set br100 up
sudo ip link set vxlan100 up
sudo ip link set vxlan100 master br100
#sudo ip addr add 5.5.5.253/24 dev br100 切记一定不能添加 IP 地址,否则 type5 路由不能正确下内核
sudo ip link set dev br100 address 00:00:01:02:03:05 #这个是 rmac,即路由 mac
#添加 vrf
sudo ip link add evpn-vrf type vrf table 100
sudo ip link set evpn-vrf up
sudo ip link set br100 master evpn-vrf
sudo ip link set br30 master evpn-vrf
sudo ip link set br40 master evpn-vrf
#访问外网
#添加连接 evpn-vrf 到默认 vrf 的 vtep 接口
sudo ip link add ext1 type veth peer name ext
sudo ip link set ext1 up
sudo ip link set ext up
#其中 ext1 在 evpn-vrf,ext 在 default
sudo ip link set ext1 master evpn-vrf
#使用网段 5.5.5.0/24 作为 relay 网段
sudo ip addr add 5.5.5.253/24 dev ext1
sudo ip addr add 5.5.5.254/24 dev ext
#在 evpn 中加入默认路由,默认让流量访问公网, 这个网段所有租户共用,由管理员负责分配,不能冲突
sudo ip route add default via 5.5.5.254 dev ext1 table 100
#配置 snat,让私网流量改 smac 后范文公网
sudo nft add table nat
sudo nft add chain nat prerouting {type nat hook prerouting priority 0 \;}
sudo nft add chain nat postrouting {type nat hook postrouting priority 100 \;}
sudo nft add rule nat postrouting oifname ext1 counter masquerade
sudo nft add rule nat postrouting oifname ens33 counter masquerade
bgp evpn 配置
vrf evpn-vrf
vni 100
exit-vrf
!
router bgp 7676
bgp router-id 192.168.59.129
bgp bestpath as-path multipath-relax
neighbor fabric peer-group
neighbor fabric remote-as external
neighbor 192.168.59.130 peer-group fabric
!
address-family l2vpn evpn
neighbor fabric activate
advertise-all-vni
exit-address-family
!
router bgp 7676 vrf evpn-vrf
!
address-family ipv4 unicast
network 3.3.3.0/24
network 0.0.0.0/0
exit-address-family
!
address-family l2vpn evpn
advertise ipv4 unicast
exit-address-family
!
查看 bgp 信息
leaf1
- 查看路由信息
ubuntu# show bgp l2vpn evpn
BGP table version is 7, local router ID is 192.168.59.128
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: ip 2.2.2.254:2
*> [5]:[0]:[24]:[2.2.2.0]
192.168.59.128 0 32768 i
Route Distinguisher: ip 5.5.5.253:2
*> [5]:[0]:[0]:[0.0.0.0]
192.168.59.129 0 7677 7676 i
*> [5]:[0]:[24]:[3.3.3.0]
192.168.59.129 0 7677 7676 i
Route Distinguisher: ip 192.168.59.128:3
*> [2]:[0]:[48]:[46:48:a2:5e:e2:2f]
192.168.59.128 32768 i
*> [2]:[0]:[48]:[46:48:a2:5e:e2:2f]:[32]:[1.1.1.1]
192.168.59.128 32768 i
*> [3]:[0]:[32]:[192.168.59.128]
192.168.59.128 32768 i
Route Distinguisher: ip 192.168.59.129:3
*> [3]:[0]:[32]:[192.168.59.129]
192.168.59.129 0 7677 7676 i
Displayed 7 out of 7 total prefixes
ubuntu#
leaf2
- 查看路由信息
ubuntu# show bgp l2vpn evpn
BGP table version is 9, local router ID is 192.168.59.129
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: ip 2.2.2.254:2
*> [5]:[0]:[24]:[2.2.2.0]
192.168.59.128 0 7677 7675 i
Route Distinguisher: ip 5.5.5.253:2
*> [5]:[0]:[0]:[0.0.0.0]
192.168.59.129 0 32768 i
*> [5]:[0]:[24]:[3.3.3.0]
192.168.59.129 0 32768 i
Route Distinguisher: ip 192.168.59.128:3
*> [2]:[0]:[48]:[46:48:a2:5e:e2:2f]
192.168.59.128 0 7677 7675 i
*> [2]:[0]:[48]:[46:48:a2:5e:e2:2f]:[32]:[1.1.1.1]
192.168.59.128 0 7677 7675 i
*> [3]:[0]:[32]:[192.168.59.128]
192.168.59.128 0 7677 7675 i
Route Distinguisher: ip 192.168.59.129:3
*> [3]:[0]:[32]:[192.168.59.129]
192.168.59.129 32768 i
Displayed 7 out of 7 total prefixes
ubuntu#