业务背景
我司在腾讯云租了若干台服务器。考虑到服务器开销成本大。且有被攻击风险。所以数据备份打算是在公司内网去做。为了打通内网和腾讯云的通信。决定采用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 来生成证书和密钥
- 进入 Easy-RSA 目录: 你应该已经复制了 Easy-RSA 文件到
~/openvpn-ca目录中。如果没有,执行以下命令:
mkdir -p ~/openvpn-ca
cp -r /usr/share/easy-rsa/3/* ~/openvpn-ca/
cd ~/openvpn-ca
- 初始化 PKI 环境: Easy-RSA 3 不再使用
vars文件来设置证书相关变量。相反,你可以通过vars脚本来初始化 PKI 环境并开始生成证书。首先,初始化 PKI 环境:
./easyrsa init-pki
设置证书和密钥生成参数
在 Easy-RSA 3 中,证书的配置信息需要在生成证书时通过命令行传递。下面是常见的生成步骤。
- 生成 CA(证书颁发机构)证书和密钥: 使用以下命令生成 CA 证书和私钥:
./easyrsa build-ca nopass
2.生成服务器证书和密钥: 使用以下命令生成服务器证书和密钥:
./easyrsa build-server-full server nopass
3.生成 Diffie-Hellman 参数:
./easyrsa gen-dh
配置 OpenVPN 服务器
- 复制生成的证书和密钥文件: 将证书和密钥文件复制到 OpenVPN 配置目录:
sudo cp pki/ca.crt pki/private/server.key pki/issued/server.crt /etc/openvpn/
sudo cp pki/dh.pem /etc/openvpn/
- 配置 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 客户端
- 进入 OpenVPN 证书生成目录并生成客户端证书
cd ~/openvpn-ca
./easyrsa build-client-full client1 nopass
这条命令会生成客户端所需的证书和密钥,包括:
client_name.crt:客户端证书client_name.key:客户端私钥ca.crt:CA 证书(公共证书,用于验证服务器)
通常放在 ~/openvpn-ca/keys/ 目录下
- 创建客户端配置文件(
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能访问到腾讯云服务器。
遇到的问题和解决过程
服务器启动失败
报错日志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,以解决这个问题。
-
打开你的 OpenVPN 配置文件,通常是
/etc/openvpn/server.conf或/etc/openvpn/openvpn.conf:sudo vi /etc/openvpn/server.conf -
查找
user nobody和group nogroup这两行。将其修改为:user nobody group nobody这样,OpenVPN 将使用
nobody作为用户和组,而不是nogroup。
客户端连接超时
确保1194 端口能访问 nc -zv -u 175.178.211.147 1194
服务器防火墙放通改端口
腾讯云防火墙放通该端口(当时我把UDP 设置成TCP 导致连接超时的)
连上了VPN,但是访问不了外网。
- 添加路由,使得腾讯云内网走VPN,其他流量继续走本机。以下两种方式我都加过,但是不我确定是哪个生效了。
client_name.opvn上添加
手动加路由
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
- 服务器配置文件
/etc/openvpn/server.conf删除push "redirect-gateway def1 bypass-dhcp"我不需要所有流量都走VPN3、服务器配置文件
/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 有问题。
SSH 腾讯云内网失败
外网能访问了,内网ip 也能ping通了,且通过VPN服务器能正常访问。我初步断定是流量没有转发,且以下改动证明了我的断定是正确的。服务器端配置增加路由推送:
同时,腾讯云后台防火墙放通22端口的源地址是openVPN服务器的网段,不是openVPN分配的网段。
2025年5月13日遇到问题以及解决方案
问题描述: 1、ssh 集群里面的服务器,失败
2、ping ip 失败
3、ssh 主服务器成功
初步怀疑是转发的问题:检查发现防火墙挂了
重启防火墙解决此问题