Open VPN 安装和配置过程

1,672 阅读6分钟

业务背景

我司在腾讯云租了若干台服务器。考虑到服务器开销成本大。且有被攻击风险。所以数据备份打算是在公司内网去做。为了打通内网和腾讯云的通信。决定采用OpenVPN来建立公司网络和腾讯云网络的交互。同时,腾讯云主机全部取消外网访问,仅可以通过vpn 去登陆。

Open vpn 安装

  • 操作系统:centos7.6
  • 软件版本:OpenVPN 2.4.12、Easy-RSA 3

安装过程

安装 OpenVPN 和依赖工具

在服务器上安装 OpenVPN 和 Easy-RSA(用于生成证书和密钥):

sudo yum update -y
sudo yum install epel-release -y 
sudo yum install openvpn easy-rsa -y

配置 Easy-RSA 来生成证书和密钥

  1. 进入 Easy-RSA 目录: 你应该已经复制了 Easy-RSA 文件到 ~/openvpn-ca 目录中。如果没有,执行以下命令:
mkdir -p ~/openvpn-ca
cp -r /usr/share/easy-rsa/3/* ~/openvpn-ca/
cd ~/openvpn-ca
  1. 初始化 PKI 环境: Easy-RSA 3 不再使用 vars 文件来设置证书相关变量。相反,你可以通过 vars 脚本来初始化 PKI 环境并开始生成证书。首先,初始化 PKI 环境:
./easyrsa init-pki

设置证书和密钥生成参数

在 Easy-RSA 3 中,证书的配置信息需要在生成证书时通过命令行传递。下面是常见的生成步骤。

  1. 生成 CA(证书颁发机构)证书和密钥: 使用以下命令生成 CA 证书和私钥:
./easyrsa build-ca nopass

2.生成服务器证书和密钥: 使用以下命令生成服务器证书和密钥:

./easyrsa build-server-full server nopass

3.生成 Diffie-Hellman 参数

./easyrsa gen-dh

配置 OpenVPN 服务器

  1. 复制生成的证书和密钥文件: 将证书和密钥文件复制到 OpenVPN 配置目录:
sudo cp pki/ca.crt pki/private/server.key pki/issued/server.crt /etc/openvpn/ 
sudo cp pki/dh.pem /etc/openvpn/
  1. 配置 OpenVPN 服务器: 编辑 /etc/openvpn/server.conf 文件:
port 1194 
proto udp 
dev tun 
ca /etc/openvpn/ca.crt 
cert /etc/openvpn/server.crt 
key /etc/openvpn/server.key 
dh /etc/openvpn/dh.pem 
server 10.8.0.0 255.255.255.0 # 为客户端分配 10.8.0.0/24 网络 
ifconfig-pool-persist ipp.txt 
push "redirect-gateway def1 bypass-dhcp" # 将所有流量通过 VPN 隧道 
push "dhcp-option DNS 8.8.8.8" # 配置 Google DNS 
push "dhcp-option DNS 8.8.4.4" 
keepalive 10 120 
cipher AES-256-CBC 
user nobody 
group nogroup 
persist-key persist-tun 
status openvpn-status.log 
verb 3

3.启用 IP 转发: 编辑 /etc/sysctl.conf 文件,确保 IP 转发启用:

sudo nano /etc/sysctl.conf

设置:

net.ipv4.ip_forward = 1

然后运行:

sudo sysctl -p

4.打开 OpenVPN 端口(1194 UDP) : 开放 OpenVPN 使用的 UDP 1194 端口,这样客户端可以连接到你的服务器。

sudo firewall-cmd --zone=public --add-port=1194/udp --permanent 

5.启用 NAT 转发: 允许 NAT(网络地址转换)转发流量,这样 VPN 客户端可以通过 OpenVPN 服务器访问其他内网服务器。

sudo firewall-cmd --zone=public --add-masquerade --permanent

6.允许来自 VPN 网络的流量: 假设你的 VPN 使用的子网是 10.8.0.0/24(根据你的配置可能不同)。你需要告诉 firewalld 允许来自该子网的流量。

sudo firewall-cmd --zone=trusted --add-source=10.8.0.0/24 --permanent

7.重新加载 firewalld 配置: 使所有更改生效:

sudo firewall-cmd --reload

8.启动 OpenVPN 服务

sudo systemctl start openvpn@server

配置 OpenVPN 客户端

  1. 进入 OpenVPN 证书生成目录并生成客户端证书
cd ~/openvpn-ca
./easyrsa build-client-full client1 nopass

这条命令会生成客户端所需的证书和密钥,包括:

  • client_name.crt:客户端证书
  • client_name.key:客户端私钥
  • ca.crt:CA 证书(公共证书,用于验证服务器)

通常放在 ~/openvpn-ca/keys/ 目录下

  1. 创建客户端配置文件(client_name.ovpn
client
dev tun
proto udp
remote <server_ip_or_domain> 1194 # 这里替换成你的 OpenVPN 服务器的公网 IP 或域名,端口是 1194 resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client_name.crt
key client_name.key
remote-cert-tls server
verb 3
  • remote <server_ip_or_domain> 1194:填写你的 OpenVPN 服务器的公网 IP 地址或者域名。

  • ca ca.crt:这是 CA 证书的路径,告诉客户端如何验证 OpenVPN 服务器。

  • cert client_name.crt:这是你为客户端生成的客户端证书。

  • key client_name.key:这是你为客户端生成的私钥。

为了方便,可以将证书和密钥直接嵌入到 .ovpn 配置文件中,这样你就不需要单独传输证书和密钥文件了。你可以像这样嵌入证书和密钥:

client
dev tun
proto udp
remote <server_ip_or_domain> 1194
resolv-retry infinite
nobind
persist-key
persist-tun
<ca>
-----BEGIN CERTIFICATE-----
(这里粘贴 ca.crt 文件的内容)
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
(这里粘贴 client_name.crt 文件的内容)
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
(这里粘贴 client_name.key 文件的内容)
-----END PRIVATE KEY-----
</key>
remote-cert-tls server
verb 3

将client_name.ovpn 导入客户端 Tunnelblick 或者 OpenVPN GUI即可使用。 通过内网ip能访问到腾讯云服务器。

image.png

遇到的问题和解决过程

服务器启动失败

报错日志Tue Dec 10 10:21:02 2024 failed to find GID for group nogroup

问题分析
  • nogroup 组在某些系统上可能不存在。OpenVPN 默认使用 nogroup 作为其运行组,但在 CentOS 7 系统中,nogroup 组可能没有预定义,导致 OpenVPN 启动失败。
  • 这通常发生在 OpenVPN 尝试设置非特权用户和组权限时,它默认使用 nobody 用户和 nogroup 组。
解决方法

你可以修改 OpenVPN 配置文件,指定使用 nobody 用户和组,而不是 nogroup,以解决这个问题。

  1. 打开你的 OpenVPN 配置文件,通常是 /etc/openvpn/server.conf/etc/openvpn/openvpn.conf

    sudo vi /etc/openvpn/server.conf
    
  2. 查找 user nobodygroup nogroup 这两行。将其修改为:

    user nobody
    group nobody
    

    这样,OpenVPN 将使用 nobody 作为用户和组,而不是 nogroup

客户端连接超时

确保1194 端口能访问 nc -zv -u 175.178.211.147 1194 服务器防火墙放通改端口 image.png 腾讯云防火墙放通该端口(当时我把UDP 设置成TCP 导致连接超时的) image.png

连上了VPN,但是访问不了外网。

  1. 添加路由,使得腾讯云内网走VPN,其他流量继续走本机。以下两种方式我都加过,但是不我确定是哪个生效了。 client_name.opvn上添加

image.png

手动加路由

sudo route -n add 10.0.12.0/24 10.8.0.1
sudo route -n add 10.0.20.0/24 10.8.0.1
  1. 服务器配置文件/etc/openvpn/server.conf删除 push "redirect-gateway def1 bypass-dhcp"我不需要所有流量都走VPN image.png 3、服务器配置文件/etc/openvpn/server.conf删除push "dhcp-option DNS 8.8.8.8"push "dhcp-option DNS 8.8.4.4" 我们不通过VPN上外网,所以DNS不需要从服务器获取,以下是连接VPN前后DNS 服务器的区别。因为连VPN以后通过IP是能够上外网的,所以我断定是DNS 有问题。

image.png

image.png

SSH 腾讯云内网失败

image.png

外网能访问了,内网ip 也能ping通了,且通过VPN服务器能正常访问。我初步断定是流量没有转发,且以下改动证明了我的断定是正确的。服务器端配置增加路由推送:

image.png

同时,腾讯云后台防火墙放通22端口的源地址是openVPN服务器的网段,不是openVPN分配的网段。

image.png

2025年5月13日遇到问题以及解决方案

问题描述: 1、ssh 集群里面的服务器,失败

image.png 2、ping ip 失败

image.png 3、ssh 主服务器成功

image.png 初步怀疑是转发的问题:检查发现防火墙挂了

image.png 重启防火墙解决此问题

image.png