本指南将详细介绍如何在一台 Linux 服务器上安装和配置 OpenVPN,并生成两个客户端的配置文件,使这两个客户端连接后可以互相访问。
目录
- 准备工作
- 第一步:安装 OpenVPN 和 Easy-RSA
- 第二步:设置证书颁发机构 (CA) 及证书
- 第三步:配置 OpenVPN 服务器
- 第四步:配置服务器网络与防火墙
- 第五步:启动并验证 OpenVPN 服务
- 第六步:创建客户端配置文件
- 第七步:客户端连接与测试
1. 准备工作
- 一台服务器:拥有公网 IP,建议使用 Debian 11/12 或 Ubuntu 20.04/22.04。
- Root 权限:拥有服务器的
root或sudo权限。 - 两台客户端设备:例如两台 PC 或笔记本电脑。
2. 第一步:安装 OpenVPN 和 Easy-RSA
首先,更新系统并安装必要的软件包。
# 更新软件包列表
sudo apt update
# 安装 OpenVPN 和 Easy-RSA
sudo apt install openvpn easy-rsa -y
3. 第二步:设置证书颁发机构 (CA) 及证书
我们将使用 Easy-RSA 来创建和管理 OpenVPN 所需的 TLS 证书。
3.1 初始化 Easy-RSA 环境
# 创建一个工作目录
mkdir ~/easy-rsa
# 将 Easy-RSA 脚本链接到工作目录
ln -s /usr/share/easy-rsa/* ~/easy-rsa/
# 设置安全权限
chmod 700 ~/easy-rsa
# 进入工作目录
cd ~/easy-rsa
3.2 创建公钥基础设施 (PKI) 和 CA
# 初始化 PKI
./easyrsa init-pki
# 构建 CA 证书(nopass 选项表示不加密 CA 密钥)
# 系统会提示输入一个通用名称(Common Name),直接回车即可
./easyrsa build-ca nopass
3.3 生成服务器证书和密钥
# 1. 生成服务器证书请求(同样,直接回车使用默认名 server)
./easyrsa gen-req server nopass
# 2. 签署服务器证书(需要输入 "yes" 确认)
./easyrsa sign-req server server
3.4 生成客户端证书和密钥
为每个需要连接的客户端生成唯一的证书。
# 为 client1 生成证书
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
# 为 client2 生成证书
./easyrsa gen-req client2 nopass
./easyrsa sign-req client client2
3.5 生成加密相关参数
# 生成 Diffie-Hellman 参数,用于密钥交换
./easyrsa gen-dh
# 生成 HMAC 签名,防止 DoS 攻击
openvpn --genkey --secret pki/ta.key
3.6 将文件复制到 OpenVPN 目录
# 将所有必需的服务器端文件复制到 /etc/openvpn/
sudo cp pki/ca.crt /etc/openvpn/
sudo cp pki/issued/server.crt /etc/openvpn/
sudo cp pki/private/server.key /etc/openvpn/
sudo cp pki/dh.pem /etc/openvpn/
sudo cp pki/ta.key /etc/openvpn/
4. 第三步:配置 OpenVPN 服务器
我们将创建一个 server.conf 文件来定义服务器的行为。
# 创建并编辑服务器配置文件
sudo nano /etc/openvpn/server.conf
将以下内容完整复制到 server.conf 文件中:
# 端口和协议
port 1194
proto udp
dev tun
# 证书和密钥路径
ca ca.crt
cert server.crt
key server.key
dh dh.pem
# VPN 子网配置
server 10.8.0.0 255.255.255.0
# 将路由推送到客户端,使其可以访问其他客户端
push "route 10.8.0.0 255.255.255.0"
# 关键:允许客户端之间互相通信
client-to-client
# 保持连接
keepalive 10 120
# 加密配置
cipher AES-256-GCM
auth SHA256
tls-auth ta.key 0
# 权限和持久化
user nobody
group nogroup
persist-key
persist-tun
# 日志配置
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
```> **注意**: 创建日志目录以避免启动失败。
> ```bash
> sudo mkdir -p /var/log/openvpn
> ```
## 5. 第四步:配置服务器网络与防火墙
### 5.1 开启 IP 转发
```bash
# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.conf
# 找到并取消下面这行的注释(删除前面的 #)
# net.ipv4.ip_forward=1
net.ipv4.ip_forward=1
# 保存文件后,应用更改
sudo sysctl -p
5.2 配置防火墙 (UFW)
警告: 在启用防火墙前,请确保已允许 SSH 端口,否则可能会断开与服务器的连接。
sudo ufw allow OpenSSH
# 1. 允许 OpenVPN 默认端口
sudo ufw allow 1194/udp
# 2. 设置默认转发策略
sudo nano /etc/default/ufw
# 将 DEFAULT_FORWARD_POLICY 从 "DROP" 修改为 "ACCEPT"
DEFAULT_FORWARD_POLICY="ACCEPT"
# 3. 添加 NAT 转发规则
# 注意:将 eth0 替换为你的服务器公网网卡名称(可通过 ip a 命令查看)
sudo nano /etc/ufw/before.rules
# 在文件顶部的 *filter 之前,添加以下内容
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
# 4. 启用防火墙
sudo ufw enable
6. 第五步:启动并验证 OpenVPN 服务
# 启动 OpenVPN 服务
sudo systemctl start openvpn@server
# 设置开机自启
sudo systemctl enable openvpn@server
# 检查服务状态
sudo systemctl status openvpn@server
如果状态显示 active (running),则表示服务器端已成功启动。
7. 第六步:创建客户端配置文件
为了方便,我们将所有证书和密钥嵌入到一个 .ovpn 文件中。
7.1 创建基础配置文件
在服务器上创建一个基础配置文件 client.conf。
# 在主目录下创建一个临时目录
mkdir -p ~/client-configs/files
chmod 700 ~/client-configs
# 创建基础配置文件
nano ~/client-configs/base.conf
将以下内容粘贴到 base.conf 文件中,将 <你的服务器公网IP> 替换为实际 IP。
client
dev tun
proto udp
remote <你的服务器公网IP> 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3
7.2 编写脚本自动生成 .ovpn 文件
# 创建一个脚本文件
nano ~/client-configs/make_config.sh
将以下脚本内容粘贴进去:
#!/bin/bash
# 第一个参数是客户端名称,例如 client1
CLIENT=$1
# 基础配置文件路径
BASE_CONFIG=~/client-configs/base.conf
# Easy-RSA 工作目录
EASYRSA_DIR=~/easy-rsa
# 输出目录
OUTPUT_DIR=~/client-configs/files
# 检查客户端名称是否提供
if [ -z "$CLIENT" ]; then
echo "Usage: $0 <client-name>"
exit 1
fi
# 生成完整的 .ovpn 文件
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${EASYRSA_DIR}/pki/ca.crt \
<(echo -e '</ca>\n<cert>') \
${EASYRSA_DIR}/pki/issued/${CLIENT}.crt \
<(echo -e '</cert>\n<key>') \
${EASYRSA_DIR}/pki/private/${CLIENT}.key \
<(echo -e '</key>\n<tls-auth>') \
${EASYRSA_DIR}/pki/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${CLIENT}.ovpn
echo "Generated config file: ${OUTPUT_DIR}/${CLIENT}.ovpn"
7.3 生成两个客户端的配置文件
# 给脚本执行权限
chmod +x ~/client-configs/make_config.sh
# 生成 client1.ovpn
~/client-configs/make_config.sh client1
# 生成 client2.ovpn
~/client-configs/make_config.sh client2
现在,client1.ovpn 和 client2.ovpn 文件已生成在 ~/client-configs/files 目录下。
8. 第七步:客户端连接与测试
-
下载配置文件:使用
scp或sftp等工具,将client1.ovpn和client2.ovpn分别安全地下载到两台客户端设备上。# 例如,在你的本地电脑上执行 scp your_user@<你的服务器公网IP>:~/client-configs/files/client1.ovpn . scp your_user@<你的服务器公网IP>:~/client-configs/files/client2.ovpn . -
安装客户端软件:
- Windows: OpenVPN Connect 或 Community Client。
- macOS: Tunnelblick。
- Linux: 使用
sudo apt install openvpn或sudo yum install openvpn安装,然后通过sudo openvpn --config client1.ovpn连接。
-
导入并连接:
在两台客户端上分别导入对应的.ovpn配置文件并连接。 -
测试互通:
- 连接成功后,
client1会被分配 IP10.8.0.2,client2会被分配10.8.0.3(通常情况下)。 - 在
client1的命令行/终端上,pingclient2:ping 10.8.0.3 - 在
client2的命令行/终端上,pingclient1:ping 10.8.0.2
- 连接成功后,
如果两边都能 ping 通,则说明配置成功,两台主机已通过 OpenVPN 服务器实现了网络互通。