OpenVPN 连接 VPC 的核心原理
OpenVPN 通过加密隧道实现客户端与 VPC(虚拟私有云)的安全通信,其核心流程可分为以下阶段:
- 证书认证(PKI 体系)
证书作用:
CA 证书:根证书,验证服务端和客户端证书的合法性(信任链基础)。
服务端证书:标识 VPN 服务器身份,由 CA 签名。
客户端证书:标识客户端身份,由 CA 签名。
验证流程:
客户端和服务端交换证书,通过 CA 证书验证对方身份,确保通信双方可信。 - 隧道建立(TLS 握手)
密钥协商:
使用 TLS/SSL 协议协商会话密钥(如 AES-256-GCM),后续数据通过此密钥加密。
模式选择:
UDP 模式:默认高效模式,适合低延迟场景(如 proto udp)。
TCP 模式:可靠性优先,穿透性更强(如 proto tcp)。 - 数据传输(加密隧道)
流量封装:
客户端流量(如 HTTP、SSH)被封装到 OpenVPN 加密隧道。
数据包通过 TLS 加密后传输,防止中间人窃听或篡改。
协议封装:
使用 TUN 设备(IP 层隧道)或 TAP 设备(以太网层隧道)处理流量。 - 路由与 NAT(访问 VPC 资源)
服务端路由配置:
OpenVPN 服务端将客户端流量路由到 VPC 子网(如 10.0.0.0/16)。
VPC 安全组/路由表:
在云平台(如 AWS、阿里云)配置 VPC 路由表,允许来自 OpenVPN 服务端 IP 的流量。
安全组需放行 OpenVPN 端口(如 UDP 1194)。 - 连接维护(心跳与重连)
Keepalive 机制:
服务端和客户端定期发送心跳包(如 keepalive 10 60),检测连接状态。
会话恢复:
支持断线后自动重连,保持隧道持久性。
密钥轮换:
动态更新会话密钥(reneg-sec 3600),提升安全性。
OpenVPN 连接 VPC 的本质是通过 加密隧道 和 PKI 证书体系,将客户端流量安全地引入私有网络。其核心依赖 TLS 协议保障通信安全,并通过路由规则实现 VPC 资源访问。正确配置证书、加密算法和路由策略是成功的关键。
前置条件
过程
步骤 1:准备阿里云ECS实例
- 创建ECS实例:
登录阿里云控制台,选择目标地域和VPC。
创建一台ECS实例(推荐CentOS或Ubuntu系统),分配公网IP,确保其位于目标VPC的子网内。 - 配置安全组:
在ECS实例的安全组中添加入方向规则:
允许UDP 1194端口(OpenVPN默认端口)。
允许SSH端口(如TCP 22)用于管理。
步骤 2:安装OpenVPN和生成证书
- 安装OpenVPN和依赖:
# CentOS
sudo yum install -y epel-release
sudo yum install -y openvpn easy-rsa
# Ubuntu
sudo apt update
sudo apt install -y openvpn easy-rsa
- 配置证书颁发机构(CA):
mkdir -p ~/easy-rsa/keys
cp -r /usr/share/easy-rsa/3/* ~/easy-rsa/
cd ~/easy-rsa
./easyrsa init-pki
./easyrsa build-ca # 生成CA证书(设置密码和名称)
- 生成服务器证书:
./easyrsa build-server-full server nopass # 生成服务器证书(名称如server)
./easyrsa gen-dh # 生成Diffie-Hellman参数
- 生成客户端证书:
./easyrsa build-client-full client1 nopass # 创建客户端client1的证书
步骤 3:配置OpenVPN服务器
- 创建配置文件:
sudo mkdir -p /etc/openvpn/server
sudo cp ~/easy-rsa/pki/ca.crt ~/easy-rsa/pki/issued/server.crt ~/easy-rsa/pki/private/server.key ~/easy-rsa/pki/dh.pem /etc/openvpn/server/
- 编写服务器配置文件:
sudo nano /etc/openvpn/server/server.conf
添加以下内容(根据实际情况调整):
port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
server 172.17.0.0 255.255.255.0 # VPN客户端使用的子网
push "route 192.168.0.0 255.255.0.0" # 替换为VPC的CIDR(如192.168.0.0/16)
keepalive 10 120
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
- 启用IP转发和配置NAT:
# 启用IP转发
sudo echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sudo sysctl -p
# 配置iptables NAT规则(假设ECS内网网卡为eth0)
sudo iptables -t nat -A POSTROUTING -s 172.17.0.0/24 -o eth0 -j MASQUERADE
sudo iptables-save > /etc/sysconfig/iptables # CentOS保存规则
sudo netfilter-persistent save # Ubuntu(需安装iptables-persistent)
步骤 4:启动OpenVPN服务
sudo systemctl start openvpn-server@server
sudo systemctl enable openvpn-server@server
步骤 5:配置客户端
获取客户端配置文件:
- 从服务器下载以下文件到本地:
ca.crt
client1.crt(客户端证书)
client1.key(客户端私钥) - 创建客户端配置文件(client.ovpn):
client
dev tun
proto udp
remote 10.8.0.0 1194 #更换实际ecs的公网IP地址
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
remote-cert-tls server
verb 3
- 使用OpenVPN客户端连接:
将client.ovpn和证书文件导入OpenVPN客户端(如Windows的OpenVPN GUI或Linux的network-manager-openvpn)。
启动连接。