
从2025年3月开始,我负责把一家跨境SaaS厂商的整套办公与运维流量“搬”进香港机房。目标只有一句话:无论员工身在广州、吉隆坡还是纽约,都能以企业级加密通道安全接入香港核心业务网络。最终我落地了 IPSec IKEv2 + SSL VPN 的双栈方案——既保证了对等站点的高吞吐隧道,也兼顾了移动端的“零门槛”接入。以下是我完整的方案设计、部署脚本、加固细节和故障排查心得,希望能给你带来可直接复现的价值。
1. 环境基线与前置条件
| 角色 | 规格 | 关键软件版本 |
|---|---|---|
| VPN Gateway (x2) | AMD EPYC 9354 / 32 GB RAM / 2×10 GbE / Debian 12 | strongSwan 5.9.13, OpenVPN 2.6.9, nftables 1.0.9 |
| 核心交换 | Arista 7050X3 | MLAG + EVPN |
| 集中证书管理 | HashiCorp Vault 1.16 | |
| 集中监控 | Prometheus 2.52 + Grafana 11 |
两台 VPN Gateway 采用 VRRP 漂移 VIP(keepalived),后端通过 BGP 灰度发布默认路由,保证控制面无单点。
2. 方案拓扑与流量分层
flowchart LR
subgraph "公网区 (ISP 三线 BGP)"
internet((Internet))
internet --> edgefirewall --> vrrpVIP
end
subgraph "DMZ"
vrrpVIP --> gw1(VPN GW #1)
vrrpVIP --> gw2(VPN GW #2)
end
subgraph "内网"
gw1 & gw2 --> coreSW --> appCluster
end
gw1 & gw2 -- Promtail --> prom(Prometheus + Loki)
- IPSec 端:与对端 IDC / 分支办公室做 site-to-site,走 IKEv2 + AES-GCM + PFS group 19。
- SSL VPN 端:给移动与在家员工做 road-warrior 访问,443/TCP + 1194/UDP 双端口穿透。
- 分流逻辑:策略路由把 10.0.0.0/8 等企业私网段强制走 IPSec,其他流量若未命中则回落到 SSL VPN。
3. IPSec IKEv2 部署与硬核加固
3.1 生成根/中级 CA
vault secrets enable pki
vault write pki/root/generate/internal \
common_name="corp-root-ca" ttl=17520h
vault write pki/roles/ipsec \
allowed_domains="*.corp.example" \
allow_any_name=true \
max_ttl=8760h
3.2 strongSwan 配置片段
/etc/strongswan/conf.d/main.conf
vault secrets enable pki
vault write pki/root/generate/internal \
common_name="corp-root-ca" ttl=17520h
vault write pki/roles/ipsec \
allowed_domains="*.corp.example" \
allow_any_name=true \
max_ttl=8760h
加固提示:
- 关闭 IKEv1,仅保留 IKEv2。
- 使用 ECDSA-384 证书,避免 RSA。
- nft add rule inet filter input udp dport {500, 4500} ct state new accept 前务必做 GeoIP 白名单。
4. SSL VPN(OpenVPN)快速落地
4.1 生成双端口配置
/etc/openvpn/server/server.conf
port 1194
proto udp
port-share 443
proto tcp-server
dev tun
topology subnet
server 10.99.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.99.0.1"
cipher AES-256-GCM
auth SHA384
tls-version-min 1.3
tls-cert-profile preferred
verify-x509-name "gw.hk.corp.example" name
client-connect "/usr/local/bin/vpn_acl.sh"
4.2 动态 ACL 脚本(示例)
#!/usr/bin/env bash
# vpn_acl.sh
CLIENT_CERT_CN="$common_name"
if [[ "$CLIENT_CERT_CN" =~ ^ops-.* ]] ; then
/usr/bin/iptables-nft -I FORWARD -s "$ifconfig_pool_remote_ip" -d 10.120.0.0/16 -j ACCEPT
else
/usr/bin/iptables-nft -I FORWARD -s "$ifconfig_pool_remote_ip" -j DROP
fi
5. 双协议协同:策略路由与流量分流
table inet mangle {
chain preraw {
type filter hook prerouting priority -300;
ip saddr {10.20.0.0/16} mark set 0x101 # 分支办公流量
ip saddr {10.99.0.0/24} mark set 0x102 # 远程员工流量
}
}
ip rule add fwmark 0x101 lookup 101
ip route add default dev vti_branch table 101
ip rule add fwmark 0x102 lookup 102
ip route add default dev tun0 table 102
6. 客户端适配
| 平台 | IPSec IKEv2 | SSL VPN |
|---|---|---|
| Windows 11 | 内置 Always On VPN(PowerShell 脚本导入 .pfx + EAP-TLS) |
OpenVPN GUI 2.6 |
| macOS 14 | tunnel mode,用 Apple Profile Manager 推送配置 | Tunnelblick / Viscosity |
| iOS / iPadOS | Apple 原生 IKEv2 | OpenVPN Connect |
| Android 14 | strongSwan VPN Client | OpenVPN for Android |
| Linux | NetworkManager-strongswan | systemd-openvpn@.service |
我在 MDM 中集成了 AWS Secrets Manager + SCEP 一键下发证书,避免手工导入。
7. 监控、告警与可视化
strongSwan Exporter:github.com/telekom/strongswan_exporter ➜ Prometheus
OpenVPN Exporter:jnovack/openvpn-monitor
告警示例:
- alert: VPN_Tunnel_Down
expr: strongswan_up == 0
for: 2m
labels:
severity: critical
Grafana 仪表:活跃隧道数、握手 RTT、加密吞吐、证书过期日历。
8. 典型故障案例与排查套路
| 症状 | 根因定位 | 快速修复 |
|---|---|---|
IKE_AUTH 阶段挂在 INVALID_ID_INFORMATION |
证书 SubjectAltName 与 leftid/rightid 不符 |
ipsec reload 后重签 CSR |
| OpenVPN 客户端偶发掉线 | 移动网络 NAT 超时 | keepalive 10 60 + mssfix 1350 |
| IPSec 流量走了公网而非 VTI | ip rule 优先级被系统服务覆盖 |
ip rule add pref 100 固定优先级 |
9. 自动化脚本(Ansible 片段)
- name: Install and configure strongSwan
hosts: vpn_gw
roles:
- geerlingguy.repo-epel
- vpn.strongswan
vars:
strongswan_connections:
- name: "branch-gz"
left: "{{ inventory_hostname }}"
right: "203.0.113.9"
leftsubnet: "10.10.0.0/16"
rightsubnet: "10.20.0.0/16"
ike: "aes256gcm16-prfsha384-ecp384!"
esp: "aes256gcm16-ecp384!"
GitOps 流程:Push ➜ GitLab CI ➜ Ansible AWX ➜ Gateway,两分钟内完成改动上线、自动回滚。
10. 性能压测与安全基线评估
| 指标 | IPSec (VTI) | SSL VPN (tun0) |
|---|---|---|
| 加密后吞吐 | 8.2 Gbps | 1.9 Gbps |
| 平均 RTT 增量 | +0.18 ms | +0.35 ms |
| CPU 占用 (单核) | 62 % @AES-NI | 78 % |
| 合规测试 | CIS Benchmark L2 (pass) | PCI-DSS 4.0 (pass) |
工具:iperf3 -P 16 -t 120, openscap, nmap -sV -sC.
11. 收尾与最佳实践清单
- 双活设计:两台 Gateway + VRRP + BGP 社区属性,确保瞬时切换 <1 s。
- 证书零信任:根 CA 离线保存,子 CA 定期轮换;所有 VPN 仅接受 ECDSA-384。
- 最小权限:策略路由配合 nftables set 动态 ACL,按组细分到子网。
- 观测即安全:Prometheus 指标 ➜ Grafana 漏斗图 ➜ Loki 关联日志,做到“事前可视,事中可溯,事后可审”。
- 自动修复:DPD + systemd 重启策略,结合 AWX 回滚功能,把 MTTR 控制在 5 分钟内。
把 IPSec + SSL VPN 双栈方案跑在香港机房并不是“堆软件”那么简单。真实挑战在于跨时区团队、跨运营商网络质量、以及对安全与可用性的双重 SLA。但只要控制住证书体系、策略路由和监控三大面,我相信你也能像我一样,在短短两周内完成企业级安全远程访问的全链路落地。











