Linux 一键搭建 OpenVPN 服务器
前言
随着工作的多样化,办公场地也不局限于公司,有些时候往往需要在家或者公共场所(远程办公)访问公司的内网服务器资源,出于网络安全考虑,互联网不能直接访问公司的内网资源,常见解决方案就是部署 VPN 服务器。本文基于 OpenVPN 搭建 VPN 服务器,搭建好之后可以使用 OpenVPN 客户端连接 VPN 服务器,这样就可以安全地访问 VPN 服务器的内网资源。
开源项目
背景说明
运维面板的高权限风险
运维面板通常拥有极高的权限,一旦被非法访问,攻击者几乎可以完全控制服务器,安全风险极高。以下是几种常见的 Web 面板及其权限范围:
宝塔面板
:拥有服务器root
权限,可对系统进行完全控制。Portainer
:掌管 Docker 的管理权限,能够管理所有容器和镜像。Proxmox VE
:具备对服务器的完整控制权,包括虚拟机和存储管理。phpMyAdmin
:负责 MySQL 数据库的管理,拥有数据库的完全操作权限。
运维面板的安全脆弱性
- 一些 Web 面板需要开放公网访问,例如宝塔面板,它引入了多种鉴权和防护机制,能够在一定程度上抵御攻击。然而,历史上仍然发生过多次严重安全漏洞事件。
- 大多数 Web 面板的鉴权方式较为简单,通常只是一个 Web 登录框,防护强度较低。甚至部分面板并未考虑公网访问的安全性,例如 Portainer 官方明确表示其内置鉴权机制不适用于生产环境,并强烈不建议将其直接暴露在公网。
- 因此,如果这些鉴权机制较弱的 Web 面板直接开放到公网,将存在极大的安全隐患。
基于 VPN 的安全防护
- VPN 是一种企业级的成熟加密通信技术,本文推荐使用 开源的 OpenVPN,其代码公开透明,安全性经过长期验证。通过在 Web 面板外层套一层 VPN,不论服务本身的安全性如何,整体访问环境都能得到有效保护。
- 使用 VPN 保护 Web 面板的访问是最便捷且安全的方案。其原理十分简单:对于不希望暴露在公网的服务(如高权限管理面板、私人 Web 服务),可以使用防火墙或安全组阻止外网访问。然后,部署一个 VPN 服务器,使管理者在连接 VPN 后,仿佛置身于服务器的内网环境,从而安全访问这些服务。
OpenVPN 的应用场景
- 个人出差办公需要访问公司内网的服务器。
- 公司不同地区之间建立安全的网络通信(比如 IDC 与 IDC 之间安全通信)。
OpenVPN 服务器部署
这里使用的是 OpenVPN 自动安装脚本,大家可能认为脚本安装并不能保证安全性。但实际上,OpenVPN 的安全性是由 RSA 技术提供的,安装脚本每次安装都会现场生成 RSA 密钥,安全性是有保障的。使用脚本只是方便部署操作,对于个人应用场景,脚本提供的默认设置已经足够使用。该脚本支持 Ubuntu、Debian、AlmaLinux、Rocky Linux、CentOS、Fedora 系统。特别注意,如果使用的是虚拟化容器,则需要给容器开启 TUN/TAP。
下载安装脚本
1 | wget https://raw.githubusercontent.com/hwdsl2/openvpn-install/master/openvpn-install.sh -O openvpn.sh |
运行安装脚本
- 使用
root
权限运行脚本,并使用默认选项自动安装(不推荐)OpenVPN 服务器
1 | sudo bash openvpn.sh --auto |
- 或者使用自定义选项进行交互式安装(强烈推荐),自定义选项包括:VPN 服务器的域名、协议(TCP/UDP)和端口、VPN 客户端的 DNS 服务器以及第一个客户端的名称
1 | sudo bash openvpn.sh |
- 当安装脚本执行成功后,会在运行目录下自动生成一个
客户端名.ovpn
的文件(默认是client.ovpn
),该文件就是 OpenVPN 客户端的连接配置文件,将其下载到本地,然后导入到 OpenVPN 客户端就可以连接 OpenVPN 服务器。
提示
执行 openvpn.sh
安装脚本后,会从 GitHub 下载相应的文件资源;如果安装脚本执行失败,可能是网络访问 GitHub 较慢导致的,建议再次尝试执行安装脚本。
防火墙开放端口
- 当云服务器有外部防火墙(比如安全组),则需要手动调整安全组的配置,也就是开放安全组对应的协议和对应的端口,具体的协议和端口请根据上面的安装选项来配置。
- 当 Linux 服务器内有防火墙(比如
UFW
),则需要手动调整安全组的配置,也就是开放安全组对应的协议和对应的端口,具体的协议和端口请根据上面的安装选项来配置。 - 比如,使用
openvpn.sh --auto
命令自动安装 OpenVPN 服务器后(基于默认安装选项),云服务器的安全组或者 Linux 服务器的防火墙都需要开放 UDP 协议的1194
端口。- Debian 开放 OpenVPN 端口:
sudo ufw allow 1194/udp
- CentOS 开放 OpenVPN 端口:
sudo firewall-cmd --zone=public --permanent --add-port=1194/udp
- Debian 开放 OpenVPN 端口:
OpenVPN 的日常管理
- 安装脚本提供了以下命令行参数,可以用于管理 OpenVPN 服务器
1 | # 查看脚本的参数 |
1 | Usage: bash openvpn.sh [options] |
- 查看所有 OpenVPN 客户端
1 | sudo bash openvpn.sh --listclients |
- 移除指定的 OpenVPN 客户端
1 | sudo bash openvpn.sh --revokeclient client_name |
- 添加 OpenVPN 客户端
1 | sudo bash openvpn.sh --addclient client_name |
- 卸载 OpenVPN 服务器
1 | sudo bash openvpn.sh --uninstall |
为了日后更方便地执行安装脚本来管理 OpenVPN 服务器,可以将安装脚本移动到 Linux 系统的
bin
目录下,如下所示:
1 | # 移动脚本文件 |
OpenVPN 客户端安装
各平台安装 GUI 客户端
- (1) OpenVPN 客户端 在 Windows、macOS、iOS、Android 和 Linux 上均可用,macOS 用户还可以使用 Tunnelblick 作为 OpenVPN 客户端。
- (2) OpenVPN 客户端要连接 OpenVPN 服务器,首先将生成的
客户端名.ovpn
文件安全地下载到本地设备,然后打开 OpenVPN 客户端程序,并导入 OpenVPN 客户端的配置文件(比如client.ovpn
)。 - (3) 当 OpenVPN 服务器需要管理 OpenVPN 客户端时,可以再次运行安装脚本,比如,查看所有 OpenVPN 客户端:
sudo bash openvpn.sh --listclients
。
CentOS 7 安装 GUI 客户端
值得一提的是,如果 Centos 7 不需要使用 GUI 客户端,那么可以直接官方提供的 OpenVPN 3,也就是基于命令行的方式连接 OpenVPN 服务器。
- 关闭 SELINUX
1 | # 方法一(临时关闭) |
- 安装客户端(GUI)
1 | sudo yum install NetworkManager-openvpn |
- 导入
.ovpn
文件
1 | (1) 系统菜单栏导航到 settings -> network -> 点击 VPN 旁边的 + 号 -> Import form file |
参考资料
一键安装 OpenVPN 服务器
手动安装 OpenVPN 服务器
Docker 安装 OpenVPN 服务器
CentOS 7 安装 OpenVPN 客户端