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

背景

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

这种方法需要申请一台额外的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."
    }
  }
}
时间: 2024-08-04 14:27:34

ROS搭建SNAT网关使专有网络访问Internet的相关文章

ROS搭建具有NAT Gateway功能的VPC 网络

背景 专有网络环境下,特定ECS往往需要公网访问能力,前面我们介绍了<ROS搭建SNAT网关使专有网络访问Internet>,利用ECS和EIP手动的搭建一个SNAT网关. 目前阿里云官方推出了专门的网络产品--NAT网关,对公网IP和公网带宽进行统一管理. ROS资源介绍 ROS提供三个插件对NAT Gateway进行支持: ALIYUN::ECS::NatGateway, 创建Nat网关,分配带宽包和公网IP VpcId: 给哪个VPC中创建NatGateway Spec: NAT网关的规

使用keepalived和HaVip搭建具备高可用能力的SNAT网关

在VPC中,为一台ECS绑定EIP,并在该ECS上搭建代理软件,可以将该ECS实例建设为一个SNAT网关,让同VPC内其他实例将该实例作为公网网关进行公网访问. 然而,这种方式搭建的SNAT网关是个单点,可用性较差.我们可以使用keepalived和HaVip来搭建一个具备主备切换能力的高可用SNAT网关. ## 环境 1.    准备两个EIP. 2.    准备四台ECS实例,在一个VPC的同一个VSwitch下.   * 192.168.1.201 (绑定了EIP 123.56.16.10

使用.NET访问 Internet(1) Paul

Microsoft .NET 框架提供 Internet 服务的分层的.可扩展的和托管的实现,您可以将这些 Internet 服务快速而轻松地集成到您的应用程序中.您的应用程序可建立在可插接式协议的基础之上以便自动利用新的 Internet 协议,或者它们可以使用 Windows 套接字接口的托管实现来使用套接字级别上的网络. 介绍可插接式协议 Microsoft .NET 框架提供分层的.可扩展的和托管的 Internet 服务实现,您可以将它们快速而轻松地集成到您的应用程序中.System.

无线网络无法访问Internet

  无线网络连接正常,但是无法正常连接到Internet. 这样的情况可能是没有得到有效的IP地址,可以对无线网卡的地址进行检查.在一般情况下,无线网卡通过DHCP的方式获取IP地址和DNS服务器的地址.可以选择"开始"→"运行",然后输入cmd,单击"确定",就可以打开"命令提示符",再输入ipconfig/all,查看返回的结果.如果IP地址.网关和DNS都没有错误,却仍然无法访问Internet,就说明网关有问题. 检查

可以访问Internet无法访问其他电脑

  电脑在使用的时候可以正常访问Internet,也可以访问服务器,但是却无法访问其他电脑. 如果电脑在使用WINS解析,就有可能是由于WINS服务器的地址设置错误造成的.然后对网关的设置进行检查,如果双方属于不同的子网,网关的设置错误,则就不能看到其他工作站.还可以对子网掩码设置进行检查.

使用Nginx反向代理和proxy_cache缓存搭建CDN服务器加快Web访问速度

碰到问题:移动用户访问web服务器www.osyunwei.com很慢解决办法:1.在移动机房放置一台nginx反向代理服务器2.通过域名DNS智能解析,所有移动用户访问www.osyunwei.com时解析到nginx反向代理服务器3.nginx反向代理服务器与web服务器之间采用专线连接系统运维  www.osyunwei.com  温馨提醒:qihang01原创内容版权所有,转载请注明出处及原文链接说明:1.web服务器线路:电信IP:192.168.21.129域名:www.osyunw

使用.NET访问 Internet(3) Paul

使用.NET访问 Internet(3) Paul_Ni(原作) 作者:中国资讯网 来源:zixuen.com 加入时间:2005-5-12 www.zixuen.com 使用 TCP 服务 TCPClient 类使用 TCP 从 Internet 资源请求数据.TcpClient 的方法和属性提取某个 Socket 实例的创建细节,该实例用于通过 TCP 请求和接收数据.由于到远程设备的连接表示为流,因此可以使用 .NET 框架流处理技术读取和写入数据.TCP 协议建立与远程终结点的连接,然后

Android简明开发教程二十一:访问Internet 绘制在线地图

在例子Android简明开发教程十七:Dialog 显示图像 中我们留了一个例子DrawMap()没有实现,这个例子显示在线地图,目前大部分地图服务器都是将地图以图片存储以提高响应速 度. 一般大小为256X256个像素.具体可以参见离线地图下载方法解析. 比如: URL http://www.mapdigit.com/guidebeemap/maptile.php?type=MICROSOFTMAP&x=7&y=4&z=14 显示: 下面的例子访问Internet下载地图图片,并

您可能需要与该网络的internet服务提供商(isp)签署协议才能获得访问 internet的权限解决

 今天开机网络连接出现感叹号,但网络连接正常,点了疑难解答,提示"您可能需要与该网络的 internet 服务提供商(isp)签署协议才能获得访问 internet 的权限", 经过研究问题解决,现把方法共享下: 解决方案: 开始---运行----regedit. 打开后 1. 找到注册表键值HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesNlaSvcParametersInternet 2. 双击HKEY_LOCAL_MACHINES