跳到主要内容

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 怎么选?

答案

维度WireGuardOpenVPN
性能内核级,快 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 适合长期的网络互联。

相关链接