aws vpc 通过gateway loadblancer创建终端节点服务检测客户端流量

参考资料

终端节点服务

终端节点基于Amazon PrivateLink技术实现,在不使用nat,igw和dx等服务的情况下,提供跨vpc和账号的私密访问。

img

在私有子网中我们可以使用aws服务终端节点访问aws服务,而无需配置nat网关和igw。终端节点分为以下两种

  • 网关终端节点,网关终端节点通过配置路由控制vpc中访问aws服务的流量。目前只支持s3和dynamodb

    https://docs.amazonaws.cn/zh_cn/vpc/latest/privatelink/vpce-gateway.html

  • 接口终端节点,接口终端节点会在指定vpc的指定子网中创建eni接口,之后vpc中的应用通过该eni网卡访问aws服务。可以将接口终端节点视作aws服务在vpc中的私有ip地址的映射。接口终端节点默认开启私有dns解析(s3接口终端节点除外),因此无需修改代码即可完成公有dns向私有ip地址的解析。

    https://docs.amazonaws.cn/zh_cn/vpc/latest/privatelink/vpce-interface.html

    支持接口终端节点的服务,https://docs.amazonaws.cn/zh_cn/vpc/latest/privatelink/integrated-services-vpce-list.html

img

除了使用aws托管服务的终端节点外,我们可以将自己的应用同样包装为一个终端节点,即终端节点服务

终端节点服务同样分为两种类型

  • nlb终端节点服务,服务提供者将应用程序或者alb作为nlb的后端暴露出去,并包装成一个终端节点服务。服务使用者创建这个终端节点服务对应的终端节点,进行私有访问。

                     使用接口终端节点访问终端节点服务

  • gwlb终端节点服务。服务提供者启动用于安全检查、合规性、策略控制和其他网络服务的防火墙服务,作为gwlb的后端包装为一个终端节点服务。服务使用者创建这个终端节点服务对应的终端节点。与nlb终端节点服务的区别在于,gwlb的后端并不真正处理请求,通常是进行安全和合规检测,对流量进行转发(感觉可以类比tun/tap设备的逻辑)。

                     使用网关负载均衡器终端节点访问终端节点服务

创建nlb类型的终端节点服务

在本账户下vpc B中创建nlb并挂载后端目标组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r2VDLF7P-1678946216286)(assets/image-20230316004106477.png)]

创建终端节点服务,指定上面的nlb

在这里插入图片描述

在vpc A中创建终端节点,搜索对端终端节点服务名称(service name)进行确认

在这里插入图片描述

在终端节点服务中确认请求,等待终端节点创建成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FQXZr6aC-1678946216289)(assets/image-20230316004720146.png)]

在vpc B中启动ec2实例访问终端节点的dns,查看nlb后端是否收到请求

$ nslookup vpce-0xxxxxxxxxb66b6-9qgowx3f.vpce-svc-0c702a885bf2a8a4c.cn-north-1.vpce.amazonaws.com.cn
Non-authoritative answer:
Name:   vpce-0xxxxxxxxxb66b6-9qgowx3f.vpce-svc-0c702a885bf2a8a4c.cn-north-1.vpce.amazonaws.com.cn
Address: 172.31.12.91
$ curl vpce-07f375298dfab66b6-9qgowx3f.vpce-svc-0c702a885bf2a8a4c.cn-north-1.vpce.amazonaws.com.cn
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...

创建glwb类型的终端节点服务

我们仿照官方文档创建一个glwb类型的终端节点服务,整体结构如下

     使用网关负载均衡器终端节点访问终端节点服务

img

在这里插入图片描述

子网路由设置如下

  • igw所在子网路由将通往application的流量发往gwlb

  • application服务所在子网的路由通往gwlb endpoint

  • gwlb endpoint所在子网路由表,既要包括通往application的路由,又要包括通往igw的路由

需要注意的点

  • vpc A有两个子网,一个用于app,一个用于gwlb endpoint

  • gwlb和target group可以处于同一子网中

  • gwlb所在子网至少有1个实例,必须监听6081端口,协议为GENEVE(Generic Network Virtualization Encapsulation)

关于gwlb路由配置,参考

https://docs.amazonaws.cn/elasticloadbalancing/latest/gateway/getting-started.html

创建目标组test-gwlb,必须监听6081端口,协议为GENEVE(Generic Network Virtualization Encapsulation)。不支持任何其他协议或端口。将健康检查设置为22端口

在这里插入图片描述

在vpc B创建gwlb,选择虚拟设备可用区,默认转发请求到目标组test-gwlb

在这里插入图片描述

创建gwlb终端节点服务

在这里插入图片描述

在vpc A创建终端节点,之后在终端节点服务中确认请求,等待终端节点创建成功

在这里插入图片描述

配置路由,细节参考

https://aws.amazon.com/cn/blogs/china/gateway-load-balanceruse-implement-centralized-network-traffic-depth-detection/

pip3 install pyyaml

使用git clone将整个目录下载到EC2上。执行如下命令:

git clone https://github.com/sentialabs/geneve-proxy.git

修改config.yaml配置文件如下

# If `allowed_transport_protocols` is set and has values, the proxy
# will drop any outbound flows using transport protocols not present in the list.
allowed_transport_protocols:
- 0x0006 # TCP
- 0x0011 # UDP
- 0x0001 # ICMP
# If `blocked_transport_protocols` is set and has values, the proxy
# will drop any outbound flows using transport protocols present in the list.
blocked_transport_protocols:
# - 0x0001 # ICMP

保存退出修改状态。由此,将表示允许ICMP协议通过。

修改proxy/proxy_config.py配置文件,找到self.outbound这一段中的allowed_transport_protocols,将其从None改为True。配置文件片段如下:

    self.outbound = {
      'drop_all_traffic': False,
      'allowed_transport_protocols': True,
       'blocked_transport_protocols': None,
      'allowed_application_ports': None,
      'blocked_application_ports': None,
    }

启动Geneve转发

python3 main.py

节点监听6081端口

$ netstat -nlp | grep 6081
(No info could be read for "-p": geteuid()=1000 but you should be root.)
udp        0      0 0.0.0.0:6081            0.0.0.0:*   

客户端发送ping,收到回包

ping www.bing.com

在服务后端抓包查看结果

$ sudo tcpdump -nvv 'port 6081'
192.168.101.247.60001 > 192.168.101.235.6081: [udp sum ok] Geneve, Flags [none], vni 0x0, options [class Unknown (0x108) type 0x1 len 12 data 74a11ad9 6ec49886, class Unknown (0x108) type 0x2 len 12 data 00000000 00000000, class Unknown (0x108) type 0x3 len 8 data 39f7f1a7]
        IP (tos 0x0, ttl 254, id 29162, offset 0, flags [DF], proto TCP (6), length 40)
    10.2.101.47.48354 > 52.94.212.197.https: Flags [.], cksum 0xb792 (correct), seq 2388, ack 5780, win 356, length 0
10:58:40.778376 IP (tos 0x0, ttl 254, id 32944, offset 0, flags [none], proto UDP (17), length 1568)
posted @ 2023-03-16 14:00  zhaojie10  阅读(14)  评论(0)    收藏  举报  来源