ROS搭建SNAT网关使专有网络访问Internet

本文涉及的产品
公网NAT网关,每月750个小时 15CU
网络型负载均衡 NLB,每月750个小时 15LCU
资源编排,不限时长
简介: 利用ROS自动给VPC网络创建和配置SNAT网关以便让专有网络的ECS实例访问公网

背景

专有网络环境下,云服务器ECS实例不能直接访问公网,一种方法是给需要访问公网的ECS实例申请弹性IP,但是如果有大量的ECS实例同时需要访问公网,这种方法就不可行。今天将介绍一种SNAT网关访问公网的方式。如下图所示 :

screenshot

这种方法需要申请一台额外的ECS实例绑定EIP做VPC网络的SNAT网关。首先这台ECS实例要在指定的VPC网络中,要绑定EIP,配置这台ECS实例上的iptables, 最后在指定VPC网络的路由表中添加下一跳是这台ECS的路由项。详细的手动配置过程请参考这里

ROS资源介绍

下面将介绍如何通过ROS自动化创建配置VPC SNAT网关。在模版中使用了ROS的如下资源:

ALIYUN::ECS::EIP

  • InternetChargeType:计费方式,按带宽或者按照流量
  • Bandwidth: 带宽在[1~200]取值,单位是Mbps

创建EIP资源

ALIYUN::ECS::EIPAssociation

  • AllocationId:分配的EIP ID
  • InstanceId: 需要绑定EIP的ECS instance ID

本资源资源将绑定EIP到指定的ECS实例

ALIYUN::ECS::Route

  • RouteId: 指定VPC网络中的路由器ID
  • RouteTableId: 指定VPC网络中路由表ID
  • DestinationCidrBlock: 路由项的目标网段
  • NextHopId:路由项的下一跳

本资源将会添加一条路由到指定VPC网络的路由表中,它的下一跳是SNAT网关

ALIYUN::ECS::InstanceGroup

  • 本例中主要使用了UserData属性,用户通过指定脚本给UserData,当ECS启动的时候,就会自动配置iptables。

本资源就是创建SNAT网关

编写ROS模版

在模版中,首先说明此stack需要一个EIP资源,一台ECS实例,并且把EIP绑定到ECS资源上,最终通过执行我们传给ECS的UserData脚本自动化的配置iptbales,最终把下一跳指向ECS的路由项添加到VPC路由器的路由表里面。最终的ROS模版如下:

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Description": "一键创建SNAT网关",
  "Parameters": {
    "SecurityGroupId": {
      "Description": "安全组ID",
      "Type": "String"
    },
    "RouteTableId": {
      "Description": "专有网络中路由器ID",
      "Type": "String"
    },
    "RouteId": {
      "Description": "专有网络中路由器ID",
      "Type": "String"
    },
    "EIPBandwidth": {
      "Default": 5,
      "MinValue": 1,
      "Description": "弹性公网IP的限速,默认为 5Mbps。",
      "Type": "Number",
      "MaxValue": 200
    },
    "ECSZoneId": {
      "Description": "可用区, , <a href='#/product/cn-shenzhen/list/zoneList' target='_blank'>查看可用区</a>",
      "Type": "String"
    },
    "ECSPassword": {
      "NoEcho": true,
      "MaxLength": 30,
      "Description": "实例的密码",
      "Type": "String",
      "ConstraintDescription": "8-30个字符, 必须同时包含三项(大、小写字母,数字和特殊符号).",
      "MinLength": 8
    },
    "VSwitchId": {
      "Type": "String"
    },
    "VpcId": {
      "Type": "String"
    },
    "VSwitchCidrBlock": {
      "Description": "通过SNAT网关访问外网的VSwitch网段,此网段必须属于VPC",
      "Type": "String"
    },
    "EIPInternetChargeType": {
      "Default": "PayByTraffic",
      "AllowedValues": [
        "PayByBandwidth",
        "PayByTraffic"
      ],
      "Description": "弹性公网IP计费类型,PayByBandwidth(按固定带宽计费),PayByTraffic(按使用流量计费),固定带宽的费用以天计,使用流量的费用以小时计",
      "Type": "String"
    },
    "ECSSysDiskSize": {
      "Default": 40,
      "MinValue": 40,
      "Description": "系统盘大小,40-500之间",
      "Type": "Number",
      "MaxValue": 500
    },
    "ECSDiskCategory": {
      "Default": "cloud_efficiency",
      "AllowedValues": [
        "cloud",
        "cloud_efficiency",
        "cloud_ssd"
      ],
      "Description": "系统盘的磁盘种类, 普通云盘(cloud)、高效云盘(cloud_efficiency)或SSD云盘(cloud_ssd)",
      "Type": "String"
    },
    "ECSInstanceType": {
      "Default": "ecs.s2.large",
      "AllowedValues": [
        "ecs.t1.small",
        "ecs.s1.small",
        "ecs.s1.medium",
        "ecs.s1.large",
        "ecs.s2.small",
        "ecs.s2.large",
        "ecs.s2.xlarge",
        "ecs.s2.2xlarge",
        "ecs.s3.medium",
        "ecs.s3.large",
        "ecs.m1.medium",
        "ecs.m2.medium",
        "ecs.m1.xlarge",
        "ecs.c1.small",
        "ecs.c1.large",
        "ecs.c2.medium",
        "ecs.c2.large",
        "ecs.c2.xlarge",
        "ecs.n1.tiny",
        "ecs.n1.small",
        "ecs.n1.medium",
        "ecs.n1.large",
        "ecs.n1.xlarge"
      ],
      "Description": "实例规格, <a href='#/product/cn-shenzhen/list/typeList' target='_blank'>查看实例规格</a>",
      "Type": "String"
    },
    "ECSImageId": {
      "Default": "ubuntu1404_64_40G_cloudinit_20160427.raw",
      "Description": "镜像文件 ID,表示启动实例时选择的镜像资源, <a href='#/product/cn-shenzhen/list/imageList' target='_blank'>查看实例规格</a>",
      "Type": "String"
    },
    "ECSTag": {
      "Description": "ECS的标签",
      "Type": "String"
    }
  },
  "Resources": {
    "ElasticIpAssociation": {
      "Type": "ALIYUN::ECS::EIPAssociation",
      "Properties": {
        "InstanceId": {
          "Fn::Select": [
            "0",
            {
              "Fn::GetAtt": [
                "ECSSnatGateWay",
                "InstanceIds"
              ]
            }
          ]
        },
        "AllocationId": {
          "Fn::GetAtt": [
            "ElasticIp",
            "AllocationId"
          ]
        }
      }
    },
    "VRoute": {
      "Type": "ALIYUN::ECS::Route",
      "Properties": {
        "NextHopId": {
          "Fn::Select": [
            "0",
            {
              "Fn::GetAtt": [
                "ECSSnatGateWay",
                "InstanceIds"
              ]
            }
          ]
        },
        "RouteId": {
          "Ref": "RouteId"
        },
        "RouteTableId": {
          "Ref": "RouteTableId"
        },
        "DestinationCidrBlock": "0.0.0.0/0"
      }
    },
    "ECSSnatGateWay": {
      "Type": "ALIYUN::ECS::InstanceGroup",
      "Properties": {
        "SecurityGroupId": {
          "Ref": "SecurityGroupId"
        },
        "ImageId": {
          "Ref": "ECSImageId"
        },
        "Password": {
          "Ref": "ECSPassword"
        },
        "MinAmount": "1",
        "InternetMaxBandwidthIn": 100,
        "UserData": {
          "Fn::Replace": [
            {
              "ros-notify": {
                "Fn::GetAtt": [
                  "ECSSnatGateWayConditionHandle",
                  "CurlCli"
                ]
              }
            },
            {
              "Fn::Join": [
                "",
                [
                  "#!/bin/sh",
                  "\n",
                  "PostRouting=",
                  {
                    "Ref": "VSwitchCidrBlock"
                  },
                  "\n",
                  "SourceRouting=`ifconfig eth0|grep inet|awk '{print $2}'|tr -d 'addr:'`",
                  "\n",
                  "echo 'net.ipv4.ip_forward=1'>> /etc/sysctl.conf \n",
                  "sysctl -p \n",
                  "iptables -t nat -I POSTROUTING -s $PostRouting -j SNAT --to-source $SourceRouting \n",
                  "apt-get update\n",
                  "apt-get install -y curl\n",
                  "ros-notify -d '{\"data\" : \" docker swarm created\"}'\n"
                ]
              ]
            }
          ]
        },
        "ZoneId": {
          "Ref": "ECSZoneId"
        },
        "VSwitchId": {
          "Ref": "VSwitchId"
        },
        "InternetChargeType": "PayByTraffic",
        "VpcId": {
          "Ref": "VpcId"
        },
        "InstanceType": {
          "Ref": "ECSInstanceType"
        },
        "SystemDisk_Category": {
          "Ref": "ECSDiskCategory"
        },
        "IoOptimized": "optimized",
        "Tags": [
          {
            "Value": {
              "Ref": "ECSTag"
            },
            "Key": "ECS_SNAT_GATEWAY"
          }
        ],
        "InternetMaxBandwidthOut": 100,
        "SystemDisk_Size": {
          "Ref": "ECSSysDiskSize"
        },
        "MaxAmount": "1"
      }
    },
    "ECSSnatGateWayConditionHandle": {
      "Type": "ALIYUN::ROS::WaitConditionHandle"
    },
    "ECSSnatGateWayGroupWaitCondition": {
      "Type": "ALIYUN::ROS::WaitCondition",
      "DependsOn": "ECSSnatGateWay",
      "Properties": {
        "Handle": {
          "Ref": "ECSSnatGateWayConditionHandle"
        },
        "Timeout": 600,
        "Count": 1
      }
    },
    "ElasticIp": {
      "Type": "ALIYUN::ECS::EIP",
      "Properties": {
        "InternetChargeType": {
          "Ref": "EIPInternetChargeType"
        },
        "Bandwidth": {
          "Ref": "EIPBandwidth"
        }
      }
    }
  },
  "Outputs": {
    "ECSSnatGateWay_INNER_IPS": {
      "Value": {
        "Fn::GetAtt": [
          "ECSSnatGateWay",
          "PrivateIps"
        ]
      },
      "Description": "Inner IP address of the ECS instance."
    },
    "ECSSnatGateWay_InstanceIds": {
      "Value": {
        "Fn::GetAtt": [
          "ECSSnatGateWay",
          "InstanceIds"
        ]
      },
      "Description": "The instance id of created ecs instance"
    },
    "EipAddress": {
      "Value": {
        "Fn::GetAtt": [
          "ElasticIp",
          "EipAddress"
        ]
      },
      "Description": "IP address of created EIP."
    },
    "ECSSnatGateWay_ZoneIds": {
      "Value": {
        "Fn::GetAtt": [
          "ECSSnatGateWay",
          "ZoneIds"
        ]
      },
      "Description": "Zone id of created instance."
    }
  }
}
相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限。它通过设置一系列规则,控制谁可以访问特定资源、在什么条件下访问以及可以执行哪些操作。ACL 可以应用于路由器、防火墙等设备,分为标准、扩展、基于时间和基于用户等多种类型,广泛用于企业网络和互联网中,以增强安全性和精细管理。
220 7
|
4月前
|
消息中间件 存储 Serverless
函数计算产品使用问题之怎么访问网络附加存储(NAS)存储模型文件
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
21 2
|
1月前
|
网络协议 安全 文件存储
动态DNS(DDNS)技术在当前网络环境中日益重要,它允许使用动态IP地址的设备通过固定域名访问
动态DNS(DDNS)技术在当前网络环境中日益重要,它允许使用动态IP地址的设备通过固定域名访问,即使IP地址变化,也能通过DDNS服务保持连接。适用于家庭网络远程访问设备及企业临时或移动设备管理,提供便捷性和灵活性。示例代码展示了如何使用Python实现基本的DDNS更新。尽管存在服务可靠性和安全性挑战,DDNS仍极大提升了网络资源的利用效率。
54 6
|
1月前
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。ACL 可应用于路由器、防火墙等设备,通过设定规则控制访问。其类型包括标准、扩展、基于时间和基于用户的ACL,广泛用于企业网络和互联网安全中,以增强安全性、实现精细管理和灵活调整。然而,ACL 也存在管理复杂和可能影响性能的局限性。未来,ACL 将趋向智能化和自动化,与其他安全技术结合,提供更全面的安全保障。
101 4
|
1月前
|
网络协议 网络安全 数据安全/隐私保护
计算机网络概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等
计算机网络概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等
52 4
|
1月前
|
网络协议 网络安全 数据安全/隐私保护
计算机网络概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等
【10月更文挑战第27天】计算机主机网关的作用类似于小区传达室的李大爷,负责将内部网络的请求转发到外部网络。当小区内的小不点想与外面的小明通话时,必须通过李大爷(网关)进行联系。网关不仅帮助内部设备与外部通信,还负责路由选择,确保数据包高效传输。此外,网关还参与路由表的维护和更新,确保网络路径的准确性。
56 2
|
1月前
|
域名解析 弹性计算 网络安全
CEN+私网NAT实现跨地域访问云服务需求-CEN企业版
本文介绍了如何通过企业版云企业网和私网NAT配置,实现ECS内网跨地域访问OSS资源的方法。该方法避免了跨地域配置云服务网段时可能出现的管控异常问题,适用于其他云服务如MQ等。
|
2月前
|
网络协议 网络虚拟化 网络架构
【网络实验】/主机/路由器/交换机/网关/路由协议/RIP+OSPF/DHCP(上)
【网络实验】/主机/路由器/交换机/网关/路由协议/RIP+OSPF/DHCP(上)
84 1
|
2月前
|
网络协议 Ubuntu 前端开发
好好的容器突然起不来,经定位是容器内无法访问外网了?测试又说没改网络配置,该如何定位网络问题
本文记录了一次解决前端应用集成到主应用后出现502错误的问题。通过与测试人员的沟通,最终发现是DNS配置问题导致的。文章详细描述了问题的背景、沟通过程、解决方案,并总结了相关知识点和经验教训,帮助读者学习如何分析和定位网络问题。
123 0

热门文章

最新文章

推荐镜像

更多