应用场景
专有网络环境下,云服务器ECS实例不能直接访问公网,需要通过挂载EIP来获得公网访问的能力。但是往往集群内部多台ECS都能对外提供服务,这时如果每一台都挂载EIP不仅耗费带宽资源,还破坏了整个网络结构。本文介绍一种SNAT网关访问公网的方式如下图所示 :
解读:
- 拿其中一台ECS做为VPC网络的NAT网关,然后在路由表中添加其他实例的转发规则。
- 首先这台ECS实例要在指定的VPC网络中,
- 然后给它绑定EIP,然后在这台ECS实例上的iptables配置SNAT和DNAT,
- 最后在VPC的路由表中添加下一跳是这台ECS的路由项。
传统步骤
在控制台:
- 创建VPC实例
- 创建一个VSwitch(记录下网段)
- 创建EIP实例
- 创建ECS实例(记录下IP)
- ECS绑定EIP
- 登录ECS配置iptables(需要用Vswtich网段和ECS IP)
- 添加路由
每一步操作都需要切换到不同的地址、不同的页面,不仅操作繁琐还得不停的切换时间片。详细操作步骤请参考教程。 下面介绍一种自动的方式,可以一键部署完成。
自动化部署
上述每一个步骤都是资源部署和配置的过程,以配置文件的方式来描述基础设施,然后让编排工具帮助我们去部署资源,这是基础设施即代码(Infrastructure as Code)的核心。本文讲解利用开源社区活跃度最高的资源编排工具Terraorm,在阿里云完成SNAT结构的部署。
UserData
User-Data 是实现云主机个性化定制的基础,用户通过 User-Data 设置一些定制化数据,如启动某项服务,下载一些包并设置这些包的安装脚本等,Cloud-Init 在云主机启动时加载并执行这些数据,从而完成对云主机的个性化定制。
- 更多的详情可参考Cloud-Init文档
- 阿里云ECS userdata详解请参考
Terraform编排模板
Terraform 是来自HashiCorp家族的开源工具,支持阿里云、AWS、Azure、GoogleCloud、DigitalOcean诸多云厂商的支持。有关terraform详细介绍请移步前一篇文章。本例涉及到的Terraform资源如下:
-
alicloud_vpc
: vpc实例配置- cidr_block: 指定网段
-
alicloud_vswitch
: 配置vswitch- cidr_block: 网段
- availability_zone: 可用区
-
alicloud_route_entry
: 配置路由条目- router_id: 指定VPC网络中的路由器ID
- route_table_id: 指定VPC网络中路由表ID
- destination_cidrblock: 目标网段
- nexthop_type: 下一跳类型,这里填Instance
- nexthop_id: ECS实例ID
-
template_file
: 模板文件,支持把template的值传给shell脚本,片段如下data "template_file" "shell" { template = "${file("userdata.sh")}" vars { worker_private_ip = "${alicloud_instance.worker.private_ip}" vswitch_cidr = "${var.vswitch_cidr}" } }
- 在ecs和vswtich创建完之后,拿到ip地址传给shell脚本
-
alicloud_instance
: ECS实例配置- image_id: 镜像ID
- instance_type: 实例类型
- vswitch_id: 交换机ID
- io_optimized: 是否IO优化
- system_disk_category: 系统盘类型
- user_data: 用户脚本,详见
- 这里用到了userData, 把配置iptables的脚本传给ECS,在实例启动的时候自动配置iptables
PostRouting=${vswitch_cidr}
- ${worker_private_ip}>> /etc/sysctl.conf
- 'net.ipv4.ip_forward=1'>> /etc/sysctl.conf
- -p
- -t nat -I POSTROUTING -s $PostRouting -j SNAT --to-source $SourceRouting
-t nat -I PREROUTING -d $SourceRouting -p tcp --dport 80 -j DNAT --to ${worker_private_ip}
完整模板 下载
一键部署
安装 Terraform, 然后下载我们的模板,执行 terraform apply
等待几分钟,整个基础架构部署完成
验证
SSH到ECS上执行命令 iptables -t nat -nvL
结果如下:
| target | port | in | source | destination | |
| ----- | ---- | -- | ----------- | -------------- | ------------------------ |
| DNAT | tcp | * | 0.0.0.0/0 | 10.1.1.57 | tcp dpt:80 to:10.1.1.56
| SNAT | all | * | 10.1.1.0/24 | 0.0.0.0/0 | to:10.1.1.57
反馈
本文介绍了一种自动化选配ECS 做为NAT的方法,减轻了繁琐的配置工作,可以跟您的自动化工具协同使用。大家对自动构建工具Terraform感兴趣,或者有问题也可以在github https://github.com/alibaba/terraform-provider 的Issue中提问。