×

远程访问内网难题?OpenVPN打通云服务器与本地虚拟机

hqy hqy 发表于2025-10-26 23:04:53 浏览57 评论0

抢沙发发表评论

 

环境与目标

VPN服务器:云服务器,公网IP 111.111.11.1,操作系统Rocky Linux。

主要客户端:路由器下的主机,内网IP 192.168.40.20,操作系统Rocky Linux。该客户端将作为访问路由器下其他虚拟机(如 10.10.0.20和 10.10.0.21)的网关。

网络目标:使你(远程用户)可以通过连接云服务器的OpenVPN服务,安全地访问路由器下整个 10.10.0.0/24和 192.168.40.0/24网段的设备。





网络拓扑图

下图清晰地展示了我们最终要实现的网络架构和数据流向:


图片


目标:配置完成后,你可以在自己的个人电脑上连接到云服务器的OpenVPN服务,然后像在本地网络一样,直接访问路由器下的主机(192.168.40.20)及其下方的虚拟机(10.10.0.20, 10.10.0.21)。

为什么要使用OpenVPN,是因为它拥有一系列突出的优点。为了让你能快速抓住核心,我先用一个表格来梳理它的主要优势。


优点核心说明带给你的价值
? 安全性高基于成熟的 OpenSSL 库,支持多种强加密算法和证书认证,并可在用户空间运行以减少内核攻击面。数据传输如同在公网上建立了一条加密隧道,有效防止窃听和篡改,保护敏感信息。
? 跨平台兼容原生支持 Linux、Windows、macOS、Android、iOS 等主流操作系统。一套方案即可满足不同设备(电脑、手机)的接入需求,管理统一,非常灵活。
? 网络适应性强能出色地穿透 NAT 设备和大多数防火墙,通常只需一个 UDP 或 TCP 端口(如默认的1194)即可建立连接。在复杂的网络环境(如公司网络、酒店Wi-Fi)下也能保持稳定连接,避免因网络限制而无法使用。
?️ 配置灵活支持路由(tun)和桥接(tap)两种模式,可根据需要选择;能向客户端推送路由等网络配置。可以灵活适配各种网络拓扑,无论是简单的远程访问还是复杂的站点互连,都能找到合适的配置方式。
? 开源经济采用 GPL 许可,可免费用于商业和个人用途。无需支付昂贵的授权费用,同时可以借助活跃的社区获得支持和持续的功能更新。


下面就按照我这边的方案开始实现vpn。


第一阶段:云服务器(OpenVPN Server)配置

1. 安装OpenVPN与Easy-RSA

首先,在你的云服务器(111.111.11.1)上安装必要的软件包。

dnf install epel-release -y
dnf install openvpn easy-rsa -y

2. 搭建证书颁发机构(CA)并生成证书

证书是建立安全连接的基石,用于验证服务器和客户端的身份。


# 1. 创建并进入工作目录

mkdir-p ~/easy-rsa

cd ~/easy-rsa


# 2. 初始化PKI(公钥基础设施)目录

/usr/share/easy-rsa/easyrsa init-pki


# 3. 构建CA(证书颁发机构),Common Name可自定义

/usr/share/easy-rsa/easyrsa build-ca nopass


# 4. 生成服务器证书和密钥

/usr/share/easy-rsa/easyrsa build-server-full server nopass


# 5. 生成Diffie-Hellman参数,这需要一些时间

/usr/share/easy-rsa/easyrsa gen-dh


# 6. 生成TLS-auth密钥,用于增强安全性,防御DDoS攻击

openvpn --genkey--secret ta.key


# 7. 将生成的关键文件复制到OpenVPN配置目录

cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem ta.key /etc/openvpn/server/






关键文件说明表


文件路径作用保密要求
/etc/openvpn/server/ca.crt根证书,用于验证其他证书可公开
/etc/openvpn/server/server.crt服务器证书,表明身份可公开
/etc/openvpn/server/server.key服务器私钥,是安全核心必须保密
/etc/openvpn/server/dh.pem密钥交换参数可公开
/etc/openvpn/server/ta.key额外TLS认证密钥必须保密


3. 配置OpenVPN服务器

创建并编辑服务器配置文件 /etc/openvpn/server/server.conf。以下是关键配置的说明和示例。

vi /etc/openvpn/server/server.conf

配置文件示例及注释


# 基本网络设置

port 1194

proto udp

dev tun


# 证书和密钥文件路径

ca /etc/openvpn/server/ca.crt

cert /etc/openvpn/server/server.crt

key /etc/openvpn/server/server.key

dh /etc/openvpn/server/dh.pem


# 定义VPN内部使用的虚拟IP段

server 10.8.0.0 255.255.255.0


# 核心配置:推送路由到客户端,告诉客户端如何访问你的内网

push "route 10.10.0.0 255.255.255.0"

push "route 192.168.40.0 255.255.255.0"


# 允许客户端之间互相访问(按需启用)

; client-to-client


# 保持连接

keepalive 10120


# 安全与性能设置

tls-auth /etc/openvpn/server/ta.key 0# 服务器端参数为0

cipher AES-256-CBC

auth SHA256

user nobody

group nobody

persist-key

persist-tun

comp-lzo

status /var/log/openvpn-status.log

verb 3





4. 配置系统网络与防火墙

需要开启系统的IP转发功能,并设置防火墙规则允许VPN流量。


# 1. 启用内核IP转发

echo 'net.ipv4.ip_forward=1' | tee -a /etc/sysctl.conf

sysctl -p


# 2. 配置防火墙(假设云服务器公网网卡为eth0)

# 开放OpenVPN服务端口(1194/UDP)

firewall-cmd --permanent --add-port=1194/udp

# 设置NAT伪装,使客户端流量能通过服务器转发出去

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.8.0.0/24 masquerade'

firewall-cmd --reload




5. 启动OpenVPN服务器

systemctl enable --now openvpn-server@server.service
systemctl status openvpn-server@server.service

检查服务状态,确认其正常运行。可以通过 tail -f /var/log/messages查看日志。


第二阶段:客户端(路由器下的主机)配置

1. 安装OpenVPN客户端

在你的内网主机(192.168.40.20)上安装OpenVPN客户端软件。

dnf install openvpn -y

2. 生成客户端配置文件

在云服务器上操作,为你的客户端主机生成证书和配置文件。


# 1. 生成客户端证书(例如命名为client-host)

cd ~/easy-rsa

/usr/share/easy-rsa/easyrsa build-client-full client-host nopass


# 2. 创建客户端配置文件 (.ovpn文件)

tee /etc/openvpn/client-configs/client-host.ovpn << EOF

client

dev tun

proto udp

remote 111.111.11.1 1194  # 你的云服务器公网IP和端口

resolv-retry infinite

nobind

persist-key

persist-tun

remote-cert-tls server

key-direction 1

verb 3

<ca>

$(cat /etc/openvpn/server/ca.crt)

</ca>

<cert>

$(cat pki/issued/client-host.crt)

</cert>

<key>

$(cat pki/private/client-host.key)

</key>

<tls-auth>

$(cat /etc/openvpn/server/ta.key)

</tls-auth>

EOF





配置说明:此文件将所有证书信息内嵌其中,客户端只需导入这一个文件即可连接,非常方便。

3. 将配置文件安全拷贝到客户端主机并连接

将生成的 client-host.ovpn文件从云服务器安全地拷贝到客户端主机(192.168.40.20)的 /etc/openvpn/client/目录下。

然后在客户端主机上启动连接:

openvpn --config /etc/openvpn/client/client-host.ovpn

连接成功后,此主机将获得一个VPN IP(例如 10.8.0.2)。保持此终端运行,或将其设置为系统服务开机自启:

systemctl enable --now openvpn-client@client-host.service

第三阶段:关键路由配置(实现全网互通)

这是实现你从外部访问路由器下虚拟机的最关键一步。你需要登录到你的路由器(网关IP应为 10.10.0.1)的管理界面。

  • 配置目的:告诉路由器“所有要发送到VPN网段(10.8.0.0/24)的流量,请转发给已连接VPN的客户端主机(192.168.40.20)”。

  • 操作步骤(因路由器型号而异,以下是通用概念):

    • 目标网络: 10.8.0.0

    • 子网掩码: 255.255.255.0

    • 网关 / 下一跳: 192.168.40.20(这是你的OpenVPN客户端主机)

    1. 登录路由器管理后台(通常通过浏览器访问 http://10.10.0.1,具体看你路由器的后台地址界面路径以及端口)。

    2. 找到“静态路由”或“路由设置”选项。

    3. 添加一条新的静态路由规则:

    4. 保存并应用设置。

路由表示意图


目标网络子网掩码下一跳网关说明
10.8.0.0255.255.255.0192.168.40.20将发往VPN网络的流量交给客户端主机



第四阶段:测试与验证

完成所有配置后,请按以下顺序测试连通性,确保一切正常。

  1. 在客户端主机(192.168.40.20)上

    • ping 10.8.0.1(ping通VPN服务器虚拟IP,验证基础隧道)

    • ping 10.10.0.20(ping通虚拟机A,验证客户端到内网)

    • ping 10.10.0.21(ping通虚拟机B)

  2. 在你的个人电脑上(远程用户):

    • 按照类似“客户端配置”的步骤,为你自己的电脑生成一份独立的证书和配置文件(例如命名为 client-user.ovpn)。

    • 使用OpenVPN客户端(如OpenVPN Connect)导入该配置文件并连接到云服务器。

    • 连接成功后,你的电脑会获得一个VPN IP(如 10.8.0.3)。

    • 现在,你应该可以 ping通所有内网设备:10.8.0.1(服务器), 10.8.0.2(客户端主机), 10.10.0.20(虚拟机A), 10.10.0.21(虚拟机B)。

如果无法ping通,请按以下顺序排查:

  • 检查VPN连接:确认客户端是否成功获取到10.8.0.0/24网段的IP。

  • 检查服务器路由表:在云服务器上执行 ip route show,查看是否有到10.10.0.0/24网段的路由。

  • 检查客户端路由表:在成功连接VPN的客户端上执行 ip route show,查看是否有通过VPN隧道访问目标网络的路由。

  • 确认静态路由再次确认是否在路由器(10.10.0.1)上正确配置了指向192.168.40.20的静态路由。

  • 查看日志:OpenVPN服务器和客户端的日志通常能提供详细的错误信息。

希望这些补充说明能帮助更好地理解和完成配置。如果在具体操作中遇到问题,欢迎随时私信或者文章留言!



额外补充(快速回顾核心配置要点,并说明哪些地方可以根据你的实际情况进行简化或需要特别注意):

快速回顾核心配置要点


配置环节核心项目/指令作用说明你的网络需关注的点
服务器网络server 10.8.0.0 255.255.255.0定义VPN虚拟局域网网段,不能与你的物理网络(如10.10.0.0/24)冲突。确保此网段是唯一的。
推送路由push "route 10.10.0.0 255.255.255.0"关键:告知所有客户端,目标为10.10.0.0/24的流量应通过VPN隧道发送。必须正确填写你的虚拟机所在网段。
证书认证cacertkeydhtls-auth建立安全连接的基础,服务器和客户端都需要对应的证书文件。为每个客户端生成独立证书更安全。测试时可暂用duplicate-cn,但生产环境不建议。
客户端互通client-to-client允许VPN客户端之间直接通信。根据你的需求决定是否开启。
静态路由在路由器(10.10.0.1)上设置关键:告知路由器,目标为VPN网段(10.8.0.0/24)的流量应转发给内网主机(192.168.40.20)。此步骤必须在路由器管理界面中完成,否则虚拟机无法回程响应。
防火墙与转发iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE在云服务器上设置NAT,允许VPN客户端的流量通过服务器转发出去。确保云服务器的防火墙也放行了OpenVPN端口(默认1194/UDP)。


务必注意的细节

  1. 路由器的静态路由:这是实现双向互通的关键,也是最容易遗漏的一步。必须在你的路由器(网关10.10.0.1)上添加一条静态路由,告诉它“所有发给10.8.0.0/24网段的数据包,请转发给192.168.40.20(你的OpenVPN客户端)”。

  2. 防火墙规则

    • 云服务器:确保防火墙开放了OpenVPN的监听端口(如UDP 1194)。

    • 内网主机(客户端):如果它开启了防火墙,需确保允许来自10.8.0.0/24网段的流量,或者开放相应服务端口。

    • 虚拟机:同样需检查其防火墙设置,确保不会被阻止访问。

  3. 时间同步:服务器和所有客户端之间的时间应大致同步,否则SSL证书认证可能会失败,导致无法连接。

  4. 服务端配置:在 server.conf中,user nobody和 group nobody指令让OpenVPN以低权限用户运行,增强安全性。keepalive 10 120指令用于保持连接,服务器会每10秒ping一次客户端,如果120秒内没有收到响应,则认为连接已断开。


打赏

本文链接:https://kinber.cn/post/5766.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客