VPN 与隧道技术
VPN 概述
VPN(Virtual Private Network)通过加密隧道在公网上建立安全的私有通信通道。
VPN 协议对比
| 协议 | 速度 | 安全性 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| WireGuard | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 低 | 现代首选 |
| IPSec | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 高 | 企业站点间 |
| OpenVPN | ⭐⭐⭐ | ⭐⭐⭐⭐ | 中 | 远程接入(兼容性好) |
| PPTP | ⭐⭐⭐⭐ | ⭐ | 低 | ❌ 已不安全,不推荐 |
| L2TP/IPSec | ⭐⭐⭐ | ⭐⭐⭐⭐ | 中 | 移动设备兼容 |
| GRE | ⭐⭐⭐⭐ | ⭐(无加密) | 低 | 隧道封装(需配合 IPSec) |
WireGuard
WireGuard 是现代 VPN 协议,代码仅 ~4000 行(IPSec 超过 100,000 行),已合入 Linux 内核(5.6+)。
安装与配置
# 安装
apt install wireguard # Debian/Ubuntu
yum install wireguard-tools # CentOS(需 EPEL/ELRepo)
# 生成密钥对
wg genkey | tee privatekey | wg pubkey > publickey
服务端配置:
/etc/wireguard/wg0.conf
[Interface]
# 服务端 VPN 内网 IP
Address = 10.10.0.1/24
# 监听端口
ListenPort = 51820
# 服务端私钥
PrivateKey = SERVER_PRIVATE_KEY
# 启动/关闭时执行的防火墙规则
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# 客户端公钥
PublicKey = CLIENT_PUBLIC_KEY
# 允许的 IP 范围
AllowedIPs = 10.10.0.2/32
客户端配置:
/etc/wireguard/wg0.conf
[Interface]
Address = 10.10.0.2/24
PrivateKey = CLIENT_PRIVATE_KEY
DNS = 8.8.8.8
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = server_public_ip:51820
# 0.0.0.0/0 表示所有流量走 VPN(全隧道)
# 10.10.0.0/24 表示只有 VPN 网段走 VPN(分割隧道)
AllowedIPs = 0.0.0.0/0
# 保活(NAT 穿越)
PersistentKeepalive = 25
启动与管理:
# 启动
wg-quick up wg0
# 查看状态
wg show
# 停止
wg-quick down wg0
# 开机自启
systemctl enable wg-quick@wg0
WireGuard 优势
- 性能:内核级实现,吞吐量和延迟优于 OpenVPN
- 简单:配置文件简洁,密钥管理轻量
- 安全:使用现代加密(ChaCha20、Curve25519、BLAKE2s)
- 漫游:IP 变化后自动恢复连接
OpenVPN
OpenVPN 是最成熟的开源 VPN 方案,兼容性最好。
服务端配置
# 安装
apt install openvpn easy-rsa
# 生成 CA 和证书
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey secret ta.key
/etc/openvpn/server.conf
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/easy-rsa/ta.key 0
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
cipher AES-256-GCM
persist-key
persist-tun
user nobody
group nogroup
log /var/log/openvpn.log
verb 3
# 启动
systemctl start openvpn@server
systemctl enable openvpn@server
IPSec
IPSec 是企业级 VPN 标准,常用于站点间互联(Site-to-Site)。
IPSec 核心概念
| 概念 | 说明 |
|---|---|
| IKE | 密钥交换协议(IKEv1/IKEv2),协商安全参数 |
| SA | 安全关联,定义加密算法、密钥、SPI |
| ESP | 封装安全载荷,提供加密 + 认证 |
| AH | 认证头,仅提供认证(不加密) |
| SPD | 安全策略数据库,定义哪些流量需要加密 |
使用 strongSwan 配置
# 安装
apt install strongswan strongswan-pki
/etc/ipsec.conf
config setup
charondebug="ike 1, knl 1, cfg 1"
conn site-to-site
type=tunnel
auto=start
keyexchange=ikev2
authby=secret
# 本端
left=%defaultroute
leftsubnet=10.0.1.0/24
leftid=@site-a
# 对端
right=REMOTE_PUBLIC_IP
rightsubnet=10.0.2.0/24
rightid=@site-b
ike=aes256-sha256-modp2048!
esp=aes256-sha256!
/etc/ipsec.secrets
@site-a @site-b : PSK "your-pre-shared-key"
# 启动
systemctl restart strongswan
ipsec statusall # 查看隧道状态
隧道技术
GRE 隧道
GRE(Generic Routing Encapsulation)是一种封装协议,本身不加密,常与 IPSec 配合:
# 创建 GRE 隧道
ip tunnel add gre1 mode gre remote REMOTE_IP local LOCAL_IP ttl 255
ip addr add 10.10.10.1/30 dev gre1
ip link set gre1 up
# 添加路由
ip route add 10.0.2.0/24 dev gre1
VXLAN
VXLAN(Virtual Extensible LAN)用于构建大规模 overlay 网络,是 Kubernetes 网络方案的基础:
# 创建 VXLAN 接口
ip link add vxlan100 type vxlan id 100 \
remote REMOTE_IP \
local LOCAL_IP \
dstport 4789 \
dev eth0
ip addr add 10.200.0.1/24 dev vxlan100
ip link set vxlan100 up
VXLAN 在容器网络中的应用
- Flannel(VXLAN 模式):Kubernetes 默认网络方案之一
- Calico(VXLAN 模式):支持网络策略的容器网络
- VXLAN 会增加 50 字节头部开销,需要调整 MTU
VPN 选型建议
常见面试问题
Q1: WireGuard 和 OpenVPN 怎么选?
答案:
| 维度 | WireGuard | OpenVPN |
|---|---|---|
| 性能 | 内核级,快 2-4 倍 | 用户空间,较慢 |
| 代码量 | ~4000 行 | ~100,000 行 |
| 配置 | 极简 | 复杂(PKI 体系) |
| 兼容性 | Linux 5.6+,需安装 | 几乎所有平台 |
| 审计 | 代码量少容易审计 | 代码量大 |
推荐:新项目优先 WireGuard。需要兼容老系统或已有 OpenVPN 基础设施则继续用 OpenVPN。
Q2: IPSec 的两种模式(传输模式和隧道模式)有什么区别?
答案:
- 传输模式:只加密 IP 包的数据部分,IP 头部不变。用于主机到主机通信。
- 隧道模式:加密整个原始 IP 包,外面包一层新的 IP 头。用于网关间通信(Site-to-Site VPN)。
实际使用中,站点间 VPN 用隧道模式,远程接入用传输模式。
Q3: VPN 和 SSH 隧道的区别?
答案:
- VPN:网络层加密隧道,转发所有协议的流量。适合整个网络的安全连接。
- SSH 隧道:应用层端口转发,只转发特定端口的 TCP 流量。适合临时的单端口转发。
# SSH 本地端口转发(临时访问内网数据库)
ssh -L 3306:db.internal:3306 jump-server
# SSH 动态端口转发(SOCKS 代理)
ssh -D 1080 jump-server
SSH 隧道适合临时调试,VPN 适合长期的网络互联。