天天看点

一键部署NAT功能的ECS集群

专有网络环境下,云服务器ecs实例不能直接访问公网,需要通过挂载eip来获得公网访问的能力。但是往往集群内部多台ecs都能对外提供服务,这时如果每一台都挂载eip不仅耗费带宽资源,还破坏了整个网络结构。本文介绍一种snat网关访问公网的方式如下图所示 :

一键部署NAT功能的ECS集群

解读:

拿其中一台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结构的部署。

user-data 是实现云主机个性化定制的基础,用户通过 user-data 设置一些定制化数据,如启动某项服务,下载一些包并设置这些包的安装脚本等,cloud-init 在云主机启动时加载并执行这些数据,从而完成对云主机的个性化定制。

<code>alicloud_vpc</code>: vpc实例配置

cidr_block: 指定网段

<code>alicloud_vswitch</code>: 配置vswitch

cidr_block: 网段

availability_zone: 可用区

<code>alicloud_route_entry</code>: 配置路由条目

router_id: 指定vpc网络中的路由器id

route_table_id: 指定vpc网络中路由表id

destination_cidrblock: 目标网段

nexthop_type: 下一跳类型,这里填instance

nexthop_id: ecs实例id

<code>template_file</code>: 模板文件,支持把template的值传给shell脚本,片段如下

在ecs和vswtich创建完之后,拿到ip地址传给shell脚本

<code>alicloud_instance</code>: ecs实例配置

image_id: 镜像id

instance_type: 实例类型

vswitch_id: 交换机id

io_optimized: 是否io优化

system_disk_category: 系统盘类型

这里用到了userdata, 把配置iptables的脚本传给ecs,在实例启动的时候自动配置iptables

${worker_private_ip}&gt;&gt; /etc/sysctl.conf

'net.ipv4.ip_forward=1'&gt;&gt; /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}

ssh到ecs上执行命令 <code>iptables -t nat -nvl</code> 结果如下:

| 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