阿里云VPC多可用区网络结构设计

网络架构综述

安全性是架构设计考虑的重点,所以必须要求所有的机器都放置在VPC当中,而且在VPC当中还需要将不同的部门的不同功能的机器(如应用机器,Web服务器,RDS)划分成不用的子网进行单独管理。

总原则:

  • 安全原则:所有的机器都必须放在在VPC当中,以部门和机器功能再细分子网,部门之间以及不同功能的服务器之间访问都是采取最小访问原则。
  • 可用原则:生产系统都采取多可用区部署,保证在出现整个机房故障的时候业务系统也能正常运行

VPC设计

在VPC设计上面所遵循的原则是一个区域一个VPC,而不是多个VPC存在于一个区域,目的是为了减少网络的复杂性,但是为了保证VPC内部的机器 还具有更灵活的安全管理,我们需要根据部门、服务器业务类型或者功能的不同在划分子网络进行管理,同时用安全组来保证每一类服务器都能拥有我们想要的安全 策略。

另外访问安全的角度来说,测试系统会开放较大的权限,也就是说开发人员需要有完全的测试系统的登录权限以方便系统开发,所以在设计上同一个区域至少会存在2个VPC,一个生产系统用,另外一个测试系统用。

考虑到各个区域可能在以后可能会有互通的需求,因此在VPC的CIDR设计上也要能区分开来,以保证互通之后不会出现IP地址冲突的情形,根据目前区域情况分配如下:

网络拓扑

+ - - - - - - - - -+             +- - - - - - - - - +
' Infra            '             ' Prod             '
'                  '             '                  '
' +--------------+ '             ' +--------------+ '
' | 10.25.0.0/16 | ' ----------> ' | 10.20.0.0/16 | '
' +--------------+ '             ' +--------------+ '
'                  '             '                  '
+ - - - - - - - - -+             +- - - - - - - - - +
    |                                ^
    |                                |
    |                                |
    v                                |
+ - - - - - - - - -+                 |
' NonProd          '                 |
'                  '                 |
' +--------------+ '       Deny      |
' | 10.21.0.0/16 | ' <---------------+
' +--------------+ '
'                  '
+ - - - - - - - - -+

阿里云

  • 10.20.0.0/16 生产系统, 生产环境相关的服务部署网段
  • 10.21.0.0/16 非生产系统, 开发、测试相关服务部署网段
  • 10.25.0.0/16 基础设施, 运维基础服务部署网段

VPC 可用区

考虑北京早期的可用区机房比较老可选择的主机类型不多,所以选取H、G、F三个可用区, 多可用区的设计是为了防止 阿里云单独可用区故障时其它可用区的主机可以正常的对外提供服务

+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
' DMZ                                                          '
'                                                              '
' +------------------++------------------++------------------+ '
' | dmz-cn-beijing-h || dmz-cn-beijing-g || dmz-cn-beijing-f | '
' +------------------++------------------++------------------+ '
'                                                              '
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
                                            |
                                            |
                                            |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
' Applicaiton                                                  '
'                                                              '
' +------------------++------------------++------------------+ '
' | app-cn-beijing-h || app-cn-beijing-g || app-cn-beijing-f | '
' +------------------++------------------++------------------+ '
'                                                              '
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
                                            |
                                            |
                                            |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
' Database                                                     '
'                                                              '
' +------------------++------------------++------------------+ '
' | db-cn-beijing-g  || db-cn-beijing-h  || db-cn-beijing-f  | '
' +------------------++------------------++------------------+ '
'                                                              '
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+

+-----+     +-------------+     +----------+
| DMZ | --> | Application | --> | Database |
+-----+     +-------------+     +----------+
  • DMZ类:DMZ区放置的是所有需要直接对外提供服务的机器,也就是说需要直接分配外部IP的,另外诸如NAT、VPN等机器划分到另外一个功能的DMZ区。
  • 部门业务类:每个业务部门都按照Application、database功能来划分子网,同一部门的子网之间权限限制更宽松,部门之间的访问遵循最小访问原则。
  • 公共业务类:对于运维部署的运维监控等公共服务的机器单独划分不同的VPC。

子网CIDR分配方案

使用部门+功能来进行子网划分会导致子网的数据变得很庞大,所以在确定子网CIDR的时候要确保有足够的子网的数量。

  • 使用10.20.0.0/20作为子网CIDR
  • 总子网数量2^(20-16)=128
  • 每个子网可用的IP数量2^(32-20)-2=4094

详细设计

VPC内机器访问模式及应对方法

部门内部分层访问

访问情景:

+ - - - - - -+     +- - - - - - - - - - - - - - - - - - - - - - - -+
' Internet   '     ' Aliyun                                        '
'            '     '                                               '
' +--------+ '     ' +----------+     +---------+     +----------+ '
' |  user  | ' --> ' | Frontend | --> | Backend | --> | Database | '
' +--------+ '     ' +----------+     +---------+     +----------+ '
'            '     '                                               '
+ - - - - - -+     +- - - - - - - - - - - - - - - - - - - - - - - -+
  • 同部门前端对于后端的访问
  • 同部门后端对于数据库的访问

应对方案:

  • 子网内部自由访问
  • 同部门子网之间只开放必要的端口

部门之间访问

访问情景:

+-------------+  API Access         +-------------+
| departmentA |  Database Access    | departmentB |
|             | <-----------------> |             |
+-------------+                     +-------------+
  • 存在数据库被别的部门调用的情况
  • 部门之间API调用的情况

应对方案:

  • 在实践当中推广部门之间走API访问而不是直接做数据库调用
  • 部门之间的API调用通过防火墙限定访问源和目的,防止滥用的情况发生

运维部门管理机器访问

访问情景:

  • 运维人员登录机器进行系统安装配置等操作
  • 部分开发人员自己维护的机器需要分配给开发人员登录的权限

应对方案:

  1. 通过堡垒机做跳板再登录相应的机器进行访问
  2. 通过连接VPN之后再登录相应的机器进行访问

对外提供服务访问

访问情景:对外提供的Web服务,对外提供的API服务。

+ - - - - - -+        + - - - - - - - - - - - - - - -+
' Internet   '        ' Aliyun                       '
'            '        '                              '
' +--------+ '  Api   ' +------+     +-------------+ '
' |  User  | '  Web   ' | SLB  |     | Real Server | '
' |        | ' -----> ' |      | --> |             | '
' +--------+ '        ' +------+     +-------------+ '
'            '        '                              '
+ - - - - - -+        + - - - - - - - - - - - - - - -+

应对方案:所有对外的服务原则上都是使用SLB来提供服务,而不是单独分配外部IP出网,这样提供服务的服务器将不需要放置在DMZ,而是放在私网区,可以加强保障;另外SLB的使用可以很方便的扩展或者迁移提供服务的服务器,提高整个系统的可用性和安全性。

对内提供服务访问

访问情景:

              VPN
             ----->

+ - - - - -+        + - - - - - - - - - - - - - - -+
' Office   '        ' Aliyun                       '
'          '        '                              '
' +------+ '  Api   ' +------+     +-------------+ '
' | User | '  Web   ' | SLB  |     | Real Server | '
' |      | ' -----> ' |      | --> |             | '
' +------+ '        ' +------+     +-------------+ '
'          '        '                              '
+ - - - - -+        + - - - - - - - - - - - - - - -+
  • 供公司员工使用的部署在VPC内部的管理系统
  • Jenkins、gitlab、监控等系统的内部访问

应对方案:需要使用相应服务的人员在登录VPN之后可以自由的访问到相应的系统,原则上开发给公司内部人员的系统也是要使用最小访问原则:只开放哪些需要开放的IP及端口。

使用terraform初始化

目录结构

.
├── infra.tf
├── non-prod.tf
├── prod.tf
└── provider.tf

0 directories, 7 files

provider.tf

provider "alicloud" {
  access_key = ""
  secret_key = ""
  region     = "cn-beijing"
}

prod.tf

这部分是生成生产环境的terraform脚本,Nonprod和Infra按照下面的脚本修改对应的信息即可

resource "alicloud_vpc" "prod_vpc" {
  name        = "生产"
  cidr_block  = "10.20.0.0/16"
  description = "VPC for production environment"
}

resource "alicloud_vswitch" "vsw_prod_dmz_f" {
  name              = "生产-DMZ-F"
  vpc_id            = "${alicloud_vpc.prod_vpc.id}"
  cidr_block        = "10.20.0.0/20"
  availability_zone = "cn-beijing-f"
}

resource "alicloud_vswitch" "vsw_prod_dmz_g" {
  name              = "生产-DMZ-G"
  vpc_id            = "${alicloud_vpc.prod_vpc.id}"
  cidr_block        = "10.20.16.0/20"
  availability_zone = "cn-beijing-g"
}

resource "alicloud_vswitch" "vsw_prod_dmz_h" {
  name              = "生产-DMZ-H"
  vpc_id            = "${alicloud_vpc.prod_vpc.id}"
  cidr_block        = "10.20.32.0/20"
  availability_zone = "cn-beijing-h"
}

resource "alicloud_vswitch" "vsw_prod_application_f" {
  name              = "生产-应用-F"
  vpc_id            = "${alicloud_vpc.prod_vpc.id}"
  cidr_block        = "10.20.48.0/20"
  availability_zone = "cn-beijing-f"
}

resource "alicloud_vswitch" "vsw_prod_application_g" {
  name              = "生产-应用-G"
  vpc_id            = "${alicloud_vpc.prod_vpc.id}"
  cidr_block        = "10.20.64.0/20"
  availability_zone = "cn-beijing-g"
}

resource "alicloud_vswitch" "vsw_prod_application_h" {
  name              = "生产-应用-H"
  vpc_id            = "${alicloud_vpc.prod_vpc.id}"
  cidr_block        = "10.20.80.0/20"
  availability_zone = "cn-beijing-h"
}

resource "alicloud_vswitch" "vsw_prod_database_f" {
  name              = "生产-数据库-F"
  vpc_id            = "${alicloud_vpc.prod_vpc.id}"
  cidr_block        = "10.20.96.0/20"
  availability_zone = "cn-beijing-f"
}

resource "alicloud_vswitch" "vsw_prod_database_g" {
  name              = "生产-数据库-G"
  vpc_id            = "${alicloud_vpc.prod_vpc.id}"
  cidr_block        = "10.20.112.0/20"
  availability_zone = "cn-beijing-g"
}

resource "alicloud_vswitch" "vsw_prod_database_h" {
  name              = "生产-数据库-H"
  vpc_id            = "${alicloud_vpc.prod_vpc.id}"
  cidr_block        = "10.20.128.0/20"
  availability_zone = "cn-beijing-h"
}

resource "alicloud_nat_gateway" "prod_nat_gateway" {
  vpc_id        = "${alicloud_vpc.prod_vpc.id}"
  specification = "Small"
  name          = "生产-NAT"

  # bandwidth_packages = [
  # {
  #   ip_count = 1
  #   bandwidth = 5
  #   # internet_charge_type = "PayByTraffic"
  # }
  # ]
  depends_on = [
    "alicloud_vswitch.vsw_prod_dmz_f",
    "alicloud_vswitch.vsw_prod_dmz_g",
    "alicloud_vswitch.vsw_prod_dmz_h",
    "alicloud_vswitch.vsw_prod_application_f",
    "alicloud_vswitch.vsw_prod_application_g",
    "alicloud_vswitch.vsw_prod_application_h",
    "alicloud_vswitch.vsw_prod_database_f",
    "alicloud_vswitch.vsw_prod_database_g",
    "alicloud_vswitch.vsw_prod_database_h",
 ]
}

resource "alicloud_hip" "prod_nat" {
  bandwidth = 30
}

resource "alicloud_hip" "prod_host_gcal-tnkt" {
  bandwidth =5
}

resource "alicloud_hip_association" "prod_nat" {
  allocation_id = "${alicloud_hip.prod_nat.id}"
  instance_id   = "${alicloudHnat_gateway.prod_nat_gateway.id}"
}

resource "alicloud_hip_association" "prod_host_gcal-tnkt" {
  allocation_id = "${alicloud_hip.prod_host_gcal-tnkt.id}"
  instance_id   = "${alicloudHinstance.gcal-tnkt.id}"
}

resource "alicloud_snat_hntry" "snat_prod_application_f" {
  snat_table_id     = "${alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
  source_vswitch_id = "${alicloud_vswitch.vsw_prod_application_f.id}"
  snat_ip           = "${alicloud_hip.prod_nat.ip_address}"

resource "alicloud_snat_hntry" "snat_prod_application_g" {
  snat_table_id     = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
  source_vswitch_id = "${alicloud_vswitch.vsw_prod_application_g.id}"
  snat_ip           = "${alicloud_hip.prod_nat.ip_address}"

resource "alicloud_snat_hntry" "snat_prod_application_h" {
  snat_table_id     = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
  source_vswitch_id = "${alicloud_vswitch.vsw_prod_application_h.id}"
  snat_ip           = "${alicloud_hip.prod_nat.ip_addressH"

resource "alicloud_snat_hntry" "snat_prod_database_f" {
  snat_table_id     = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
  source_vswitch_id = "${alicloud_vswitch.vsw_prod_database_f.id}"
  snat_ip           = "${alicloud_hip.prod_nat.ip_address}"

resource "alicloud_snat_hntry" "snat_prod_database_g" {
  snat_table_id     = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
  source_vswitch_id = "${alicloud_vswitch.vsw_prod_database_g.id}"
  snat_ip           = "${alicloud_hip.prod_nat.ip_address}"

resource "alicloud_snat_hntry" "snat_prod_database_h" {
  snat_table_id     = "H{alicloud_nat_gateway.prodnat_gateway.snat_table_ids}"
  source_vswitch_id = "${alicloud_vswitch.vsw_prod_database_h.id}"
  snat_ip           = "${alicloud_hip.prod_nat.ip_address}"

resource "alicloud_snat_hntry" "snat_prod_dmz_f" {
  snat_table_id     = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
  source_vswitch_id = "${alicloud_vswitch.vsw_prod_dmz_f.id}"
  snat_ip           = "${alicloud_hip.prod_nat.ip_address}"

resource "alicloud_snat_hntry" "snat_prod_dmz_g" {
  snat_table_id     = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
  source_vswitch_id = "${alicloud_vswitch.vsw_prod_dmz_g.id}"
  snat_ip           = "${alicloud_hip.prod_nat.ip_address}"

resource "alicloud_snat_hntry" "snat_prod_dmz_h" {
  snat_table_id     = "H{alicloud_nat_gateway.prodnat_gateway.snat_table_ids}"
  source_vswitch_id = "${alicloud_vswitch.vsw_prod_dmz_h.id}"
  snat_ip           = "${alicloud_hip.prod_nat.ip_address}"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容