4

在 AWS VPC 上搭建 VXLAN 虚拟局域网的实验

 1 year ago
source link: https://hsiaofongw.notion.site/AWS-VPC-VXLAN-057d91d782554de899afde3315d11c32
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
woodcuts_13.jpg
Drag image to reposition

在 AWS VPC 上搭建 VXLAN 虚拟局域网的实验

Created
February 28, 2023 3:45 AM
vxlan
computerNetworking
Description
本文介绍了如何在 AWS VPC 上搭建 VXLAN 虚拟局域网的实验,包括 VXLAN 的 MAC 学习、安全性等内容,同时也提供了一些网络测试工具的使用方法。AWS VPC 是一种成熟的软件定义网络,用户可以在直观的图形界面或命令行界面对网络进行配置,无需关心底层实现。
Updated
July 16, 2023 5:58 AM
3 more properties
我们已经在上一篇文章中初步介绍过 AWS VPC: 简而言之,一个 VPC 相当于一个软件定义的网络,在 VPC 下你可以创建多个 Subnet 实例,一个 Subnet 从功能上来说有一点点接近于一个软件定义的路由器或者三层交换机,也就是说你可以给它配置路由表,并且它会按照用户期望的、指定的方式把 IP 分组转发到下一个路由节点。
在默认情况下这个”路由器“并不支持 IP 多播,也就是说你无法给该路由器发送一个多播 IP 分组然后让路由器把它转给多个接收者,但是我们可以通过在 AWS VPC 中创建 Transit gateway 实例来在 VPC 中实现多播支持,你可以把一个 Transit gateway 理解为支持多播功能的路由器。
VXLAN 全称是 Virtual extensible Local Area Network, 是基于 UDP 和多播技术的一种网络隧道技术,它允许网络管理员在两个 IP 互联但是 Ethernet segments 不同的网络之间建立隧道(隧道端点,VTEP)来组建虚拟局域网,在这个由 VTEP 建立的虚拟局域网中,这些不同子网的机器可以通过 VXLAN 虚拟网卡直接以以太网地址(MAC 地址)联系对方(直接给对方发以太帧),就好像这些机器都是接在一个物理交换机一样!VXLAN 与 VLAN 不同:1)VXLAN 是基于 UDP 多播技术的,UDP Header 中带有端口,可以穿过网络 NAT 设备;2)VXLAN 支持更大范围的 ID 号码,理论上有2的24次方个,大约一千六百多万,而 802.1Q 规范定义的 VLAN 最多只能够表示 4096 个不同的 VLAN ID.
在本文中,我们会演示如何在 AWS 中建立虚拟网络,然后在这些虚拟网络范围内的 EC2 实例之间搭建横跨区域的虚拟局域网。

在 VPC 内不同子网之间构建虚拟局域网

我们将利用 VXLAN 技术把多个不同 Subnet 下的机器都放到一个软件定义的虚拟局域网中。
VXLAN 技术是依赖于 UDP 多播的,所以成功建立 VXLAN 虚拟局域网的关键在于多播网络的成功搭建,也就是说,你只有在确定了这个网络正常地能够地支持多播之后,才能够开始敲命令创建 VXLAN。

建立 VPC

在 AWS Web 控制台页面,进入到 VPC 管理界面,进行下列操作:
创建一个新的 VPC;
在该 VPC 下建立两个子网 10.0.1.0/24 和 10.0.2.0/24;
在该 VPC 下建立一个 Internet gateway 实例,把它和 VPC 关联,并且在路由表中添加到它的路由;
创建一个 Transit gateway 实例,创建时记得把 Multicast support 复选框钩上;
创建一个 Transit gateway attachment 实例,把它和 Transit gateway 关联起来,注意 Transit gateway 会有一段 pending 时间,这段时间过后才能创建它的 Transit gateway attachment, 在创建时选到刚才创建的 VPC 和 Transit gateway;
创建一个 Transit gateway multicast domain 实例,将它和刚创建的 Transit gateway 关联起来,创建时钩上 IGMPv2 Support(重要);
将刚创建的 Transit gateway multicast domain 与 VPC 的两个 Subnet 关联起来;

建立 EC2 实例作为 VTEP 寄主

进入到 EC2 管理界面,进行下列操作:
创建两台 EC2 实例,除了名称不一样之外,要求:
为了可复线性,Image 选最新的 Ubuntu LTS;
分别位于 10.0.1.0/24 和 10.0.2.0/24 这两个不同的子网,注意要在 Instance type 选项卡中点击 Compare instance types, 检索满足 Hypervision: nitro 的 Instance type 并选择;比如 t3.micro; 因为在 AWS 只有 Nitro 实例才能够作为多播发送端;
在 Network Settings 选项卡下进行编辑,启用 Auto-assign public IP;
两个 instance 都用同一份 Security Group, Security Group 和 Network ACLs 的具体配置参见这份文档

测试多播网络

在 AWS VPC 中,一个 Transit gateway multicast domain 类似于一台支持 IP 多播功能的虚拟路由器,我们在上述操作中已经建立了一个一个支持多播的虚拟网络,我们将 Transit gateway multicast domain 与两个子网进行了关联,那么,关联之后这两个子网中的机器的多播流量最终就可以(在 AWS 网络基础架构设施的帮助下)到达这个所谓的“多播路由器”,并且由多播路由器多播给 IP Muticast Group 里面的成员(也就是 subscriber)。
在开始搭建 VXLAN 之前我们需要测试一下多播功能是否如愿正常工作,首先在两台机器上都安装 socat 命令行工具:
Shell
AWS 只支持 IGMPv2, 需要执行以下命令确保 kernel 用的就是 v2:
Shell
然后在尝试用 socat 加入一个多播组,例如:239.0.0.4 这个组:
Shell
建议在开始执行之前开另外一个 terminal 会话,执行以下命令观察机器加入多播组会发生什么样的数据报:
Shell
其中 ens5 是机器连接到多播路由器的网卡,也就是它的对外网卡,大概来说,我们会看到 tcpdump 打印的这两条记录:
Plain Text
然后我们去 AWS VPC 管理界面下的 Transit gateway multicast domain 列表界面,找到 Groups 标签页,点开并刷新,我们应该会看到里面有记录,看看有没有刚才执行 ip-add-membership 操作的机器的网卡,如果有则可以进行下一步。
保存这台机器的 socat 命令行不动(不用退出),去另一子网(这个子网应该也和 multicast domain 做了关联)执行:
Shell
这时我们应该看到前面那台正在监听的机器收到了现在这台机器发出的多播数据报。如果是这样那就说明多播网络成功建立了。

搭建 VTEP 端点

要把这些不同 Subnet 之间的机器都归并到一个虚拟局域网中,我们需要创建 VTEP,一般来说是有几个 Subnet 就创建几个 VTEP.
如果一台机器上至少有一个 VXLAN 隧道端点,我们就说这台机器是一个 VTEP.
一个 VXLAN 隧道端点是一个 Linux Kernel 支持的虚拟网卡,它能够把发给它的 Ethernet frame(以太帧)嵌入到 UDP Datagram(数据报)中,然后把该数据报通过机器上的其它网卡发送给路由器,路由器又把该数据报多播给网络上的其它 VTEP.
我们选用的多播地址是 232.10.11.12, UDP dst port 端口号是 4789, 下列命令建立一个 VTEP 虚拟网卡:
Shell
这时,我们访问 AWS VPC 管理界面下的 Transit gateway multicast domain 列表页面,点击之前创建的那个 TGMD, 点击 Groups tab, 会看到新增了一条 Group IP Address 为 232.10.11.12 的记录,这说明这台机器已经开始作为 232.10.11.12 这个多播组的成员了,这说明 VTEP 创建成功了。
如果这步不成功,读者需要回过头去检查哪一步错了,有可能是 IGMP 版本没有切换过来,也有可能是 Network ACLs 没有正确配置,或者是 Security Group 不对。在修改前面的配置之后,确保 IGMP JOIN 消息能够被负责多播的那个路由器收到之后,然后还要重新启用一遍 VXLAN 设备:
Shell
在另一个子网的那台机器上也做上述步骤,然后像刚才那样在 AWS 控制台界面下检查 Groups 列表看有没有新增这台机器,Groups 下新增的是哪台机器可以看它的 Network Interface ID 字段。
现在,VPC 下位于两个不同子网的两台机器实际上已经可以通信了,我们可以这样测试:
在其中一台机器上执行:
Shell
这几行命令实际上是创建了一个虚拟网卡 macvlan0, 然后 macvlan 类型的虚拟网卡会自动地和指定的网卡桥接(vxlan0),并且为 macvlan0 分配了 IP 地址。
然后再在另一台机器上执行类似的命令,IP 地址改为 10.0.3.11/24.
然后在两台机器上都执行:
Shell
从一台机器 ping 另一台机器的 10.0.3.0/24 网段下的地址,观察 tcpdump 的控制台输出,就可以确认 VXLAN 建立成功了!
事实上,我们还可以用 arping 命令行工具直接拿到这两台机器彼此的 MAC 地址,这也说明两台机器已经通过 VTEP 连接而处于同一个 Ethernet segment. 例如,在一台机器上执行:
Shell
再在另一台机器上执行:
Shell
可以验证这里的每台机器上 arping IP 地址的结果都和另一台机器的 MAC 地址是对应的,并且是通过 ARP 协议直接拿到的。
经过以上的步骤,我们就相当于把两个子网的两台机器都接到了同一台交换机上了。

跨 VPC 构建虚拟局域网

我们希望能够把跨区域的两台(或者更多)机器连接到一个逻辑上的交换机中,让它们互相操作起来就像是位于一个局域网中一样,VXLAN 加上 GRE 隧道能够帮我们实现这一个想法。并且基于 VXLAN 提供以太帧封装能力(把以太帧嵌入到 UDP 多播数据包中)的事实,我们还可以再进一步地基于已经建立好的 VXLAN 虚拟局域网,再建立一个或者多个 VLAN.
我们仍然利用 AWS 以及 AWS VPC 提供的网络虚拟化能力,因为这样做能够快速简单地创建、配置需要用到的网络设备和实验计算机。

构建 VPC

我们先选择在 Ohio 区域构建一个 VPC, 然后让它以某种方式和 N. California 的机器相连。
Ohio 区的 VPC 的 CIDR 是 10.1.0.0/16, 我们为它创建的唯一一个子网的 CIDR 是 10.1.1.0/24.
接下来创建必要的 Internet gateway、关联、路由等。
同样在,在 N. California 区域创建一个 VPC (10.2.0.0/16), 一个子网 (10.2.1.0/24), Internet gateway、关联、路由。

构建 EC2

我们把在 Ohio 区域的那台机器叫做 ohio-1,并且为他分配 IP 地址 10.1.1.71, 操作系统是最新的 Ubuntu LTS, 虚拟机 Hypervisor 是 Nitro, 实例类型是 t3.micro. 在安全组策略中放行必要的流量。
在 N. California 区域创建一台机器叫做 ncali-1, 规格类似 ohio-1, IP 地址 10.2.1.12.
分配 ping ohio-1 和 ncali-1 的公网 IP, 然后测试 ssh 连接情况,如果能 ssh 登陆并且在公网上 ping 通,说明 EC2 实例创建成功并且安全组初步看来没问题。

构建 VPC 对等连接

在 AWS VPC 管理界面,左侧导航栏找到 Peering connections, 点击进入,然后创建一个对等连接,把 Ohio 区域的档期 VPC 连接到 N. California 区域的刚创建的 VPC(反之亦可)。
在路由界面新增一条路由,路由目的网络地址是对面 VPC 的 CIDR,指向对面的 VPC,两个 VPC 都有添加这样的指向对方的路由。我们的 VPC 没有重合的 CIDR,所以这一步配置起来很简单。
现在可以登陆到一台机器去 ping 对面 VPC 的那台机器了。也可以用 iperf 测试。
如果能 ping 通并且 iperf 测试正常,说明这步做对了。

构建 GRE 隧道

GRE 隧道有一点点类似我们之前提到过的 IPIP 隧道,也是一种 Encapsulation 技术,支持将 IP 包嵌入到 IP 包中实现隧道,它的功能更灵活、更强大,而且支持多播。
既然我们已经实现了 10.1.1.71 和 10.2.1.12 两台机器的 IP 互联(直接通过内网 VPC 中的 IP 地址访问),那么我们就在这两个机器之间建立隧道,以下是命令:
在 ohio-1 10.1.1.71 这台机器执行:
Shell
在 ncali-1 10.2.1.12 这台机器执行:
Shell
最后添加的路由是为了让机器知道收到 ICMP 包之后怎样还回去。
然后两台机器通过 tunnel 互相 ping, ping 通就算是隧道建立成功了。

搭建多播路由器

接下来我们在两台机器上都执行:
Shell
以安装多播路由软件。
在两台机器上为 GRE tunnel 网卡增加多播功能:
Shell

Recommend

  • 17
    • theconsultingcto.com 4 years ago
    • Cache

    Bastions on Demand (In an AWS VPC)

    Any time you have a VPC, you’ll likely need some way to gain access to the resources within the VPC from your local box. Typically, the way to do that is to run a bastion (or jumpbox) which you and your team can SSH into....

  • 17
    • blog.deleu.dev 4 years ago
    • Cache

    AWS VPC for Software Engineers

    AWS VPC for Software EngineersFebruary 02, 2020I’ve been working with AWS for about 3 years now. Going to the cloud can be extremely overwhelming and stressful. I jumped head first on a company that wanted to setup a brand new...

  • 16
    • techblog.bozho.net 4 years ago
    • Cache

    Connecting to Kibana Within an AWS VPC

    Connecting to Kibana Within an AWS VPC When you use the managed Elasticsearch service on AWS, you usually choose an encrypted connection (via KMS-managed keys), which means you can’t use just any t...

  • 17

    AWS 同一區的 VPC Peering 流量不收費了 AWS 在同一個 AZ 裡面的流量是不收費的,但如果是跨帳號的話,還是要當作 inter-AZ 流量 (收 USD$0.01/GB 的費用),現在則是宣佈不用了:「

  • 7
    • blog.zhengzi.me 3 years ago
    • Cache

    在容器中搭建简单的 vxlan 隧道

    现在,Docker 已经成为了一个非常主流的虚拟化技术,它集合了 Linux 中的许多虚拟化技术,如 Namespace、cgroup 和 AUFS 等等,所以我们可以使用 Docker 搭建一个开箱即用的虚拟化容器。但是,Docker 网路在很多时候依旧不能满足应用场景中的需求,这就需要我们...

  • 10

    How to create a VPC Peering between 2 VPCs on AWS A VPC peering connection is a connection between two VPCs that enables you to route traffic between them. We can create a VPC peering connection between our VPCs, or with a VPC in an...

  • 5
    • blog.zhengi.me 3 years ago
    • Cache

    在容器中搭建简单的Vxlan隧道

    This site can’t be reached blog.zhengi.me’s server IP address could not be found. ...

  • 7
    • developer.squareup.com 3 years ago
    • Cache

    Adopting AWS VPC Endpoints at Square

    In this post, we share our experiences with adopting AWS VPC Endpoints at Square. We want strong security guarantees in our communication with managed AWS servi...

  • 13

    5 Tips for Troubleshooting an AWS VPC Peering Connection If you're using Virtual Private Clouds (VPCs)...

  • 3
    • www.luozhiyun.com 2 years ago
    • Cache

    云原生虚拟网络之 VXLAN 协议

    云原生虚拟网络之 VXLAN 协议 Posted on 2022年7月24日2022年7月24日 by luozhiyun

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK