WireGuard 是现代、快速且极其简单的新一代 VPN 协议,强烈推荐新手使用,OpenVPN 则非常成熟、功能丰富,兼容性极好,适合需要连接各种设备(特别是旧设备)的场景。

使用 WireGuard(推荐,现代、快速、简单)
WireGuard 内核级实现,性能极高,配置文件简洁,是当前的首选。
第 1 步:更新系统并安装 WireGuard
登录到你的 Ubuntu 服务器(推荐使用 Ubuntu 20.04 或 22.04 LTS)。
# 更新软件包列表 sudo apt update # 升级已安装的包 sudo apt upgrade -y # 安装 WireGuard 和必要的工具 sudo apt install wireguard -y
第 2 步:生成服务器的密钥对
在服务器上,为 WireGuard 生成一对公钥和私钥。
# 进入 wireguard 工具目录 cd /etc/wireguard/ # 生成服务器的私钥和公钥 # wg genkey | tee privatekey | wg pubkey > publickey
执行后,你会看到 privatekey 和 publickey 两个文件。

privatekey:必须保密! 这是服务器的私钥。publickey:可以公开,将用于客户端配置。
查看并记录下服务器的公钥:
cat publickey
第 3 步:创建服务器配置文件
创建一个配置文件,wg0.conf。
sudo nano /etc/wireguard/wg0.conf
粘贴进去,并根据你的实际情况进行修改:
[Interface] # 服务器监听的 IP 和端口 (IPv4) Address = 10.0.0.1/24 ListenPort = 51820 # 服务器私钥,将上面生成的 privatekey 内容粘贴到这里 PrivateKey = <YOUR_SERVER_PRIVATE_KEY> # 设置 NAT 转发,让客户端可以通过服务器访问外网 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 恢复 NAT 规则 PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # 注意:如果你的服务器有多块网卡,请将 'eth0' 替换为你的公网网卡名称。 # 你可以使用 'ip a' 命令查看网卡。
重要:

- 将
<YOUR_SERVER_PRIVATE_KEY>替换为你在cat privatekey中看到的内容。 Address是 VPN 网段的网关地址,客户端将使用0.0.x这个网段。ListenPort是 VPN 服务器监听的端口,默认51820,可以自定义,但需要在防火墙中开放。
保存并退出 (Ctrl+X, Y, Enter)。
第 4 步:启用 IP 转发
为了让服务器能将客户端的流量转发到互联网,需要启用内核的 IP 转发功能。
编辑 /etc/sysctl.conf 文件:
sudo nano /etc/sysctl.conf
找到下面这行,并确保它没有被注释(去掉 ):
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
如果找不到,就直接添加这行,然后保存退出。
使配置立即生效:
sudo sysctl -p
第 5 步:配置防火墙(UFW)
如果你使用 UFW(Ubuntu 默认防火墙),需要开放 WireGuard 的端口并允许转发。
# 允许 WireGuard 端口 (51820) sudo ufw allow 51820/udp # 允许 SSH 连接,防止你把自己锁在外面 sudo ufw allow OpenSSH # 启用防火墙 sudo ufw enable
在启用时,输入 y 确认。
第 6 步:启动并启用 WireGuard 服务
# 启动 wg0 接口 sudo wg-quick up wg0 # 设置为开机自启 sudo systemctl enable wg0
检查 WireGuard 状态:
sudo wg
你应该能看到类似下面的输出,表示服务器正在运行:
interface: wg0
public key: <YOUR_SERVER_PUBLIC_KEY>
private key: (hidden)
listening port: 51820
第 7 步:为客户端创建配置
现在我们需要为你的设备(手机、电脑)创建一个客户端配置。
-
生成客户端密钥对 在服务器上执行,为每个客户端生成一对密钥。
# 客户端1 wg genkey | tee client1_privatekey | wg pubkey > client1_publickey
记录下
client1_publickey的内容。 -
添加客户端到服务器配置 编辑服务器的
wg0.conf文件,添加一个客户端段落。sudo nano /etc/wireguard/wg0.conf
在文件末尾添加以下内容:
[Peer] # 客户端的公钥 PublicKey = <CLIENT1_PUBLIC_KEY> # 为客户端分配的 VPN 内网 IP PresharedKey = (可选,增强安全性) AllowedIPs = 10.0.0.2/32
<CLIENT1_PUBLIC_KEY>替换为上一步生成的客户端公钥。AllowedIPs = 10.0.0.2/32表示这个客户端只能使用0.0.2这个 IP,如果你希望客户端通过服务器访问整个互联网,可以设置为AllowedIPs = 10.0.0.2/32, 0.0.0.0/0。0.0.0/0代表所有流量。
-
重启 WireGuard 服务 让新的配置生效。
sudo wg-quick down wg0 sudo wg-quick up wg0 # 或者使用 sudo systemctl restart wg0
第 8 步:配置客户端设备
保存为一个 .conf 文件(client1.conf),然后导入到你的 WireGuard 客户端应用中。
[Interface] # 客户端私钥,将上面生成的 client1_privatekey 内容粘贴到这里 PrivateKey = <CLIENT1_PRIVATE_KEY> # 客户端要使用的 VPN 内网 IP Address = 10.0.0.2/32 # 设置 DNS,防止 DNS 泄漏 DNS = 8.8.8.8, 1.1.1.1 [Peer] # 服务器的公钥 PublicKey = <YOUR_SERVER_PUBLIC_KEY> # 服务器的公网 IP 和端口 Endpoint = <YOUR_SERVER_IP>:51820 # 客户端通过 VPN 发送哪些流量 (0.0.0.0/0 代表所有流量) AllowedIPs = 0.0.0.0/0 # 保持连接,避免断线 PersistentKeepalive = 25
重要:
- 将
<CLIENT1_PRIVATE_KEY>替换为客户端的私钥。 - 将
<YOUR_SERVER_PUBLIC_KEY>替换为服务器的公钥。 - 将
<YOUR_SERVER_IP>替换为你的服务器公网 IP 地址。
使用 OpenVPN(经典、兼容性好)
如果你的设备不支持 WireGuard,或者你需要更细粒度的访问控制,可以选择 OpenVPN。
第 1 步:安装 OpenVPN 和 Easy-RSA
Easy-RSA 是一个用于管理 PKI (Public Key Infrastructure) 的工具集,用于生成证书和密钥。
sudo apt update sudo apt install openvpn easy-rsa -y
第 2 步:设置 PKI (证书颁发机构)
-
准备环境
# 创建一个目录来存放我们的证书 mkdir ~/openvpn-ca cp -r /usr/share/easy-rsa/* ~/openvpn-ca/ cd ~/openvpn-ca/ # 编辑 vars 文件,设置一些默认变量 nano vars
在
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 Name" set_var EASYRSA_REQ_EMAIL "admin@mydomain.com" set_var EASYRSA_REQ_OU "MyOrganizationalUnit"
保存并退出。
-
初始化 PKI 并构建 CA
# 初始化 PKI ./easyrsa init-pki # 构建一个 Certificate Authority (CA) # 这会提示你输入一个密码,请务必记住! ./easyrsa build-ca nopass
这会在
~/openvpn-ca/pki目录下生成ca.crt和ca.key。 -
为服务器生成证书和密钥
# 生成服务器的证书请求 ./easyrsa gen-req server nopass # 用 CA 签名服务器的证书 ./easyrsa sign-req server server
-
为客户端生成证书和密钥
# 为第一个客户端生成证书 ./easyrsa gen-req client1 nopass # 用 CA 签名客户端的证书 ./easyrsa sign-req client client1
-
生成 Diffie-Hellman 参数 这个过程可能需要几分钟时间。
./easyrsa gen-dh
-
生成 HMAC 密钥以增强 TLS 完整性
openvpn --genkey --secret ta.key
第 3 步:创建服务器配置文件
-
复制配置模板
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ sudo gunzip /etc/openvpn/server.conf.gz
-
编辑配置文件
sudo nano /etc/openvpn/server.conf
确保以下配置项是正确的,并根据你的需求修改:
port 1194 proto udp dev tun ca /root/openvpn-ca/pki/ca.crt cert /root/openvpn-ca/pki/issued/server.crt key /root/openvpn-ca/pki/private/server.key dh /root/openvpn-ca/pki/dh.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist /var/log/openvpn/ipp.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 1.1.1.1" keepalive 10 120 tls-crypt /root/openvpn-ca/ta.key cipher AES-256-CBC auth SHA256 user nobody group nogroup persist-key persist-tun status /var/log/openvpn/openvpn-status.log verb 3 explicit-exit-notify 1
ca,cert,key,dh,tls-crypt的路径要正确。server 10.8.0.0 255.255.255.0定义了 VPN 的网段。push指令会将 DNS 服务器和默认网关推送给客户端。
第 4 步:配置防火墙和 IP 转发
这与 WireGuard 步骤基本相同。
-
启用 IP 转发 编辑
/etc/sysctl.conf,确保net.ipv4.ip_forward=1已启用并执行sudo sysctl -p。 -
配置 UFW
# 允许 OpenVPN 端口 (默认 1194/udp) sudo ufw allow 1194/udp sudo ufw allow OpenSSH sudo ufw enable
第 5 步:启动并启用 OpenVPN 服务
# 启动服务 sudo systemctl start openvpn@server # 设置开机自启 sudo systemctl enable openvpn@server
检查状态:
sudo systemctl status openvpn@server
第 6 步:创建客户端配置文件
-
创建基础配置文件
sudo mkdir -p ~/client-configs/files sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf sudo nano ~/client-configs/base.conf
client dev tun proto udp remote YOUR_SERVER_IP 1194 resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server cipher AES-256-CBC auth SHA256 key-direction 1 script-security 2
-
创建客户端生成脚本
sudo nano ~/client-configs/make_config.sh
#!/bin/bash # First argument: Client name KEY_DIR=/root/openvpn-ca/pki OUTPUT_DIR=~/client-configs/files BASE_CONFIG=~/client-configs/base.conf cat ${BASE_CONFIG} \ <(echo -e '<ca>') \ ${KEY_DIR}/ca.crt \ <(echo -e '</ca>\n<cert>') \ ${KEY_DIR}/issued/${1}.crt \ <(echo -e '</cert>\n<key>') \ ${KEY_DIR}/private/${1}.key \ <(echo -e '</key>\n<tls-crypt>') \ ${KEY_DIR}/ta.key \ <(echo -e '</tls-crypt>') \ > ${OUTPUT_DIR}/${1}.ovpn保存后,给脚本执行权限:
sudo chmod 700 ~/client-configs/make_config.sh
-
生成客户端配置文件
# 为 client1 生成配置 sudo ~/client-configs/make_config.sh client1
生成的配置文件会在
~/client-configs/files/目录下,名为client1.ovpn。
第 7 步:配置客户端设备
将生成的 client1.ovpn 文件传输到你的设备上,然后使用 OpenVPN 客户端导入它即可连接。
总结与安全建议
| 特性 | WireGuard | OpenVPN |
|---|---|---|
| 协议 | 内核级,现代 | 用户空间,经典 |
| 速度 | 非常快 | 较快 |
| 配置 | 极其简单(一个配置文件) | 较复杂(需要证书和CA) |
| 兼容性 | 较新系统支持良好 | 所有平台和设备都支持 |
| 推荐度 | ⭐⭐⭐⭐⭐ (首选) | ⭐⭐⭐⭐ (备选) |
重要安全提示
-
使用强密码:为你的服务器设置一个强 SSH 密码。
-
禁用密码登录:强烈建议配置 SSH 密钥登录,并禁用密码登录,以提高安全性。
-
定期更新:保持你的 Ubuntu 系统和 VPN 软件包是最新版本。
-
使用强防火墙规则:只开放必要的端口(如 SSH 和 VPN 端口)。
-
保护密钥:服务器和客户端的私钥文件权限应设置为
600,确保只有 root 用户可读。sudo chmod 600 /etc/wireguard/privatekey sudo chmod 600 /root/openvpn-ca/pki/private/*
-
日志监控:定期检查 VPN 服务的日志,查看是否有异常连接。
# WireGuard 日志 journalctl -u wg0 -f # OpenVPN 日志 tail -f /var/log/syslog | grep openvpn
按照以上步骤,你就可以成功搭建一个属于自己的 VPN 服务器了,祝你成功!
