在Linux系统中搭建VPN服务器是企业或个人用户保障数据安全、实现远程访问的常用方式,以下以OpenVPN为例,详细介绍在Linux(以Ubuntu 20.04 LTS为例)环境下搭建VPN服务器的完整流程,包括环境准备、安装配置、证书生成及客户端连接等关键步骤。

环境准备
-
系统要求:确保Linux服务器已更新至最新状态,推荐使用Ubuntu 20.04 LTS或CentOS 7等稳定版本,具备公网IP地址(或已正确配置端口转发),且开放TCP/1194端口(OpenVPN默认端口)。
-
安装依赖:
- Ubuntu/Debian系统:
sudo apt update && sudo apt install -y openvpn easy-rsa openssl
- CentOS/RHEL系统:
sudo yum install -y openvpn easy-rsa openssl
- Ubuntu/Debian系统:
-
创建证书目录:
为便于管理,创建证书存放目录并复制Easy-RSA模板文件:mkdir -p ~/openvpn-ca && cp -r /usr/share/easy-rsa/* ~/openvpn-ca/ cd ~/openvpn-ca/
生成CA证书与服务器证书
VPN的安全性依赖于证书体系,需依次生成CA证书、服务器证书及Diffie-Hellman参数。
-
初始化PKI架构:
编辑vars文件,配置证书默认参数(如国家、组织、邮箱等),或直接运行以下命令生成临时变量:export EASY_RSA="`pwd`" export VARS_FILE="$EASY_RSA/vars" echo "set_var EASY_RSA \"$EASY_RSA\"" >vars echo "set_var KEY_SIZE 2048" >>vars echo "set_var DAYS 3650" >>vars
-
构建CA证书:
./easyrsa init-pki ./easyrsa build-ca nopass #nopass表示不设置CA密码,根据需求选择
执行后会在
pca/ca.crt生成CA证书文件,需将其复制到OpenVPN配置目录。 -
生成服务器证书:
./easyrsa gen-req server nopass #生成服务器私钥与请求文件 ./easyrsa sign-req server server #使用CA证书签署服务器请求
签署完成后,会生成
pca/issued/server.crt和pca/private/server.key(私钥需严格保密)。 -
生成Diffie-Hellman参数:
用于增强密钥交换安全性,过程较耗时,请耐心等待:./easyrsa gen-dh
生成的
pca/dh.pem文件需复制到配置目录。
配置OpenVPN服务
-
创建服务器配置文件:
复制OpenVPN模板配置文件并修改:sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ sudo gzip -d /etc/openvpn/server.conf.gz sudo nano /etc/openvpn/server.conf
关键配置项如下:
配置项 说明 port 1194监听端口,默认为TCP 1194,可修改为其他端口(需同步防火墙规则) proto tcp传输协议,可选TCP(更稳定)或UDP(更快) dev tun虚拟网卡类型,tun为三层路由模式,tap为二层桥接模式 ca /etc/openvpn/ca.crtCA证书路径(需将之前生成的ca.crt复制到该目录) cert /etc/openvpn/server.crt服务器证书路径 key /etc/openvpn/server.key服务器私钥路径(权限需设置为600) dh /etc/openvpn/dh.pemDH参数文件路径 server 10.8.0.0 255.255.255.0定义VPN客户端IP段,可根据需求调整 push "redirect-gateway def1"客户端所有流量通过VPN转发 push "dhcp-option DNS 8.8.8.8"为客户端指定DNS服务器(如Google DNS) keepalive 10 120保活机制,每10秒检测一次,120秒无响应则断开连接 comp-lzo启用LZO压缩,提升传输效率 user nobodygroup nogroup以低权限用户运行,提升安全性persist-keypersist-tun防止连接中断时重新读取密钥或重启网卡 -
配置系统转发:
编辑/etc/sysctl.conf文件,取消注释net.ipv4.ip_forward=1,然后执行sudo sysctl -p启用IP转发。 -
设置防火墙规则:
sudo ufw allow 1194/tcp #开放VPN端口 sudo ufw allow OpenSSH #确保SSH连接不受影响 sudo ufw enable #启用防火墙
启动服务与客户端配置
-
启动OpenVPN服务:
sudo systemctl start openvpn@server sudo systemctl enable openvpn@server #设置开机自启
-
生成客户端证书:
在CA目录下为每个客户端生成独立证书(以client1为例):cd ~/openvpn-ca ./easyrsa gen-req client1 nopass ./easyrsa sign-req client client1
将
pca/issued/client1.crt、pca/private/client1.key及pca/ca.crt复制到客户端设备。 -
创建客户端配置文件:
在服务器上创建client1.ovpn如下:client dev tun proto tcp remote 服务器公网IP 1194 #替换为实际服务器IP resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server cipher AES-256-CBC comp-lzo key-direction 1 <ca> -----BEGIN CERTIFICATE----- [此处粘贴ca.crt内容] -----END CERTIFICATE----- </ca> <cert> -----BEGIN CERTIFICATE----- [此处粘贴client1.crt内容] -----END CERTIFICATE----- </cert> <key> -----BEGIN PRIVATE KEY----- [此处粘贴client1.key内容] -----END PRIVATE KEY----- </key>
客户端连接
将client1.ovpn文件导入OpenVPN客户端(如Windows的OpenVPN GUI、Android/iOS的OpenVPN Connect APP),启动连接即可获得VPN访问权限。
相关问答FAQs
Q1: 如何限制VPN客户端只能访问特定资源?
A1: 可通过修改server.conf中的push指令实现,若只允许客户端访问公司内网192.168.1.0/24网段,可添加以下配置:
route 192.168.1.0 255.255.255.0 push "route 192.168.1.0 255.255.255.0"
同时确保服务器已配置正确的路由转发规则,并在防火墙中允许相关流量。
Q2: VPN连接频繁断开如何排查?
A2: 首先检查服务器日志(sudo journalctl -u openvpn@server -f),查看是否有证书错误、端口冲突或网络问题;其次确认客户端网络稳定性,尝试更换DNS或协议(如TCP改为UDP);最后检查防火墙规则,确保VPN端口及数据转发未被阻止,若问题持续,可尝试调整keepalive参数(如将10 120改为5 30)缩短保活检测间隔。
