在Linux VPS上搭建VPN服务是许多用户为了保护隐私、访问限制内容或实现远程办公的需求而选择的方案,以下将以常见的OpenVPN协议为例,详细介绍在CentOS系统上的搭建步骤,包括环境准备、服务端配置、客户端证书生成及安全优化等内容。

环境准备
首先需要一台纯净的Linux VPS,推荐使用CentOS 7/8或Ubuntu 20.04 LTS系统,登录VPS后,更新系统并安装必要的依赖包,以CentOS为例,执行以下命令:
sudo yum update -y sudo yum install -y epel-release wget tar openssl openssl-devel lzo lzo-devel
然后下载并安装OpenVPN及其依赖组件Easy-RSA:
wget https://swupdate.openvpn.net/community/releases/openvpn-2.5.8.tar.gz tar -xvzf openvpn-2.5.8.tar.gz cd openvpn-2.5.8 ./configure && make && make install
接着安装Easy-RSA用于管理证书:
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz tar -xvzf EasyRSA-3.0.8.tgz -C /etc/openvpn/ ln -s /etc/openvpn/EasyRSA-3.0.8 /etc/openvpn/easy-rsa
生成证书与密钥
证书是VPN安全的核心,需依次生成CA证书、服务器证书及客户端证书,首先初始化PKI环境:

cd /etc/openvpn/easy-rsa ./easyrsa init-pki ./easyrsa build-ca nopass
创建服务器证书并指定密钥用途:
./easyrsa gen-req server nopass ./easyrsa sign-req server server
生成Diffie-Hellman参数(需较长时间):
./easyrsa gen-dh
最后生成客户端证书(此处以客户端1为例):
./easyrsa gen-req client1 nopass ./easyrsa sign-req client client1
配置OpenVPN服务端
创建服务器配置文件/etc/openvpn/server.conf
如下:
port 1194 proto udp dev tun ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/server.crt key /etc/openvpn/easy-rsa/pki/private/server.key dh /etc/openvpn/easy-rsa/pki/dh.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist /var/log/openvpn/ipp.txt push "redirect-gateway def1" push "dhcp-option DNS 8.8.8.8" keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun verb 3 crl-verify /etc/openvpn/easy-rsa/pki/crl.pem
启动服务并设置开机自启:
systemctl start openvpn@server systemctl enable openvpn@server
配置客户端与防火墙
将生成的客户端证书(client1.crt、client1.key)和CA证书(ca.crt)下载到本地,并创建客户端配置文件client.ovpn
(示例):
client dev tun proto udp remote VPS公IP 1194 resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server comp-lzo verb 3 <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>
在VPS上开启防火墙规则:
firewall-cmd --permanent --add-port=1194/udp firewall-cmd --permanent --add-masquerade firewall-cmd --reload
若使用云服务器(如阿里云、腾讯云),需在控制台安全组中开放1194 UDP端口。
安全优化建议
- 启用双因素认证:通过
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so /etc/pam.d/login
配置PAM认证。 - 限制客户端访问:在
server.conf
中添加client-config-dir /etc/openvpn/ccd
,为不同客户端分配固定IP。 - 定期轮换证书:设置定时任务每月自动更新证书并重启服务。
- 监控日志:通过
journalctl -u openvpn@server -f
实时查看连接状态。
相关操作命令速查
操作场景 | 命令示例 |
---|---|
查看OpenVPN连接状态 | openvpn --status /var/log/openvpn/status.log 10 |
撤销客户端证书 | ./easyrsa revoke client1 && ./easyrsa gen-crl |
导出客户端配置 | tar -cz client1.tar.gz client1.crt client1.key ca.crt client.ovpn |
相关问答FAQs
Q1: 如何解决VPN连接后无法上网的问题?
A: 首先检查VPS防火墙是否开启NAT转发(sysctl -a | grep net.ipv4.ip_forward
),若返回0则执行echo 1 > /proc/sys/net/ipv4/ip_forward
并永久配置,其次确认客户端配置中的DNS服务器是否正确,可尝试替换为公共DNS(如1.1.1.1),最后检查云服务器安全组是否允许出站流量。
Q2: 如何限制VPN客户端仅访问特定服务?
A: 可通过iptables实现流量限制,仅允许客户端访问VPS的22端口(SSH),执行以下命令:
iptables -A FORWARD -s 10.8.0.0/24 -p tcp --dport 22 -j ACCEPT iptables -A FORWARD -s 10.8.0.0/24 -j DROP service iptables save
此规则将阻止除SSH外的所有VPN客户端流量,需谨慎操作以免影响服务端自身功能。