凌峰创科服务平台

Linux OpenVPN服务器如何快速搭建?

概述

搭建 OpenVPN 服务器的核心步骤如下:

Linux OpenVPN服务器如何快速搭建?-图1
(图片来源网络,侵删)
  1. 环境准备:更新系统,安装必要的软件包。
  2. 安装 OpenVPN:安装 OpenVPN 服务端和客户端工具。
  3. 配置 CA 和证书:创建一个简单的证书颁发机构,并为服务器和每个客户端生成唯一的证书和密钥,这是保证安全通信的关键。
  4. 配置服务器:编辑 OpenVPN 的主配置文件 server.conf
  5. 启动服务:使用 systemd 启动并启用 OpenVPN 服务。
  6. 配置客户端:生成客户端配置文件,方便客户端连接。
  7. 安全加固:配置防火墙和 IP 转发,确保服务器安全且客户端能正确访问网络。
  8. 客户端连接测试:使用客户端软件进行连接测试。

第一步:环境准备

登录到你的 Linux 服务器(建议使用具有 sudo 权限的非 root 用户)。

  1. 更新系统包列表

    sudo apt update && sudo apt upgrade -y
  2. 安装必要的工具 我们需要 wget 来下载 easy-rsagit(可选),以及 unzip

    sudo apt install -y wget git unzip

第二步:安装 OpenVPN 和 Easy-RSA

OpenVPN 的包通常包含在官方仓库中,而 easy-rsa 是一个用于管理 PKI (Public Key Infrastructure) 的工具,用于生成证书。

Linux OpenVPN服务器如何快速搭建?-图2
(图片来源网络,侵删)
  1. 安装 OpenVPN

    sudo apt install -y openvpn
  2. 下载并设置 Easy-RSA v3 我们从 GitHub 获取最新的 easy-rsa,因为它比旧版本更强大、更安全。

    # 创建一个工作目录
    mkdir ~/easyrsa && cd ~/easyrsa
    # 下载并解压
    wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.7/EasyRSA-v3.1.7.tgz
    tar xzf EasyRSA-v3.1.7.tgz
    mv EasyRSA-v3.1.7/* .
    rm -rf EasyRSA-v3.1.7.tgz EasyRSA-v3.1.7
    # 为了方便使用,创建一个软链接
    sudo ln -s ~/easyrsa/easyrsa /usr/local/bin/

第三步:配置 PKI 和生成证书

这是整个过程中最核心的部分,我们将创建一个根证书(CA),并用它来签发服务器和客户端的证书。

  1. 初始化 PKI

    Linux OpenVPN服务器如何快速搭建?-图3
    (图片来源网络,侵删)
    cd ~/easyrsa
    easyrsa init-pki

    这会在当前目录下创建一个 pki 文件夹,用于存放所有证书和密钥。

  2. 构建 CA (Certificate Authority) CA 是信任的根,用于签发所有其他证书,请务必为 ca.key 设置一个强密码并妥善保存。

    easyrsa build-ca nopass
    • nopass:为了方便服务器自动启动,我们这里不设置 CA 密码。在生产环境中,强烈建议设置密码。
    • 过程中会提示你输入一个 Common Name (CN),可以直接按回车使用默认值(如 Easy-RSA CA)。
  3. 为服务器生成证书和密钥

    easyrsa gen-req server nopass
    • 同样,为 server.key 不设置密码。
    • 输入 Common Name,可以设置为 server 或你的服务器域名/IP。
  4. 为服务器证书签名 使用 CA 来签发服务器的请求,生成一个完整的证书。

    easyrsa sign-req server server
    • 这里会要求你输入之前设置的 CA 密码
  5. 为客户端生成证书和密钥 每个客户端都需要一个唯一的证书,这里我们为第一个客户端 client1 生成。

    # 回到 easyrsa 目录
    cd ~/easyrsa
    # 生成客户端请求(可以为 client.key 设置密码,但连接时需要输入,这里为了方便也使用 nopass)
    easyrsa gen-req client1 nopass
    # 使用 CA 签名客户端请求(需要输入 CA 密码)
    easyrsa sign-req client client1
  6. 生成 Diffie-Hellman 参数 这个参数用于增强前向安全性,防止密钥在未来被破解。

    easyrsa gen-dh
    • 注意:这个过程可能需要几分钟到几十分钟,具体取决于服务器的 CPU 性能。
  7. 生成 HMAC 密钥 用于增强 TLS 认证的安全性,防止 DoS 攻击。

    openvpn --genkey --secret pki/ta.key
  8. 整理证书和密钥文件 为了方便管理,我们将所有生成的必要文件复制到一个单独的目录。

    mkdir -p ~/openvpnccd
    cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem pki/ta.key ~/openvpnccd/

第四步:配置 OpenVPN 服务器

  1. 复制并编辑服务器配置文件 OpenVPN 提供了一个示例配置文件,我们基于它进行修改。

    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

    编辑 server.conf 文件,确保以下配置项正确:

    port 1194
    proto udp
    dev tun
    # 使用我们生成的证书和密钥路径
    ca /root/openvpnccd/ca.crt
    cert /root/openvpnccd/server.crt
    key /root/openvpnccd/server.key  # This file should be kept secret
    dh /root/openvpnccd/dh.pem
    server 10.8.0.0 255.255.255.0
    ifconfig-pool-persist /var/log/openvpn/ipp.txt
    # 推送路由和 DNS
    push "redirect-gateway def1 bypass-dhcp"
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 8.8.4.4"
    keepalive 10 120
    tls-crypt /root/openvpnccd/ta.key
    cipher AES-256-CBC
    auth SHA256
    user nobody
    group nogroup
    persist-key
    persist-tun
    status /var/log/openvpn/openvpn-status.log
    log-append /var/log/openvpn/openvpn.log
    verb 3
    explicit-exit-notify 1

    关键配置解释

    • proto udp:推荐使用 UDP,因为它更高效、更能丢包。
    • server 10.8.0.0 255.255.255.0:定义了 VPN 客户端将获得的虚拟 IP 地址段。
    • push "redirect-gateway def1"非常重要,这会让客户端的所有网络流量都通过 VPN 服务器。
    • push "dhcp-option DNS ...":为客户端指定 DNS 服务器,防止 DNS 泄漏。
    • tls-crypt /root/openvpnccd/ta.key:使用我们生成的 HMAC 密钥,增强安全性。
    • cipher AES-256-CBCauth SHA256:指定加密和认证算法,是当前的安全标准。
  2. 创建客户端配置目录 这个目录用于存放客户端的证书和配置文件。

    sudo mkdir -p /etc/openvpn/ccd
    # 这个目录是可选的,用于为特定客户端分配固定的静态 IP

第五步:启动 OpenVPN 服务

  1. 配置 IP 转发 为了让 VPN 客户端能够访问互联网,服务器需要开启 IP 转发功能。

    # 编辑 sysctl.conf
    sudo nano /etc/sysctl.conf
    # 取消注释或添加下面这行
    net.ipv4.ip_forward=1

    立即生效:

    sudo sysctl -p
  2. 配置防火墙 (UFW) 允许 OpenVPN 端口和 NAT 转发。

    # 允许 SSH 连接(如果你还没有允许)
    sudo ufw allow OpenSSH
    # 允许 UDP 1194 端口
    sudo ufw allow 1194/udp
    # 允许转发规则(在 UFW 中启用转发)
    sudo nano /etc/default/ufw
    # 找到 DEFAULT_FORWARD_POLICY 这一行,将其改为 "ACCEPT"
    DEFAULT_FORWARD_POLICY="ACCEPT"
    # 创建一个 UFW 规则来伪装 NAT 流量
    sudo nano /etc/ufw/before.rules
    # 在文件开头的 `*filter` 之前,添加以下内容:
    #
    # rules.before
    #
    # rules that should be run before the ufw command line added rules. see
    # ufw-framework(8) for a description of how this file works.
    #
    # START UFW AND IPTABLES RULES
    #
    # Don't delete these required lines, otherwise there will be errors
    *filter
    :ufw-before-input - [0:0]
    :ufw-before-forward - [0:0]
    :ufw-before-output - [0:0]
    :ufw-not-input - [0:0]
    :ufw-not-forward - [0:0]
    :ufw-not-output - [0:0]
    :ufw-user-input - [0:0]
    :ufw-user-forward - [0:0]
    :ufw-user-output - [0:0]
    :ufw-after-input - [0:0]
    :ufw-after-forward - [0:0]
    :ufw-after-output - [0:0]
    # End required lines
    # NAT rules for OpenVPN
    # *nat
    # :POSTROUTING ACCEPT [0:0]
    # -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    # COMMIT
    # 在文件末尾,在 `COMMIT` 之后,添加以下 NAT 规则:
    # START OPENVPN RULES
    # NAT table rules
    *nat
    :POSTROUTING ACCEPT [0:0]
    # Allow traffic from VPN to the internet
    -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    COMMIT
    # END OPENVPN RULES
    # Don't delete these required lines, otherwise there will be errors
    COMMIT
    #
    # END UFW AND IPTABLES RULES
  3. 启用并启动 OpenVPN 服务

    # 使用 systemd 启动服务
    sudo systemctl start openvpn@server
    # 设置开机自启
    sudo systemctl enable openvpn@server
    # 检查服务状态
    sudo systemctl status openvpn@server

    如果看到 active (running),说明服务已成功启动。


第六步:生成客户端配置文件

我们需要为客户端创建一个 client.ovpn 文件,以便他们可以轻松地连接到 VPN。

  1. 创建客户端配置文件 在服务器上创建一个目录来存放客户端配置,然后生成文件。

    mkdir -p ~/clients
    nano ~/clients/client1.ovpn
  2. client1.ovpn 文件中添加内容 将以下内容粘贴进去,并确保路径正确。

    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
    key-direction 1
    script-security 3
    verb 3
    # <--- 在下面添加证书和密钥内容 <---
    <ca>
    -----BEGIN CERTIFICATE-----
    # 将 /root/openvpnccd/ca.crt 文件中的所有内容(包括头尾)复制到这里
    -----END CERTIFICATE-----
    </ca>
    <cert>
    -----BEGIN CERTIFICATE-----
    # 将 /root/easyrsa/pki/issued/client1.crt 文件中的所有内容复制到这里
    -----END CERTIFICATE-----
    </cert>
    <key>
    -----BEGIN PRIVATE KEY-----
    # 将 /root/easyrsa/pki/private/client1.key 文件中的所有内容复制到这里
    -----END PRIVATE KEY-----
    </key>
    <tls-crypt>
    -----BEGIN OpenVPN Static key V1-----
    # 将 /root/openvpnccd/ta.key 文件中的所有内容复制到这里
    -----END OpenVPN Static key V1-----
    </tls-crypt>

    重要

    • remote YOUR_SERVER_IP 1194:这是最关键的一步,必须替换成你服务器的公网 IP 地址或域名。
    • key-direction 1:当使用 tls-crypt 时,客户端必须设置为 1
    • <ca>, <cert>, <key>, <tls-crypt> 标签内的内容替换为对应文件的实际内容。
  3. 传输文件 使用 scp 或 SFTP 将 ~/clients/client1.ovpn 文件下载到你的本地电脑。

    # 在你的本地电脑终端执行
    scp user@YOUR_SERVER_IP:~/clients/client1.ovpn .

第七步:客户端连接测试

  1. 安装 OpenVPN 客户端

    • Windows: 从 openvpn.net 下载并安装 OpenVPN GUI。
    • macOS: 使用 TunnelblickHomebrew 安装 openvpn
    • Android/iOS: 从应用商店下载 "OpenVPN Connect"。
  2. 导入配置 将下载的 client1.ovpn 文件复制到客户端设备,然后导入到 OpenVPN 客户端中。

  3. 连接 启动 OpenVPN 客户端,选择 client1 配置并连接,如果一切正常,客户端应该能成功获取到 8.0.x 网段的 IP,并且你的所有网络流量都会通过 VPN 服务器。

  4. 验证 打开浏览器,访问 ipleak.netdnsleaktest.com,检查你的 IP 地址和 DNS 服务器是否已更改为服务器的 IP 和你配置的 DNS。


总结与后续步骤

恭喜!你已经成功搭建了一个功能齐全的 OpenVPN 服务器。

后续可以做的优化

  • 为更多用户创建证书:重复第三步的 5 和第六步,为每个新用户生成唯一的证书和配置文件。
  • 使用用户名/密码认证:可以结合 PAM 和插件实现双因素认证,即除了证书,还需要用户名和密码。
  • 配置客户端固定 IP:在 /etc/openvpn/ccd/ 目录下创建一个与客户端 Common Name 同名的文件(如 client1),在其中写入 ifconfig-push 10.8.0.2 255.255.255.252,即可为该客户端分配固定 IP。
  • 日志监控:定期检查 /var/log/openvpn/openvpn.log 文件,排查连接问题。
  • 考虑使用 firewalld:如果你使用的是 CentOS/RHEL,防火墙配置会略有不同,需要使用 firewall-cmd 来设置。

这个教程提供了一个坚实的基础,你可以根据需要进行扩展和加固。

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