凌峰创科服务平台

Linux SSL VPN服务器如何快速搭建?

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

Linux SSL VPN服务器如何快速搭建?-图1
(图片来源网络,侵删)

第一部分:核心概念

在开始之前,理解几个关键概念非常重要:

  1. SSL VPN vs. IPsec VPN

    • SSL VPN:通常工作在应用层(OSI 第7层),通过标准的 HTTPS 端口(443)进行通信,因此更容易穿过防火墙和 NAT,兼容性更好,我们这里讨论的 OpenVPN 就属于此类。
    • IPsec VPN:工作在网络层(OSI 第3层),提供更底层的保护,性能通常更高,但配置更复杂,某些网络环境可能需要特定的 UDP 端口。
  2. OpenVPN 的工作模式

    • 客户端/服务器 模式:这是最常见的模式,所有客户端都连接到中心服务器,形成一个“星型”网络,服务器可以管理客户端的认证、分配 IP 地址等,本指南将重点介绍此模式。
    • 点对点 模式:两个 OpenVPN 实例直接互联,更像一个传统的 IPsec 隧道。
  3. 加密与认证

    Linux SSL VPN服务器如何快速搭建?-图2
    (图片来源网络,侵删)
    • 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

在文件末尾添加或修改以下内容(请根据你的实际情况修改):

Linux SSL VPN服务器如何快速搭建?-图3
(图片来源网络,侵删)
# 设置国家代码、省份、城市、组织、邮箱等
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 的路径修改为你实际生成的文件路径。
  • cipherauth 选项确保了强加密。

步骤 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/

第五部分:在客户端上连接

  1. 安装 OpenVPN 客户端

    • Windows: 下载并安装 OpenVPN Connect
    • macOS: 下载并安装 OpenVPN Connect
    • Linux (Ubuntu/Debian): sudo apt install openvpn network-manager-openvpn
    • Android/iOS: 在应用商店搜索 "OpenVPN Connect" 并安装。
  2. 导入配置

    • 将你下载的 client1.conf 文件拖到 OpenVPN Connect 客户端窗口中,或通过 "Import" 功能导入。
    • 客户端会自动解析文件中的证书和密钥内容。
  3. 连接

    • 在客户端列表中找到你的配置文件,点击 "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 服务器!

分享:
扫描分享到社交APP
上一篇
下一篇