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