本指南将以 OpenVPN 为例,以目前最主流、最易于维护的 easy-rsa 3.x 版本和 systemd 服务管理为核心,在 Ubuntu/Debian 系统上进行详细说明。

第一部分:核心概念
在开始之前,理解几个关键概念非常重要:
-
SSL VPN vs. IPsec VPN:
- SSL VPN:通常工作在应用层(OSI 第7层),通过标准的 HTTPS 端口(443)进行通信,因此更容易穿过防火墙和 NAT,兼容性更好,我们这里讨论的 OpenVPN 就属于此类。
- IPsec VPN:工作在网络层(OSI 第3层),提供更底层的保护,性能通常更高,但配置更复杂,某些网络环境可能需要特定的 UDP 端口。
-
OpenVPN 的工作模式:
- 客户端/服务器 模式:这是最常见的模式,所有客户端都连接到中心服务器,形成一个“星型”网络,服务器可以管理客户端的认证、分配 IP 地址等,本指南将重点介绍此模式。
- 点对点 模式:两个 OpenVPN 实例直接互联,更像一个传统的 IPsec 隧道。
-
加密与认证:
(图片来源网络,侵删)- TLS:OpenVPN 使用 TLS (SSL/TLS) 来协商密钥和验证身份,这是其安全性的核心。
- 证书:OpenVPN 使用公钥基础设施 来进行双向认证,服务器和客户端都必须拥有由证书颁发机构 签发的证书,以确保双方都是可信的,我们使用
easy-rsa来创建自己的 CA。
第二部分:环境准备
- 服务器:一台干净的 Ubuntu 22.04 或 Debian 11+ 服务器,拥有公网 IP 地址。
- 客户端:一台可以访问互联网的设备(Windows, macOS, Linux, Android, iOS)。
- root 权限:在服务器上需要
sudo权限。
第三部分:在服务器上安装和配置 OpenVPN
我们将分步进行:安装软件 -> 创建 CA 和证书 -> 配置服务器 -> 启动服务 -> 配置客户端。
步骤 1:安装 OpenVPN 和 Easy-RSA
# 更新软件包列表 sudo apt update # 安装 OpenVPN 和 Easy-RSA 3 sudo apt install -y openvpn easy-rsa
步骤 2:创建证书颁发机构 和密钥
我们将创建一个安全的目录来存放所有证书和密钥。
# 创建一个用于存放 Easy-RSA 文件的目录 make-cadir ~/openvpn-ca # 进入该目录 cd ~/openvpn-ca
我们需要编辑 vars 文件来设置一些默认变量,这样在生成证书时就不需要每次都输入。
nano vars
在文件末尾添加或修改以下内容(请根据你的实际情况修改):

# 设置国家代码、省份、城市、组织、邮箱等 set_var EASYRSA_REQ_COUNTRY "CN" set_var EASYRSA_REQ_PROVINCE "Beijing" set_var EASYRSA_REQ_CITY "Beijing" set_var EASYRSA_REQ_ORG "My Company" set_var EASYRSA_REQ_EMAIL "admin@example.com" set_var EASYRSA_REQ_OU "My VPN OU" # 设置密钥类型和加密强度 set_var EASYRSA_KEY_SIZE 2048 set_var EASYRSA_ALGO rsa
保存并退出 (Ctrl+X, Y, Enter)。
我们使用这些变量来构建 CA。
# 初始化 PKI (Public Key Infrastructure) ./easyrsa init-pki # 构建证书颁发机构 # 系统会提示你输入一些信息,CA 的密码,请务必记住! ./easyrsa build-ca nopass
nopass参数表示 CA 密钥没有密码,方便服务器自动启动,如果安全性要求极高,可以去掉此参数,但需要在服务器启动时手动输入密码。
步骤 3:创建服务器证书和密钥
我们为 OpenVPN 服务器本身创建一个证书。
# 创建服务器证书,并指定一个通用名称 # 系统会要求你确认信息,输入 yes ./easyrsa gen-req server nopass # 用 CA 来签署服务器证书 # 同样,输入 yes ./easyrsa sign-req server server
步骤 4:创建 Diffie-Hellman 参数
DH 参数用于进行完美的前向保密,确保即使服务器的私钥泄露,历史的通信内容也无法被解密。
# 这一步可能需要几分钟时间,请耐心等待 ./easyrsa gen-dh
我们还需要生成一个 HMAC 密钥,用于增强 TLS 完整性验证。
openvpn --genkey --secret pki/ta.key
步骤 5:配置 OpenVPN 服务器
我们有了所有需要的证书和密钥,接下来创建服务器配置文件。
# 创建配置文件目录 sudo mkdir -p /etc/openvpn/server # 复制服务器配置模板 sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/ # 解压并编辑配置文件 sudo gzip -d /etc/openvpn/server/server.conf.gz sudo nano /etc/openvpn/server/server.conf
这是一个非常重要的步骤,我们需要修改或取消注释以下几行:
# 使用哪个协议?推荐使用 UDP,性能更好 ;proto tcp proto udp # 使用哪个端口?UDP 默认 1194,如果想伪装成 HTTPS,可以用 443 port 1194 # 用户和权限,使用 nobody 和 nogroup 比较安全 user nobody group nogroup # 使用 TUN 虚拟网卡 dev tun # CA 文件路径 ca /root/openvpn-ca/pki/ca.crt # 服务器证书和私钥路径 cert /root/openvpn-ca/pki/issued/server.crt key /root/openvpn-ca/pki/private/server.key # DH 参数文件路径 dh /root/openvpn-ca/pki/dh.pem # HMAC 密钥路径 tls-crypt /root/openvpn-ca/pki/ta.key # 网络配置:服务器将 VPN 客户端分配到这个网段 server 10.8.0.0 255.255.255.0 # 推导客户端所有流量通过 VPN push "redirect-gateway def1 bypass-dhcp" # 推导客户端使用的 DNS 服务器 push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 1.1.1.1" # 允许客户端之间互相通信(可选,默认否) client-to-client # 保持客户端连接状态,10 分钟内没有数据传输,则断开 keepalive 10 120 # 使用 LZO 压缩数据(可选,现代 OpenVPN 默认使用 lz4) comp-lzo # 安全设置,防止某些攻击 cipher AES-256-CBC auth SHA256 # 控制文件和日志文件 persist-key persist-tun status openvpn-status.log verb 3
重要提示:
- 将
ca,cert,key,dh,tls-crypt的路径修改为你实际生成的文件路径。 cipher和auth选项确保了强加密。
步骤 6:调整服务器网络设置
为了让 VPN 客户端能够访问互联网,服务器需要开启 IP 转发。
# 编辑 sysctl 配置文件 sudo nano /etc/sysctl.conf
找到下面这行并取消注释(或添加):
net.ipv4.ip_forward=1
保存后,立即生效:
sudo sysctl -p
设置 iptables/nftables 规则,将客户端的流量通过 eth0(你的公网网卡)转发出去。
# 查看你的公网网卡名称 ip a # 假设你的公网网卡是 eth0 sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
为了让规则在重启后仍然生效,可以安装 iptables-persistent:
sudo apt install iptables-persistent sudo netfilter-persistent save
步骤 7:启动并启用 OpenVPN 服务
# 启动服务 sudo systemctl start openvpn@server # 设置开机自启 sudo systemctl enable openvpn@server # 检查服务状态 sudo systemctl status openvpn@server
如果看到 active (running),说明服务器端已经成功运行!
第四部分:创建客户端配置文件
我们需要为每个客户端创建一个独特的证书和配置文件。
步骤 1:为客户端生成证书
回到 ~/openvpn-ca 目录:
cd ~/openvpn-ca
假设我们要为用户 client1 创建配置:
# 为 client1 生成证书请求 ./easyrsa gen-req client1 nopass # 用 CA 签署 client1 的证书 ./easyrsa sign-req client client1
步骤 2:创建客户端配置文件
在客户端设备上,最简单的方式是复制一个模板文件并修改。
# 在服务器上,我们可以先创建一个基础配置文件 sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client/client1.conf sudo nano /etc/openvpn/client/client1.conf
# 客户端配置 client dev tun proto udp remote YOUR_SERVER_IP 1194 # 务必将 YOUR_SERVER_IP 替换为你的服务器公网 IP resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server cipher AES-256-CBC auth SHA256 comp-lzo yes verb 3 # 引入客户端证书、密钥和 CA 证书 # 注意:这些文件需要通过安全的方式(如 scp)传输给客户端 # <ca> # -----BEGIN CERTIFICATE----- # ... (将 /root/openvpn-ca/pki/ca.crt 的内容粘贴到这里) # -----END CERTIFICATE----- # </ca> # <cert> # -----BEGIN CERTIFICATE----- # ... (将 /root/openvpn-ca/pki/issued/client1.crt 的内容粘贴到这里) # -----END CERTIFICATE----- # </cert> # <key> # -----BEGIN PRIVATE KEY----- # ... (将 /root/openvpn-ca/pki/private/client1.key 的内容粘贴到这里) # -----END PRIVATE KEY----- # </key> # 引入服务器的 ta.key # <tls-crypt> # -----BEGIN OpenVPN Static key V1----- # ... (将 /root/openvpn-ca/pki/ta.key 的内容粘贴到这里) # -----END OpenVPN Static key V1----- # </tls-crypt>
更现代的做法(推荐):
将 <ca>, <cert>, <key>, <tls-crypt> 的内容直接粘贴到配置文件中,而不是使用 cert /path/to/cert.crt 这样的方式,这样客户端只需要一个 .ovpn 文件即可。
步骤 3:安全地传输配置文件
将 client1.conf 文件通过 scp 或其他安全方式从服务器复制到你的客户端设备上。
# 在你的本地电脑上执行 scp user@YOUR_SERVER_IP:/etc/openvpn/client/client1.conf ~/Downloads/
第五部分:在客户端上连接
-
安装 OpenVPN 客户端:
- Windows: 下载并安装 OpenVPN Connect。
- macOS: 下载并安装 OpenVPN Connect。
- Linux (Ubuntu/Debian):
sudo apt install openvpn network-manager-openvpn。 - Android/iOS: 在应用商店搜索 "OpenVPN Connect" 并安装。
-
导入配置:
- 将你下载的
client1.conf文件拖到 OpenVPN Connect 客户端窗口中,或通过 "Import" 功能导入。 - 客户端会自动解析文件中的证书和密钥内容。
- 将你下载的
-
连接:
- 在客户端列表中找到你的配置文件,点击 "Connect"。
- 如果一切正常,你的设备将获得一个
8.0.x网段的 IP 地址,并且所有网络流量都会通过 VPN 服务器。
第六部分:排错和维护
- 查看日志:
- 服务器端:
sudo journalctl -u openvpn@server -f - 客户端: 在客户端软件中查看详细日志。
- 服务器端:
- 防火墙:确保服务器的防火墙(如
ufw)允许 OpenVPN 端口(UDP 1194)的流量。sudo ufw allow 1194/udp
- 添加/撤销客户端:
- 添加:重复第四部分的步骤,为新的用户名生成证书和配置文件。
- 撤销:在
~/openvpn-ca目录下,使用./easyrsa revoke clientname,./easyrsa gen-crl,将生成的pki/crl.pem文件复制到服务器/etc/openvpn/server/目录下,并在server.conf中添加crl-verify crl.pem。
更高级的选项
- 使用用户名/密码认证:除了证书,还可以添加用户名和密码的二次认证,更灵活,这需要创建
user-pass文件,并在客户端配置中添加auth-user-pass。 - 使用 Docker:可以使用
kylemanna/openvpn等 Docker 镜像来简化部署和管理。 - 使用
WireGuard:WireGuard 是一个更新的 VPN 技术,代码更简洁、性能更高、配置更简单,如果你的系统和客户端都支持,强烈推荐研究和使用 WireGuard。
希望这份详细的指南能帮助你成功搭建自己的 Linux SSL VPN 服务器!
