AWS攻略——初识流量镜像

Posted breaksoftware

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AWS攻略——初识流量镜像相关的知识,希望对你有一定的参考价值。

在实际应用场景下,我们可能需要建立一个测试环境,既能接线上流量,又不希望影响线上业务,这个时候流量镜像就派上用场。它会将一个网络接口中的流量复制到另外一个网络接口中,然后在后者上分发,而前者不受影响。

在上图中我们可以看到,复制过来的流量会被转换——转换成vxlan协议的UDP流量。这个现象就导致测试环境的接口和生产环境不一致——这并不是我们希望的——我们希望部署在测试环境和生产环境上的代码或程序是一样的。

为了解决这个问题,我们需要加一个中间层:把UDPvxlan协议转回去,并分发到测试环境。

现在我们在AWS上完成上述设计。

创建VPC和EC2

选择区域和IPv4/CIDR

创建一个100.0.0.0/24的VPC,名字叫TrafficMirrorVpc。

分配子网

我们将分配一个Public类型子网TrafficMirrorSourcePublicSubnet,用于接收互联网流量。它下面实例的流量将会被复制到名字叫TrafficMirrorAdapterPrivateSubnet子网下的实例。经过转换,流量会被发送给TrafficMirrorTargetPrivateSubnet子网下的实例。我们在TrafficMirrorSourcePublicSubnet和TrafficMirrorTargetPrivateSubnet子网下部署的实例的程序是一样的,这样前者模拟线上环境,后者模拟测试环境。

子网名称IPv4/CIDR区域
TrafficMirrorSourcePublicSubnet100.0.0.0/28eu-west-1a
TrafficMirrorAdapterPrivateSubnet100.0.0.16/28eu-west-1a
TrafficMirrorTargetPrivateSubnet100.0.0.32/28eu-west-1a

创建EC2

这儿需要注意一点,被镜像流量的实例需要是基于AWS Nitro System的。适配的类型可以见:https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances。我们选择相对便宜的t3.nano类型来做测试。
我们会对公网下的TrafficMirrorSourceEC2开启自动分配公有IP的功能。因为我们既要在互联网上对其发送流量,也需要把它作为跳板机跳转到其他两个私有网络下的EC2上,以方便部署代码。

实例名所属子网实例类型是否自动分配公有IP
TrafficMirrorSourceEC2TrafficMirrorSourcePublicSubnett3.nano
TrafficMirrorAdapterEC2TrafficMirrorAdapterPrivateSubnett3.nano
TrafficMirrorTargetEC2TrafficMirrorTargetPrivateSubnett3.nano

私有子网访问互联网(单向)

这个不是必须步骤。主要是为了让TrafficMirrorAdapterPrivateSubnet和TrafficMirrorTargetPrivateSubnet子网下EC2实例可以访问外网,以方便部署代码。

部署NAT网关

修改路由表

创建一个给Private网络的路由。

然后配置路由

路由关联私有子网

打通公有子网和互联网

创建互联网网关,并关联到VPC

公有子网路由到互联网网关

设定ACL

因为默认的ACL只允许22端口访问,而TrafficMirrorSourcePublicSubnet子网下机器需要开放80端口以供外网测试,且TrafficMirrorAdapterPrivateSubnet需要响应4789端口的UDP请求,所以我们将对各个子网的ACL进行定制。

定制生产/测试环境ACL

主要开启22端口和80端口,源地址选择任意。它主要给TrafficMirrorSourcePublicSubnet和TrafficMirrorTargetPrivateSubnet使用。


这儿需要注意的是,针对两个子网开启所有TCP连接,否则SSH会失败。

定制转换层ACL

主要开放UDP协议的4789端口,是给TrafficMirrorAdapterPrivateSubnet使用。


修改安全组

对TrafficMirrorAdapterEC2新增UDP 4789

对TrafficMirrorSourceEC2新增80端口支持

对TrafficMirrorTargetEC2新增80端口支持

部署Adapter层

通过公网下的EC2跳板机,我们登录到TrafficMirrorAdapterEC2,执行下面的命令

sudo yum update -y
sudo yum install git -y
sudo yum install go -y
sudo yum install libpcap-devel -y
go env GOPATH
export HOME=~
echo 'export GOPATH=$HOME/go' >>~/.bash_profile
source ~/.bash_profile
mkdir -p $GOPATH"/src/vxlan-to-http-request"
wget https://github.com/aws-samples/http-requests-mirroring/raw/main/main.go -P $GOPATH"/src/vxlan-to-http-request"
cd $GOPATH"/src/vxlan-to-http-request"
go mod init vxlan-to-http-request
go get "github.com/google/gopacket"
go mod tidy
go build ./
go install vxlan-to-http-request
sudo ip link add vxlan0 type vxlan id 1 dev eth0 dstport 4789
sudo ip link set vxlan0 up

这儿特别需要注意下倒数第二行 vxlan id 1这个,需要和后续创建的流量镜像Session的VNI值一致(即也设置为1)。
然后这么执行程序(其中100.0.0.37是TrafficMirrorTargetEC2的IP)

sudo ./vxlan-to-http-request -destination "http://100.0.0.37" -filter-request-port "80"

创建流量镜像

创建筛选条件

我们只检测80端的入站流量

创建目标

我们需要把流量镜像到Adapter层EC2的网络接口。

创建镜像会话

源我们选TrafficMirrorSourceEC2的网络接口


测试

我们在生产环境TrafficMirrorSourceEC2和测试环境TrafficMirrorTargetEC2上启动一个简单的http服务。

sudo python3 -m http.server 80


可以看到两个环境收到了一致的请求。

总结

整个配置过程其实比较简单。只是因为要测试,且对ACL、安全组要求比较严格,导致很多设置。
最最需要注意的是我们在创建镜像会话时,要记住VNI的值,然后保证其和下面$TrafficMirroringVNI值一致。

sudo ip link add vxlan0 type vxlan id $TrafficMirroringVNI dev eth0 dstport 4789
sudo ip link set vxlan0 up

参考资料

以上是关于AWS攻略——初识流量镜像的主要内容,如果未能解决你的问题,请参考以下文章

AWS攻略——创建VPC

AWS攻略——Peering连接VPC

AWS攻略——使用ACL限制访问

在 AWS 上拒绝除 cloudwatch 之外的所有出站流量

传出流量 AWS 的公共 IP 地址

AWS Cognito 网络流量相关问题