凌峰创科服务平台

CentOS如何搭建OpenVPN服务器?

重要提示:系统选择

虽然本教程以 CentOS 为例,但请注意:

CentOS如何搭建OpenVPN服务器?-图1
(图片来源网络,侵删)
  • CentOS 7 已于 2025 年 6 月 30 日停止维护,强烈建议使用 CentOS Stream 8/9 或 Rocky Linux / AlmaLinux,本教程在 CentOS Stream 8/9 和 Rocky Linux 9 上测试通过。
  • SELinux:CentOS 默认启用 SELinux,这会影响 OpenVPN 的正常运行,教程中会包含必要的 SELinux 配置。

第一部分:服务器端配置

步骤 1: 更新系统并安装依赖

登录到你的 CentOS 服务器,更新系统并安装 OpenVPN 和 easy-rsa

# 更新系统所有包
sudo dnf update -y
# 安装 OpenVPN 和 easy-rsa
sudo dnf install -y openvpn easy-rsa

步骤 2: 准备证书颁发机构 和密钥

我们需要创建一个私有的 CA 来签发服务器和客户端的证书。

  1. 创建一个工作目录

    # 创建一个 easy-rsa 的工作目录
    make-cadir ~/openvpn-ca
    cd ~/openvpn-ca
  2. 编辑 vars 文件: 这个文件用于设置 CA 的默认参数,比如国家、省份、城市、组织名等,为了方便,我们让这些参数在创建证书时自动填充。

    CentOS如何搭建OpenVPN服务器?-图2
    (图片来源网络,侵删)
    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@mycompany.com"
    set_var EASYRSA_REQ_OU          "MyOrganizationalUnit"

    保存并退出 (Ctrl+X, Y, Enter)。

  3. 初始化 PKI: 这会创建一个 pki 目录,里面存放所有的证书和密钥。

    ./easyrsa init-pki

    输出:

    CentOS如何搭建OpenVPN服务器?-图3
    (图片来源网络,侵删)
    ...
    init-pki complete; you may now create a CA or requests.
    Your newly created PKI dir is: /root/openvpn-ca/pki
  4. 构建 CA 证书: 这会创建一个根证书,用于签发所有其他证书。

    ./easyrsa build-ca nopass
    • nopass 表示 CA 私钥不设置密码,方便服务器自动启动,如果安全性要求极高,可以去掉此参数,但需要手动输入密码才能启动 OpenVPN。
    • 系统会提示你输入 Common Name (CN),直接按回车使用 vars 文件中设置的值。

    ~/openvpn-ca/pki/ca.crt~/openvpn-ca/pki/private/ca.key 已经生成。ca.key 是最核心的私钥,务必妥善保管!

步骤 3: 创建服务器证书和密钥

  1. 生成服务器证书请求

    ./easyrsa gen-req server nopass
    • server 是我们给服务器证书起的名字。
    • 同样,CN 直接回车使用默认值。
  2. 用 CA 签发服务器证书

    ./easyrsa sign-req server server

    系统会问你 Confirm request details: (y/n),输入 y 并回车,然后需要输入 CA 的密码(如果你在 build-ca 时设置了密码的话)。

  3. 创建强 Diffie-Hellman 密钥: 这用于增强前向保密性,过程可能需要几分钟时间。

    ./easyrsa gen-dh
  4. 生成 HMAC 密钥: 用于增加 TLS 认证层的安全性,防止 DDoS 攻击。

    openvpn --genkey --secret ta.key

至此,服务器端需要的所有证书和密钥都已生成在 ~/openvpn-ca/pki/ 目录下,我们需要将以下文件复制到 OpenVPN 的配置目录:

# 创建配置目录
sudo mkdir -p /etc/openvpn/server
# 复制服务器证书、密钥和DH文件
sudo cp pki/issued/server.crt /etc/openvpn/server/
sudo cp pki/private/server.key /etc/openvpn/server/
sudo cp pki/dh.pem /etc/openvpn/server/ # 文件名可能是 dh2048.pem 或类似
# 复制CA证书和HMAC密钥
sudo cp pki/ca.crt /etc/openvpn/server/
sudo cp ta.key /etc/openvpn/server/
# 设置正确的权限
sudo chmod 600 /etc/openvpn/server/*

步骤 4: 创建服务器配置文件

我们将创建一个主配置文件 server.conf

sudo nano /etc/openvpn/server/server.conf

粘贴进去,并根据需要修改注释部分:

# 监听地址和端口 (0.0.0.0 表示监听所有网卡)
port 1194
# 协议,推荐使用 UDP,速度更快,如需使用 TCP,请将下面两行注释掉
proto udp
# 如果使用 TCP,取消下面两行的注释
# proto tcp
# port 443
# 使用 TUN 虚拟网卡设备
dev tun
# CA 文件路径
ca ca.crt
# 服务器证书和密钥路径
cert server.crt
key server.key
# Diffie-Hellman 文件路径
dh dh.pem
# 网络配置:服务器将为客户端分配此网段的 IP 地址
# 10.8.0.0 是服务器内网,255.255.255.0 是子网掩码
server 10.8.0.0 255.255.255.0
# 推导客户端配置,使其能访问服务器后面的局域网
# 这会将客户端的网关指向 OpenVPN 服务器
push "redirect-gateway def1 bypass-dhcp"
# 推导 DNS 服务器地址,让客户端通过 VPN 解析域名
# 这里使用 Google DNS 和 Cloudflare DNS 作为示例
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 1.1.1.1"
# 保持客户端连接,120 秒内没有数据传输,则认为客户端断开
keepalive 10 120
# 使用 LZO 压缩数据
comp-lzo
# 用户和 OpenVPN 运行时使用的用户/组
# 为了安全,OpenVPN 不应以 root 身份运行
user nobody
group nobody
# 持久化密钥,避免重启时重新读取
persist-key
persist-tun
# 提高日志级别,方便排查问题
verb 3
# 启用 TLS 认证
tls-auth ta.key 0
# 指定使用的 OpenSSL 加密算法,推荐使用强加密套件
cipher AES-256-CBC
# 控制文件,用于防止服务重复启动
crl-verify crl.pem

步骤 5: 配置网络和防火墙

  1. 启用 IP 转发: 编辑 /etc/sysctl.conf 文件:

    sudo nano /etc/sysctl.conf

    找到 #net.ipv4.ip_forward=1 这一行,去掉 并确保其值为 1

    net.ipv4.ip_forward=1

    保存后,立即生效:

    sudo sysctl -p
  2. 配置防火墙: 使用 firewall-cmd 来开放端口并允许 NAT 转发。

    # 添加永久规则,开放 1194/udp 端口
    sudo firewall-cmd --permanent --add-port=1194/udp
    # 添加 MASQUERADE 规则,这是让服务器能将客户端流量转发到互联网的关键
    sudo firewall-cmd --permanent --add-masquerade
    # 重新加载防火墙使规则生效
    sudo firewall-cmd --reload
  3. 配置 SELinux: OpenVPN 需要访问网络和 TUN 设备,需要为其设置正确的 SELinux 上下文。

    # 允许 OpenVPN 绑定到非默认端口 (如 443)
    sudo semanage port -a -t openvpn_port_t -p tcp 443
    sudo semanage port
分享:
扫描分享到社交APP
上一篇
下一篇