全部产品
Search
文档中心

VPN网关:传统型VPN网关入门

更新时间:Mar 18, 2026

可使用开源的 strongSwan 软件,快速地与阿里云传统型 VPN 网关建立 IPsec-VPN 连接,实现云上云下私网互通。

场景说明

某公司在华东1(杭州)地域创建了 VPC,现需通过传统型 VPN 网关对接 strongSwan,实现云上 VPC 与本地 IDC 的网络互通。

本场景中,IDC 侧仅有一个公网出口 IP,与阿里云 VPN 网关建立双隧道模式的 IPsec 连接:

image

资源规划

  • 云上:VPC 网段 10.0.0.0/16,地域为华东1(杭州)

    • 交换机 1:可用区 I,网段 10.0.0.0/24

    • 交换机 2:可用区 J,网段 10.0.1.0/24

    • ECS 实例:位于交换机 1,IP 地址 10.0.0.1

    • VPN 网关:创建后系统自动分配 2 个公网地址:

      • IPsec 地址 1(用于主隧道):XX.XX.1.1

      • IPsec 地址 2(用于备隧道):XX.XX.2.2

  • 云下:本地 IDC 网段 172.16.0.0/16

    • strongSwan 设备:私网 IP 172.16.0.1

    • 公网出口 IP:XX.XX.3.3

  • 加密算法:使用控制台默认值(AES128 / SHA1 / DH Group 2)。云上与云下的加密算法、认证算法和 DH 分组需保持一致。

  • 路由方式:使用静态路由-感兴趣流模式。感兴趣流模式指定"哪些流量需要走 VPN 隧道"——您只需定义两端的网段,匹配这两个网段之间的流量即为"感兴趣流"。系统会自动将其通过隧道传输,并生成对应路由。

重要

本文仅描述单公网出口且使用静态路由的场景。针对双公网出口或BGP动态路由场景,详见strongSwan配置示例

前提条件

  • 云上 VPC 网段与云下 IDC 网段不能冲突。

  • 已按照资源规划创建 VPC,并在两个不同可用区各创建了一个交换机。VPC 内至少有一台 ECS 实例用于验证连通性。

  • 本地 IDC 已部署一台 Linux 服务器(本文以 CentOS Stream 9 为例),具备 1 个公网出口,后续将在该服务器上安装 strongSwan 作为本地网关。

第一步:创建传统型 VPN 网关

  1. 前往控制台 VPN网关页面,单击创建VPN网关,配置以下关键参数:

    • 实例名称:建议输入有意义的实例名称,例如 vpn-gw-docdev

    • 地域和可用区:选择 VPC 所在地域,本文选择华东1(杭州)

    • 网关类型:选择普通型

    • 网络类型:选择公网

    • VPC:选择要连通的目标 VPC。

    • 虚拟交换机1:选择可用区 I 的交换机。

    • 虚拟交换机2:选择可用区 J 的交换机。与虚拟交换机1分属不同可用区,以确保跨可用区高可用。若无交换机可选,请先创建。

    • 带宽规格:根据业务需求选择带宽,本文使用默认值。

    • IPsec-VPN开启

    • SSL-VPN关闭

    • 计费周期:使用默认值。

    • 关联角色创建:确保创建服务关联角色,VPN 网关使用此角色来访问其他云产品中的资源。

  2. 单击立即购买并完成支付。VPN 网关实例初始化约需 1~5 分钟。系统会为 VPN 网关分配两个公网 IP 地址,分别用于建立主隧道和备隧道。

第二步:创建用户网关

用户网关用于将本地网关设备的公网 IP 记录到阿里云。本场景中 IDC 只有 1 个公网出口,因此只需创建 1 个用户网关。

  1. 在 VPN 网关控制台左侧导航栏,单击用户网关

  2. 单击创建用户网关,配置:

    • 名称:输入用户网关名称,例如 cgw-idc-docdev

    • IP地址:输入本地 IDC 的公网出口 IP(XX.XX.3.3)。

第三步:创建 IPsec 连接

  1. 在 VPN 网关控制台左侧导航栏,单击IPsec连接,然后单击绑定VPN网关

  2. 配置 IPsec 连接基本参数:

    • IPsec连接名称:填写有意义的资源名称,例如 ipsec-docdev

    • 地域:选择华东1(杭州)

    • 绑定VPN网关:选择第一步创建的 VPN 网关。

    • 路由模式:选择目的路由模式。此模式需定义两端网段,系统自动将匹配流量通过隧道传输并生成路由。

    • 本端网段:输入 VPC 网段 10.0.0.0/16

    • 对端网段:输入 IDC 网段 172.16.0.0/16

    • 立即生效:选择,阿里云侧会主动和对端发起协商,后续对端配置完成后可以快速建立连接。

    • 启用BGP:本文不启用。

  3. 配置隧道参数:

    • 隧道 1(主)

      • 用户网关:选择第二步创建的用户网关。

      • 预共享密钥:IPsec 隧道协商时用于身份认证的共享密钥。本端与对端配置的预共享密钥必须一致,否则隧道无法正常建立。建议使用高强度密码,包含大小写字母、数字和特殊字符。

      • 加密配置:保持默认即可。本文使用默认的加密算法(AES128)、认证算法(SHA1)和 DH 分组(group2)。

    • 隧道 2(备)

      • 用户网关:选择与主隧道相同的用户网关(本场景 IDC 只有 1 个公网出口)。

      • 预共享密钥:本文使用与主隧道相同的密钥。

      • 加密配置:与主隧道保持一致,保持默认。

  4. 单击确定后,系统会提示是否去发布路由,先单击取消

    IPsec 连接资源初始化约需 5 分钟(状态为准备中),此时还无法配置路由。您可以先进行第四步配置 strongSwan 设备,路由配置将在第五步完成。
  5. 记录云上 2 条隧道的公网 IP,后续配置 strongSwan 时需使用:

    • 回到IPsec连接列表页,找到刚刚创建的 IPsec 连接。

    • 网关IP列,记录 IPsec 地址 1 和 IPsec 地址 2。本文以 XX.XX.1.1 和 XX.XX.2.2 为例。

第四步:配置 strongSwan 设备

重要

以下内容包含的第三方产品信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

下面以 CentOS Stream 9 64位操作系统为例配置 strongSwan,其他操作系统请参考 strongSwan 官方文档

1. 放通防火墙策略

在 strongSwan 设备上放通 ESP 协议(IP 协议号 50)UDP 500 端口UDP 4500 端口,允许云上的 2 个 IPsec 地址访问。

以 iptables 为例,请根据实际使用的防火墙工具调整命令:

iptables -I INPUT -s XX.XX.1.1,XX.XX.2.2 -p esp -j ACCEPT
iptables -I INPUT -s XX.XX.1.1,XX.XX.2.2 -p udp --dport 500 -j ACCEPT
iptables -I INPUT -s XX.XX.1.1,XX.XX.2.2 -p udp --dport 4500 -j ACCEPT

2. 开启路由转发

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sudo sysctl -p

3. 安装 strongSwan

dnf install epel-release -y
dnf install strongswan -y

4. 配置 strongSwan

  1. 备份原始配置文件:mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak

  2. 新建配置文件:vi /etc/strongswan/swanctl/swanctl.conf

  3. 添加并保存以下配置。请将示例中的 IP 地址和预共享密钥替换为您的实际地址:

    # strongSwan 双隧道 IPsec-VPN 配置,适用于:阿里云传统型VPN网关+本地公网单出口+感兴趣流
    #
    # 只有带"请修改"标记的参数需要根据实际环境修改,其余参数保持默认即可。
    # 算法说明:aes128-sha1-modp1024 = AES-128 / SHA-1 / DH Group 2(控制台默认值)
    # 主备逻辑:vco1 (priority=1) 为主隧道,vco2 (priority=2) 为备隧道,主隧道故障时自动切换。
    
    connections {
    
       # === 隧道1(主) ===
       vco1 {
          version = 2
          dpd_delay = 10
          rekey_time = 84600
          over_time = 1800
          proposals = aes128-sha1-modp1024
          encap = yes
    
          local_addrs  = 172.16.0.1                # strongSwan本机网卡IP(请修改:NAT环境填私网IP;网卡直接绑公网出口IP则填公网IP)
          local {
             auth = psk
             id = XX.XX.3.3                        # 本地侧公网出口IP(请修改)
          }
    
          remote_addrs = XX.XX.1.1                 # 阿里云侧隧道1的公网IP(请修改)
          remote {
             auth = psk
             id = XX.XX.1.1                        # 阿里云侧隧道1的公网IP,与上方 remote_addrs 一致(请修改)
          }
    
          children {
             vco_child1 {
                local_ts  = 172.16.0.0/16          # 本地侧感兴趣流网段(请修改)
                remote_ts = 10.0.0.0/16            # 阿里云侧感兴趣流网段(请修改)
                mode = tunnel
                rekey_time = 85500
                life_time = 86400
                dpd_action = restart
                start_action = start
                close_action = start
                esp_proposals = aes128-sha1-modp1024
                priority = 1                       # 指定为主隧道,不建议修改
             }
          }
       }
    
       # === 隧道2(备) ===
       vco2 {
          version = 2
          dpd_delay = 10
          rekey_time = 84600
          over_time = 1800
          proposals = aes128-sha1-modp1024
          encap = yes
    
          local_addrs  = 172.16.0.1                # strongSwan本机网卡IP,与隧道1的local_addrs相同(请修改)
          local {
             auth = psk
             id = XX.XX.3.3                        # 本地侧公网出口IP,与隧道1相同(请修改)
          }
    
          remote_addrs = XX.XX.2.2                 # 阿里云侧隧道2的公网IP(请修改)
          remote {
             auth = psk
             id = XX.XX.2.2                        # 阿里云侧隧道2的公网IP,与上方 remote_addrs 一致(请修改)
          }
    
          children {
             vco_child2 {
                local_ts  = 172.16.0.0/16          # 本地侧感兴趣流网段,与隧道1的local_ts相同(请修改)
                remote_ts = 10.0.0.0/16            # 阿里云侧感兴趣流网段,与隧道1的remote_ts相同(请修改)
                mode = tunnel
                rekey_time = 85500
                life_time = 86400
                dpd_action = restart
                start_action = start
                close_action = start
                esp_proposals = aes128-sha1-modp1024
                priority = 2                       # 指定为备隧道,不建议修改
             }
          }
       }
    }
    
    secrets {
       ike-vco1 {
          id = XX.XX.1.1                           # 阿里云侧隧道1的公网IP(请修改)
          secret = your-psk-here                   # 隧道1的预共享密钥,需与阿里云侧一致(请修改)
       }
       ike-vco2 {
          id = XX.XX.2.2                           # 阿里云侧隧道2的公网IP(请修改)
          secret = your-psk-here                   # 隧道2的预共享密钥,需与阿里云侧一致(请修改)
       }
    }

5. 启动并确认隧道状态

sudo systemctl restart strongswan
swanctl --load-all
watch swanctl --list-sas

如果两条隧道均显示 ESTABLISHED 且 CHILD_SA 为 INSTALLED 状态,则表示 strongSwan 设备和阿里云 VPN 网关之间已成功建立 IPsec-VPN 连接。

第五步:配置云上路由

因本文使用感兴趣流模式,系统会自动在 VPN 网关策略路由表中生成路由条目。

您可将此路由一键发布到 VPC 路由表,使 VPC 内 ECS 实例访问 IDC 网段的流量路由到 VPN 网关:

  1. 回到 VPN 网关列表页,单击第一步创建的 VPN 网关的实例 ID,进入详情页。

  2. 切换到策略路由表页签,您可以看到 IPsec 连接使用感兴趣流模式后,系统已自动生成的目的路由条目(目标网段 172.16.0.0/16,下一跳为 IPsec 连接)。

  3. 在目标路由条目的操作列,单击发布,将路由发布到 VPC 路由表。

    发布路由后,VPC 路由表中会新增一条目标网段为 172.16.0.0/16、下一跳为 VPN 网关的路由,VPC 内的 ECS 访问 IDC 网段的流量将自动通过 VPN 隧道传输。

验证测试

验证连通性

  1. 先确保 ECS 的安全组规则已放通ICMP协议,再登录 strongSwan 设备,执行以下命令 ping 云上 ECS:

    ping 10.0.0.1

    若能收到回复报文,说明云上 VPC 和云下 IDC 之间已成功互通。

  2. 先确保本地防火墙已放通 ICMP 协议,再登录 VPC 中的 ECS 实例(10.0.0.1),ping strongSwan 设备的内网地址:

    ping 172.16.0.1

    若能收到回复报文,说明反向连通也正常。

验证高可用

  1. 保持 ECS 持续 ping IDC 服务器:

    ping 172.16.0.1 -c 10000
  2. 中断主隧道:在阿里云控制台修改 IPsec 连接主隧道的预共享密钥(使两端密钥不一致),主隧道将中断。

  3. 观察 ping 结果:流量在短暂中断后重新恢复通信,说明流量已自动切换到备隧道。

  4. 恢复主隧道:将主隧道的预共享密钥改回正确值,主隧道恢复后流量将自动切回。

故障排查

常见问题与解决方案:

问题现象

可能原因

解决方案

控制台隧道状态显示协商失败

网络不通

检查 strongSwan 设备能否 ping 通阿里云的 IPsec 地址;确认本地 IDC 的防火墙已放通 UDP 500/4500 端口。

预共享密钥不匹配

核对两端的预共享密钥是否完全一致(包括大小写和特殊字符)。

IKE 参数不一致

检查 IKE 版本、加密算法、认证算法、DH 分组等参数是否在两端匹配。传统型 VPN 网关不支持多算法兼容,两端参数必须完全一致。

隧道已建立但无法 ping 通

路由未配置

检查 VPC 路由表中是否已发布 VPN 网关的目的路由。

安全组限制

检查 ECS 安全组是否允许来自 IDC 网段(172.16.0.0/16)的 ICMP 流量。

本地防火墙限制

检查 IDC 防火墙是否允许来自 VPC 网段(10.0.0.0/16)的流量。

strongSwan 侧路由缺失

确认 strongSwan 设备已开启 IP 转发,且 IDC 内其他服务器配置了到 VPC 网段的路由(下一跳为 strongSwan 设备)。