全部产品
Search
文档中心

VPN网关:绑定转发路由器入门

更新时间:Mar 19, 2026

可使用开源的 strongSwan 软件,快速地与阿里云建立 IPsec-VPN 连接(IPsec 连接绑定转发路由器),实现云上 VPC 与本地 IDC 的网络互通。

场景说明

某公司在华东1(杭州)地域创建了 VPC,现需通过 IPsec-VPN 将本地 IDC 与云上 VPC 网络互通。与直接绑定 VPN 网关不同,本场景中 IPsec 连接绑定转发路由器——通过云企业网(CEN)的转发路由器统一管理云上网络,后续可灵活扩展更多 VPC 或跨地域互通。

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

image

资源规划

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

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

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

    • ECS 实例:位于交换机中,IP 地址 10.0.0.1(用于验证连通性)

    • CEN 实例:用于承载转发路由器

    • 转发路由器:在华东1(杭州)地域创建,TR 地址段 10.10.10.0/24(不可与 VPC / IDC 网段冲突)

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

    • strongSwan 设备:私网 IP 172.16.0.1

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

  • 加密算法:IKEv2 / AES-128-CBC / SHA-1 / DH Group 2。隧道两端需配置相同的加密参数。

  • 路由方式:使用目的路由模式(Destination Routing)。通过在转发路由器路由表中添加静态路由,将去往 IDC 网段的流量指向 VPN 连接。

前提条件

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

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

  • 已创建 CEN 和 TR,并且:

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

第一步:创建用户网关

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

  1. 前往 VPN网关页面, 在左侧导航栏单击用户网关

  2. 在顶部菜单栏选择华东1(杭州)地域。

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

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

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

第二步:创建 IPsec 连接

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

  2. 单击绑定云企业网,配置 IPsec 连接基本参数:

    • IPsec连接名称:填写资源名称,例如 ipsec-demo。

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

    • 网关类型:选择公网

    • 绑定云企业网:选择本账号绑定

    • 绑定资源:选择转发路由器

    • 云企业网实例ID:选择前提条件中已经创建的云企业网CEN实例。

    • 路由模式:选择目的路由模式,后续通过在转发路由器路由表中添加静态路由来控制流量转发。

    • 立即生效:选择是,配置完成后立即进行协商,阿里云侧会主动向对端发起协商。

    • 高级配置(包含自动关联路由表、配置转发路由等配置):全部勾选,包括自动发布路由自动关联至转发路由器的默认路由表自动传播系统路由至转发路由器的默认路由表

  3. 配置隧道参数:

    • 隧道 1(主)

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

      • 预共享密钥:两端约定好的密码,用于建立隧道时互相验证身份。建议使用复杂密码,云上云下填写必须完全一致。

    • 隧道 2(备)

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

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

        加密配置中的其余参数保持默认值即可。如需手动指定算法,可展开加密配置进行修改。
  4. 单击确定。创建成功后系统提示是否去发布路由,先单击取消

    IPsec 连接资源初始化约需 5 分钟(状态为准备中),此时还无法配置路由。您可以先记录云上公网IP地址,后续再前往第三步配置路由。
  5. 记录云上 2 条隧道的公网 IP,后续配置 strongSwan 时需使用:

    回到IPsec连接列表页,找到刚创建的 IPsec 连接。在网关IP列,记录IPsec地址1:IPsec地址2:。本文以 XX.XX.1.1 和 XX.XX.2.2 为例。

第三步:TR添加静态路由

由于使用目的路由模式,需手动在TR路由表中添加去往 IDC 网段的路由。

  1. 前往云企业网控制台,单击云企业网实例 ID。

  2. 转发路由器页签中,找到华东1(杭州)的转发路由器,单击其 ID 进入详情页。

  3. 切换到转发路由器路由表页签,界面默认展示系统路由表。

  4. 在系统路由表的路由条目页签,单击创建路由条目

    • 目的地址CIDR:输入 IDC 网段 172.16.0.0/16。

    • 是否为黑洞路由:选择

    • 下一跳连接:选择 VPN 连接对应的网络实例连接(IPsec 连接绑定转发路由器后自动创建的连接)。

  5. 单击确定

    添加完成后,在路由表中可看到一条静态路由:目标网段 172.16.0.0/16,下一跳为 VPN 连接。

    此路由的作用是:将转发路由器收到的去往 IDC 网段的流量,转发到 IPsec 隧道中。VPC 侧的路由已通过TR的路由同步功能自动配置,无需手动配置。

第四步:配置 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

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

4. 创建 XFRM 隧道接口和 updown 脚本

由于双隧道场景下需要区分每条隧道的流量,需要创建 XFRM 虚拟接口来避免内核路由策略冲突。

# 创建 XFRM 隧道接口(分别对应隧道 1 和隧道 2)
sudo ip link add xfrm1 type xfrm dev eth0 if_id 1
sudo ip link add xfrm2 type xfrm dev eth0 if_id 2
sudo ip link set xfrm1 up
sudo ip link set xfrm2 up

# 添加 ECMP 等价路由:去往云上网段的流量在两条隧道间负载均衡
sudo ip route add 10.0.0.0/16 nexthop dev xfrm1 weight 1 nexthop dev xfrm2 weight 1

创建 updown 脚本,实现隧道中断时自动将对应 XFRM 接口设为 DOWN,使 Linux 内核将流量收敛到存活的隧道:

sudo tee /usr/local/bin/xfrm-updown.sh > /dev/null << 'EOF'
#!/bin/bash
XFRM_IF="xfrm${PLUTO_IF_ID_IN}"
case "${PLUTO_VERB}" in
    up-client)
        ip link set "${XFRM_IF}" up 2>/dev/null
        ;;
    down-client)
        ip link set "${XFRM_IF}" down 2>/dev/null
        ;;
esac
EOF
sudo chmod +x /usr/local/bin/xfrm-updown.sh
如需在设备重启后自动生效,可将 XFRM 接口和路由命令写入启动脚本。

5. 配置 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 配置
    # 适用于:阿里云转发路由器绑定的 IPsec 连接 + 本地公网单出口 + 目的路由
    #
    # 只有带"请修改"标记的参数需要根据实际环境修改,其余参数保持默认即可。
    # 使用 XFRM 接口(if_id)区分两条隧道的流量,通过 ECMP 实现负载均衡。
    
    connections {
    
       # === 隧道1 ===
       tunnel1 {
          version = 2
          dpd_delay = 10s
          rekey_time = 86400s
          proposals = aes128-sha1-modp1024
    
          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 {
             tunnel1-child {
                local_ts  = 0.0.0.0/0
                remote_ts = 0.0.0.0/0
                mode = tunnel
                esp_proposals = aes128-sha1-modp1024
                dpd_action = restart
                start_action = start
                close_action = start
                updown = /usr/local/bin/xfrm-updown.sh
                if_id_in = 1                        # 对应 xfrm1 接口
                if_id_out = 1
             }
          }
    
          if_id_in = 1
          if_id_out = 1
       }
    
       # === 隧道2 ===
       tunnel2 {
          version = 2
          dpd_delay = 10s
          rekey_time = 86400s
          proposals = aes128-sha1-modp1024
    
          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 {
             tunnel2-child {
                local_ts  = 0.0.0.0/0
                remote_ts = 0.0.0.0/0
                mode = tunnel
                esp_proposals = aes128-sha1-modp1024
                dpd_action = restart
                start_action = start
                close_action = start
                updown = /usr/local/bin/xfrm-updown.sh
                if_id_in = 2                        # 对应 xfrm2 接口
                if_id_out = 2
             }
          }
    
          if_id_in = 2
          if_id_out = 2
       }
    }
    
    secrets {
       ike-tunnel1 {
          id-1 = XX.XX.3.3                          # 本地侧公网出口 IP(请修改)
          id-2 = XX.XX.1.1                          # 阿里云侧隧道 1 的公网 IP(请修改)
          secret = "your-psk-here"                  # 隧道 1 的预共享密钥,需与阿里云侧一致(请修改)
       }
       ike-tunnel2 {
          id-1 = XX.XX.3.3                          # 本地侧公网出口 IP(请修改)
          id-2 = XX.XX.2.2                          # 阿里云侧隧道 2 的公网 IP(请修改)
          secret = "your-psk-here"                  # 隧道 2 的预共享密钥,需与阿里云侧一致(请修改)
       }
    }
    重要
    • if_id_inif_id_out 将每条隧道绑定到对应的 XFRM 接口(xfrm1 / xfrm2),确保两条隧道的流量互不干扰。

    • local_tsremote_ts 设置为 0.0.0.0/0,由 XFRM 接口的路由表决定哪些流量进入隧道。目的路由模式下,云上侧的流量选择器也为 0.0.0.0/0

6. 启动并确认隧道状态

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

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

# 期望输出示例(已省略部分内容)
tunnel1: #1, ESTABLISHED, IKEv2
  tunnel1-child: #1, reqid 1, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-128/HMAC_SHA1_96
tunnel2: #2, ESTABLISHED, IKEv2
  tunnel2-child: #2, reqid 2, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-128/HMAC_SHA1_96

验证测试

验证连通性

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

    ping 10.0.0.1

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

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

    ping 172.16.0.1

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

验证高可用

绑定转发路由器的 IPsec 连接默认以 ECMP(等价多路径)方式同时使用两条隧道,流量在双隧道间负载均衡。当一条隧道中断时,流量会自动收敛到另一条隧道,无需手动切换。

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

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

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

  4. 恢复隧道:将隧道 1 的预共享密钥改回正确值,隧道恢复后流量将重新在两条隧道间负载均衡。

故障排查

常见问题与解决方案:

问题现象

可能原因

解决方案

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

网络不通

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

预共享密钥不匹配

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

IKE 参数不一致

检查 IKE 版本、加密算法、认证算法、DH 分组等参数是否在两端匹配。

隧道已建立但无法 ping 通

路由未配置

检查 VPC 路由表中是否已有去往 IDC 网段的路由(下一跳为转发路由器)。同时检查转发路由器路由表中是否有去往 IDC 网段的静态路由(下一跳为 VPN 连接)。目的路由模式下,转发路由器路由不会自动生成,必须手动添加。

安全组限制

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

本地防火墙限制

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

strongSwan 侧路由缺失

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