# OpenVPN 完整部署流程与 Systemd 管理指南 本指南旨为从零开始部署 OpenVPN 客户端,并使用 Systemd 进行管理的完整流程。 ## 一、准备工作与依赖安装 ### 1.1 更新系统 ```bash sudo dnf update -y ``` ### 1.2 安装编译依赖 安装所有编译 OpenVPN 可能需要的开发包: ```bash sudo dnf install -y gcc make openssl-devel lzo-devel lz4-devel pam-devel systemd-devel libcap-ng-devel pkg-config ``` ## 二、编译安装 OpenVPN 2.6.10 ### 2.1 下载源码 ```bash cd /tmp wget https://github.com/OpenVPN/openvpn/releases/download/v2.6.10/openvpn-2.6.10.tar.gz tar -xf openvpn-2.6.10.tar.gz cd openvpn-2.6.10 ``` ### 2.2 配置编译选项 ```bash # 标准配置(启用所有功能) ./configure --prefix=/usr # 如果遇到 libcap-ng 问题,可禁用 DCO: # ./configure --prefix=/usr --disable-dco ``` ### 2.3 编译并安装 ```bash make sudo make install ``` ### 2.4 验证安装 ```bash openvpn --version # 应显示:OpenVPN 2.6.10 x86_64-pc-linux-gnu ``` ## 三、配置文件准备 ### 3.1 创建配置目录 ```bash sudo mkdir -p /etc/openvpn/client ``` ### 3.2 放置配置文件 将你的 OpenVPN 客户端配置文件重命名为 `client.ovpn` 并放置: ```bash sudo cp /path/to/your/config.ovpn /etc/openvpn/client.ovpn ``` ### 3.3 配置认证文件 创建认证文件(包含用户名和密码): ```bash sudo bash -c "cat > /etc/openvpn/client/auth.txt << 'EOF' qdvpn4 Qdtd@9683556 EOF" # 设置严格的权限 sudo chmod 600 /etc/openvpn/client/auth.txt sudo chown root:root /etc/openvpn/client/auth.txt ``` ### 3.4 验证文件结构 ```bash tree /etc/openvpn # 应该看到: # /etc/openvpn/ # ├── client.ovpn # └── client # └── auth.txt ``` ## 四、Systemd 服务配置 ### 4.1 创建服务文件 使用经过验证的配置: ```bash sudo tee /etc/systemd/system/openvpn-client.service > /dev/null << 'EOF' [Unit] Description=OpenVPN Client Connection After=network.target Wants=network-online.target Documentation=man:openvpn(8) [Service] Type=simple WorkingDirectory=/etc/openvpn ExecStart=/usr/sbin/openvpn --config client.ovpn --auth-user-pass /etc/openvpn/client/auth.txt --log /var/log/openvpn-client.log ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=5s # 安全加固 PrivateTmp=true NoNewPrivileges=true ProtectSystem=strict ReadWritePaths=/etc/openvpn /var/log ProtectHome=true [Install] WantedBy=multi-user.target EOF ``` ### 4.2 创建日志文件并设置权限 ```bash sudo touch /var/log/openvpn-client.log sudo chmod 644 /var/log/openvpn-client.log ``` ### 4.3 配置日志轮转 ```bash sudo tee /etc/logrotate.d/openvpn-client > /dev/null << 'EOF' /var/log/openvpn-client.log { weekly rotate 4 compress delaycompress missingok notifempty create 644 root root postrotate systemctl kill -s HUP openvpn-client 2>/dev/null || true endscript } EOF ``` ## 五、服务管理与测试 ### 5.1 启动并启用服务 ```bash # 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动 OpenVPN 客户端服务 sudo systemctl start openvpn-client # 设置开机自启 sudo systemctl enable openvpn-client # 检查服务状态 sudo systemctl status openvpn-client ``` ### 5.2 服务管理命令速查 | 操作 | 命令 | 说明 | |------|------|------| | **启动服务** | `sudo systemctl start openvpn-client` | 启动 VPN 连接 | | **停止服务** | `sudo systemctl stop openvpn-client` | 停止 VPN 连接 | | **重启服务** | `sudo systemctl restart openvpn-client` | 重启 VPN 连接 | | **查看状态** | `sudo systemctl status openvpn-client` | 查看运行状态 | | **启用自启** | `sudo systemctl enable openvpn-client` | 设置开机自启 | | **禁用自启** | `sudo systemctl disable openvpn-client` | 取消开机自启 | | **查看日志** | `sudo journalctl -u openvpn-client -f` | 实时查看日志 | | **查看文件日志** | `sudo tail -f /var/log/openvpn-client.log` | 查看原生日志 | | **重新加载配置** | `sudo systemctl reload openvpn-client` | 重载配置文件 | ### 5.3 连接验证 ```bash # 检查虚拟网络接口 ip addr show tun0 # 检查 VPN 路由 ip route | grep tun0 # 测试 VPN 内网连通性 ping -c 4 192.168.1.5 # 测试 SSH 隧道(如配置了端口转发) ssh -p 10005 admin@localhost ``` ## 六、故障排查指南 ### 6.1 服务启动失败 ```bash # 查看详细错误信息 sudo journalctl -u openvpn-client -xe # 手动测试配置文件 cd /etc/openvpn sudo openvpn --config client.ovpn --auth-user-pass client/auth.txt ``` ### 6.2 常见问题解决 #### 问题 1:权限错误 ```bash # 检查认证文件权限 ls -la /etc/openvpn/client/auth.txt # 应为:-rw------- 1 root root # 修复权限 sudo chmod 600 /etc/openvpn/client/auth.txt ``` #### 问题 2:配置文件路径错误 ```bash # 验证所有必要文件存在 ls -la /etc/openvpn/client.ovpn ls -la /etc/openvpn/client/auth.txt ``` #### 问题 3:依赖库缺失 ```bash # 检查 openvpn 链接的库 ldd $(which openvpn) # 重新安装依赖 sudo dnf reinstall openssl-devel lzo-devel lz4-devel ``` #### 问题 4:日志文件问题 ```bash # 确保日志目录存在且有权限 sudo mkdir -p /var/log sudo touch /var/log/openvpn-client.log sudo chmod 644 /var/log/openvpn-client.log ``` ### 6.3 快速诊断命令 ```bash # 综合检查 ./vpn-check.sh ``` ## 七、部署检查清单 - 系统已更新:`sudo dnf update -y` - 所有依赖包已安装 - OpenVPN 2.6.10 编译安装成功 - 配置文件 `/etc/openvpn/client.ovpn` 存在 - 认证文件 `/etc/openvpn/client/auth.txt` 存在且权限为 600 - Systemd 服务文件已正确配置 - 日志文件可写:`/var/log/openvpn-client.log` - 服务能正常启动:`systemctl status` 显示 active (running) - VPN 接口 tun0 已创建 - VPN 内网路由已添加 - 能 ping 通 VPN 内网地址 ## 八、一键部署脚本 ```bash #!/bin/bash # openvpn-quick-deploy.sh set -e echo "=== OpenVPN 客户端一键部署脚本 ===" # 变量配置 VPN_USER="qdvpn4" VPN_PASS="Qdtd@9683556" OVPN_CONFIG_PATH="/path/to/your/config.ovpn" # 1. 安装依赖 echo "步骤 1/6: 安装依赖包..." sudo dnf install -y gcc make openssl-devel lzo-devel lz4-devel pam-devel systemd-devel libcap-ng-devel pkg-config # 2. 编译安装 OpenVPN echo "步骤 2/6: 编译安装 OpenVPN 2.6.10..." cd /tmp wget -q https://github.com/OpenVPN/openvpn/releases/download/v2.6.10/openvpn-2.6.10.tar.gz tar -xf openvpn-2.6.10.tar.gz cd openvpn-2.6.10 ./configure --prefix=/usr make -j$(nproc) sudo make install # 3. 准备配置文件 echo "步骤 3/6: 准备配置文件..." sudo mkdir -p /etc/openvpn/client sudo cp "$OVPN_CONFIG_PATH" /etc/openvpn/client.ovpn # 4. 创建认证文件 echo "步骤 4/6: 创建认证文件..." sudo bash -c "cat > /etc/openvpn/client/auth.txt << EOF $VPN_USER $VPN_PASS EOF" sudo chmod 600 /etc/openvpn/client/auth.txt # 5. 配置 Systemd 服务 echo "步骤 5/6: 配置 Systemd 服务..." sudo tee /etc/systemd/system/openvpn-client.service > /dev/null << EOF [Unit] Description=OpenVPN Client Connection After=network.target Wants=network-online.target [Service] Type=simple WorkingDirectory=/etc/openvpn ExecStart=/usr/sbin/openvpn --config client.ovpn --auth-user-pass /etc/openvpn/client/auth.txt --log /var/log/openvpn-client.log Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target EOF # 6. 启动服务 echo "步骤 6/6: 启动服务..." sudo systemctl daemon-reload sudo systemctl start openvpn-client sudo systemctl enable openvpn-client echo "=== 部署完成 ===" echo "服务状态: sudo systemctl status openvpn-client" echo "查看日志: sudo journalctl -u openvpn-client -f" ```