OpenVPN 服务器搭建(双客户端互通)

本指南将详细介绍如何在一台 Linux 服务器上安装和配置 OpenVPN,并生成两个客户端的配置文件,使这两个客户端连接后可以互相访问。

目录

  1. 准备工作
  2. 第一步:安装 OpenVPN 和 Easy-RSA
  3. 第二步:设置证书颁发机构 (CA) 及证书
  4. 第三步:配置 OpenVPN 服务器
  5. 第四步:配置服务器网络与防火墙
  6. 第五步:启动并验证 OpenVPN 服务
  7. 第六步:创建客户端配置文件
  8. 第七步:客户端连接与测试

1. 准备工作

  • 一台服务器:拥有公网 IP,建议使用 Debian 11/12 或 Ubuntu 20.04/22.04。
  • Root 权限:拥有服务器的 rootsudo 权限。
  • 两台客户端设备:例如两台 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.ovpnclient2.ovpn 文件已生成在 ~/client-configs/files 目录下。

8. 第七步:客户端连接与测试

  1. 下载配置文件:使用 scpsftp 等工具,将 client1.ovpnclient2.ovpn 分别安全地下载到两台客户端设备上。

    # 例如,在你的本地电脑上执行
    scp your_user@<你的服务器公网IP>:~/client-configs/files/client1.ovpn .
    scp your_user@<你的服务器公网IP>:~/client-configs/files/client2.ovpn .
  2. 安装客户端软件

    • Windows: OpenVPN Connect 或 Community Client。
    • macOS: Tunnelblick
    • Linux: 使用 sudo apt install openvpnsudo yum install openvpn 安装,然后通过 sudo openvpn --config client1.ovpn 连接。
  3. 导入并连接
    在两台客户端上分别导入对应的 .ovpn 配置文件并连接。

  4. 测试互通

    • 连接成功后,client1 会被分配 IP 10.8.0.2client2 会被分配 10.8.0.3(通常情况下)。
    • client1 的命令行/终端上,ping client2
      ping 10.8.0.3
    • client2 的命令行/终端上,ping client1
      ping 10.8.0.2

如果两边都能 ping 通,则说明配置成功,两台主机已通过 OpenVPN 服务器实现了网络互通。