使用Terraform管理IPsec VPN网关典型实践
更新时间:2024-08-26
概览
IPsec VPN网关是一种通过公网加密通道连接您的IDC和私有网络的方式。

前提条件
- 您已经注册了百度智能云账号。如未注册,请先完成账号注册。
- 确保用户数据中心的网关设备支持IKEv1和IKEv2协议,支持这两种协议的本地网关设备均可以和云上VPN网关互连。
- 用户数据中心的网关设备已经配置了静态公网IP。
- 用户数据中心和VPC互通的网段没有重叠。
- 您已经了解VPC中的安全组规则,并确保安全组规则允许用户数据中心的网关设备访问云上资源。具体操作,请参见查询安全组规则和添加安全组规则。
需求场景
某公司在百度智能云创建了VPC,网段为172.16.0.0/16。用户数据中心的网段为10.24.0.0/20,用户数据中心网关设备的公网IP为211.XX.XX.XX。公司因业务发展,需要用户数据中心与云上VPC互通。您可以通过IPsec-VPN网关和隧道,建立用户数据中心与云上VPC的连接,实现云上和云下的互通。
方案概述
如下图所示,用户可以使用IPSec VPN网关建立用户数据中心和百度智能云VPN的连接。

配置步骤
环境准备
Terraform:是一种安全有效地构建、更改和版本控制基础设施的工具。它以配置文件为驱动,您在文件中定义各种组件,Terraform会基于该文件完成所有组件的创建、变更和管理。目前百度智能云已与 Terraform集成,您可通过Terraform来创建、管理CFC、BOS、VPC、BCC等多种百度智能云资源,具体请参考Terraform BaiduCloud Provider。
部署过程
- 登录Terraform官网下载适用于您的操作系统的程序包。
- 配置terraform baidu provider信息,配置文件可参考如下的代码,在当前文件夹内保存为version.tf。
                Plain Text
                
            
            1    terraform {
2      required_providers {
3        baiducloud = {
4          source = "baidubce/baiducloud"
5          version = "1.15.6" #版本号 可去官网查询版本更新信息
6        }
7      }
8    }- 执行命令terraform init,Terraform会根据当前文件夹内的version.tf文件初始化工作空间。
- 编辑Terraform配置文件。新建文件main.tf,在文件中指定VPC、子网、EIP、安全组、VPN网关、IPSec隧道、路由表的元信息。参考配置和步骤如下:
更多参数信息可参考baidu provider官方文档
- 创建VPC
                Plain Text
                
            
            1resource "baiducloud_vpc" "vpc" {
2  name = "terraform_vpc"
3  cidr = "172.16.0.0/16"
4}- 创建子网并对应一个可用区 本示例使用的是华北-北京-可用区D
                Plain Text
                
            
            1resource "baiducloud_subnet" "subnet" {
2  name        = "terraform_subnet"
3  zone_name   = "cn-bj-d" 
4  cidr        = "172.16.32.0/20"
5  vpc_id      = baiducloud_vpc.vpc.id
6  description = "terraform test subnet"
7}- 创建EIP
                Plain Text
                
            
            1resource "baiducloud_eip" "eip" {
2  # EIP带宽
3  bandwidth_in_mbps = 1
4  billing_method    = "ByBandwidth"
5  payment_timing    = "Postpaid"
6}- 创建安全组
                Plain Text
                
            
            1resource "baiducloud_security_group" "sg" {
2  name        = "terraform-sg"
3  description = "security group created by terraform"
4  vpc_id      = baiducloud_vpc.vpc.id
5}- 创建安全组规则
                Plain Text
                
            
            1#这里是允许入方向的ICMP协议 本示例只进行ping测试 可根据实际情况开放端口和协议
2resource "baiducloud_security_group_rule" "sgr1_in" {
3  security_group_id = baiducloud_security_group.sg.id
4  remark            = "remark"
5  protocol          = "icmp"
6  port_range        = ""
7  direction         = "ingress"
8  source_ip         = "all"
9}
10# 出方向的ICMP协议开放
11resource "baiducloud_security_group_rule" "sgr1_out" {
12  security_group_id = baiducloud_security_group.sg.id
13  remark            = "remark"
14  protocol          = "icmp"
15  port_range        = ""
16  direction         = "egress"
17  source_ip         = "all"
18}- 创建VPN网关
                Plain Text
                
            
            1resource "baiducloud_vpn_gateway" "vpn_gateway" {
2  # 等待EIP创建完成再创建VPN网关
3  depends_on     = [baiducloud_eip.eip]
4  vpn_name       = "test_vpn_gateway"
5  vpc_id         = baiducloud_vpc.vpc.id
6  description    = "test desc"
7  # 付费方式Prepaid预付费 Postpaid后付费
8  payment_timing = "Postpaid"
9  # 绑定弹性公网IP
10  eip            = baiducloud_eip.eip.eip
11}- 创建IPSec隧道
                Plain Text
                
            
            1resource "baiducloud_vpn_conn" "vpn_conn" {
2  vpn_id        = baiducloud_vpn_gateway.vpn_gateway.id
3  # 共享密钥是用于验证IPsec连接的Unicode字符串,本端和对端必须使用相同的预共享密钥
4  secret_key    = "ddd22@www"
5  # 本端IP 百度智能云VPC中需要进入VPN隧道的子网 本示例填入创建的子网的IP地址
6  local_subnets = [
7    baiducloud_subnet.subnet.cidr
8  ]
9  # 对端网关是指用户数据中心的 IPsec VPN 服务网关 对端网关需与百度智能云VPN网关配合使用。
10  remote_ip      = "211.xx.xx.xx"
11  # 对端需要通过VPN隧道连通的网段
12  remote_subnets = [
13    "10.24.0.0/20"
14  ]
15  description   = "test VPN conn"
16  vpn_conn_name = "vpnconn"
17  ike_config    = {
18    # 选择IKE协议的版本,目前支持IKE V1和IKE V2
19    ike_version   = "v1"
20    # 选择IKE V1版本的协商模式。
21    # 主模式(main):协商过程安全性高。
22    # 野蛮模式(aggressive):协商快速且协商成功率高。
23    # 协商成功后两种模式的信息传输安全性相同。
24    ike_mode      = "main"
25    # 选择第一阶段协商使用的加密算法 支持aes、aes192、aes256和3des
26    ike_enc_alg   = "aes"
27    # 第一阶段协商使用的认证算法 支持sha1、md5、sha2_256、sha2_384和sha2_512
28    ike_auth_alg  = "sha1"
29    # 选择第一阶段协商的Diffie-Hellman密钥交换算法
30    ike_pfs       = "group2"
31    # 设置第一阶段协商出的SA的生存周期 默认值为28800秒
32    ike_life_time = 28800
33  }
34  ipsec_config = {
35    # 选择第二阶段协商的加密算法 支持aes、aes192、aes256和3des
36    ipsec_enc_alg   = "aes"
37    # 选择第二阶段协商的认证算法 支持sha1、md5、sha2_256、sha2_384和sha2_512 
38    ipsec_auth_alg  = "sha1"
39    # 选择第二阶段协商的Diffie-Hellman密钥交换算法
40    ipsec_pfs       = "group2"
41    # 设置第二阶段协商出的SA的生存周期。默认值为28800秒
42    ipsec_life_time = 28800
43  }
44}- 创建路由表
                Plain Text
                
            
            1resource "baiducloud_route_rule" "route_rule" {
2  route_table_id      = baiducloud_vpc.vpc.route_table_id
3  # 源IP地址 本示例中为用户创建的子网的IP地址
4  source_address      = baiducloud_subnet.subnet.cidr
5  # 目的IP地址 本示例中为用户数据中心的IP地址
6  destination_address = "10.24.0.0/20"
7  # 下一跳实例
8  next_hop_id         = baiducloud_vpn_gateway.vpn_gateway.id
9  # 下一跳类型 本示例中应该为VPN
10  next_hop_type       = "vpn"
11  description         = "created by terraform"
12}- 执行命令terraform plan,Terraform会根据当前配置文件中的信息列出资源变更计划。
- 执行命令terraform apply,根据提示输入yes,即自动执行资源创建。
查询VPN网关列表和IPSec隧道列表
                Plain Text
                
            
            1data "baiducloud_vpn_gateways" "default" {
2  # 此处填入VPC ID即可查询VPC下所有的网关列表及详细信息
3  vpc_id = "vpc-xxxxxxx"
4}
5data "baiducloud_vpn_conns" "default" {
6  # 此处填入VPN ID即可查询VPN关联的IPSec隧道的详细信息
7  vpn_id = "vpn-xxxxxxx"
8}可使用filter在结果中过滤资源,示例代码
                Plain Text
                
            
            1# 可使用正则表达式过滤 下面的代码块的效果是在结果中过滤name符合表达式 tf-test-VPN-* 的资源
2filter {
3   name = "name"
4   values = ["tf-test-VPN-*"]
5}资源更新
可修改main.tf文件中有关VPN网关和VPN隧道的配置参数,然后执行资源创建步骤5和步骤6即可完成资源的更新。
资源删除
可使用如下命令进行资源的删除:
                Plain Text
                
            
            1    #命令默认会释放当前main.tf中的所有资源
2    terraform destroy 
3    #可以通过 -target 选项销毁特定的资源,格式为:-target=<资源类型>.<资源名称>,例如:
4    terraform destroy -target baiducloud_vpn_gateway.test-vpn测试验证
在完成全部配置后,可通过下面的定义,通过Terraform在子网内创建一台BCC实例,去测试网络之间的连通性,确定安全组规则生效之后,可使用ping命令检测连通性:
-$ ping 10.24.x.x
                Plain Text
                
            
            1# BCC创建示例 具体规格参数可根据需要灵活配置
2data "baiducloud_images" "images" {
3  image_type = "System"
4  name_regex = "8.4 aarch"
5  os_name    = "CentOS"
6}
7resource "baiducloud_instance" "server1" {
8  # 可用区 本示例创建的是华北-北京-可用区D的子网 此处可用区应和子网保持一致
9  availability_zone = "cn-bj-d"
10  # BCC规格
11  instance_spec     = "bcc.gr1.c1m4"
12  # 镜像ID 使用的是CentOS 8.4 aarch镜像
13  image_id          = data.baiducloud_images.images.0.id
14  # 付费类型
15  billing           = {
16    payment_timing = "Postpaid"
17  }
18  # 子网ID 通过Terraform创建的子网
19  subnet_id       = baiducloud_subnet.subnet.id
20  # 安全组 通过Terraform创建的安全组
21  security_groups = [baiducloud_security_group.sg.id]
22}同时,用户数据中心内的设备应该也能够与VPC的实例连接。
至此,通过IPSec VPN的方式,成功实现用户数据中心连接到云平台内部的资源,实现了云上和云下的互通。
