三多运维

OpenVPN打通云服务器与本地虚拟机

环境与目标

  • VPN服务器:云服务器,公网IP 120.48.170.222,操作系统PRETTY_NAME="Ubuntu 22.04.1 LTS\VERSION_CODENAME=jammy"。

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

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

网络拓扑图

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

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

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

优点

核心说明

带给你的价值

🔒 安全性高

基于成熟的 OpenSSL 库,支持多种强加密算法和证书认证,并可在用户空间运行以减少内核攻击面。

数据传输如同在公网上建立了一条加密隧道,有效防止窃听和篡改,保护敏感信息。

🌐 跨平台兼容

原生支持 Linux、Windows、macOS、Android、iOS 等主流操作系统。

一套方案即可满足不同设备(电脑、手机)的接入需求,管理统一,非常灵活。

🚀 网络适应性强

能出色地穿透 NAT 设备和大多数防火墙,通常只需一个 UDP 或 TCP 端口(如默认的1194)即可建立连接。

在复杂的网络环境(如公司网络、酒店Wi-Fi)下也能保持稳定连接,避免因网络限制而无法使用。

🛠️ 配置灵活

支持路由(tun)和桥接(tap)两种模式,可根据需要选择;能向客户端推送路由等网络配置。

可以灵活适配各种网络拓扑,无论是简单的远程访问还是复杂的站点互连,都能找到合适的配置方式。

💰 开源经济

采用 GPL 许可,可免费用于商业和个人用途。

无需支付昂贵的授权费用,同时可以借助活跃的社区获得支持和持续的功能更新。

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

1. 安装OpenVPN与Easy-RSA

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

# 更新系统
sudo apt update
sudo apt upgrade -y

# 安装OpenVPN和证书工具
sudo apt install openvpn easy-rsa -y

2. 配置Easy-RSA证书颁发机构

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

# 创建证书目录
mkdir /usr/local/ley/easy-rsa
ln -s /usr/share/easy-rsa/* /usr/local/ley/easy-rsa/
cd /usr/local/ley/easy-rsa

# 初始化PKI
./easyrsa init-pki

# 创建CA证书(一路回车,使用默认值)
./easyrsa build-ca nopass

# 创建服务器证书
./easyrsa gen-req server nopass
./easyrsa sign-req server server

# 创建Diffie-Hellman参数(这需要一些时间)
./easyrsa gen-dh

# 6. 生成(HMAC密钥)TLS-auth密钥,用于增强安全性,防御DDoS攻击
openvpn --genkey secret ta.key

# 7. 将生成的关键文件复制到OpenVPN配置目录
sudo 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.3.0 255.255.255.0"

# 推送DNS(可选)
push "dhcp-option DNS 223.5.5.5"
push "dhcp-option DNS 8.8.4.4"

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

# 保持连接
keepalive 10 120

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

# 加密设置
cipher AES-256-CBC
auth SHA256

# 安全与性能设置
user nobody
group nobody
persist-key
persist-tun
comp-lzo
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3

# 客户端连接后执行的脚本
script-security 2
client-connect /etc/openvpn/server/client-connect.sh

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

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

# 1. 启用内核IP转发
echo 'net.ipv4.ip_forward=1' | tee -a /etc/sysctl.conf
sysctl -p

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

2.1 配置防火墙(Firewall适用)
# 开放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

2.2 配置防火墙(UFW适用)
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
# 添加NAT规则
sudo nano /etc/ufw/before.rules
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
# 启用并重新加载UFW
sudo ufw disable
sudo ufw enable

5. 启动OpenVPN服务器

# 启动服务
sudo systemctl start openvpn-server@server

# 设置开机自启
sudo systemctl enable openvpn-server@server

# 检查状态
sudo systemctl status openvpn-server@server

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

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

1. 在Mac Book上安装OpenVPN客户端

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

# 使用Homebrew安装
brew install openvpn

# 或者下载OpenVPN Connect客户端(GUI版)
# https://openvpn.net/client-connect-vpn-for-mac-os/

2. 生成客户端配置文件

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

# 1. 生成客户端证书(例如命名为client-host)
./easyrsa gen-req router_client nopass
./easyrsa sign-req client router_client

# 2. 创建客户端配置文件 (.ovpn文件)
tee /etc/openvpn/client-configs/client-host.ovpn << EOF
client
dev tun
proto udp
remote 120.48.170.222 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>
key-direction 1
cipher AES-256-CBC
auth SHA256
verb 3
EOF

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

3. 配置Mac Book的网络转发

# 启用IP转发
sudo sysctl -w net.inet.ip.forwarding=1

# 永久启用(重启后生效)
sudo nano /etc/sysctl.conf
# 添加:net.inet.ip.forwarding=1

# 配置pf防火墙进行NAT
sudo nano /etc/pf.conf

添加以下内容到文件末尾:

# OpenVPN NAT规则
nat on utun0 from 10.10.0.0/24 to any -> (utun0) 
# 加载pf配置
sudo pfctl -f /etc/pf.conf
sudo pfctl -e

4. 在Mac Book上连接OpenVPN

# 使用命令行连接
sudo openvpn --config router_client.ovpn

# 或者使用GUI客户端导入.ovpn文件

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

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

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

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

    • 目标网络: 10.8.0.0

    • 子网掩码: 255.255.255.0

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

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

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

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

    4. 保存并应用设置。

路由表示意图

目标网络

子网掩码

下一跳网关

说明

10.8.0.0

255.255.255.0

192.168.3.23

将发往VPN网络的流量交给客户端主机


第四阶段:测试与验证

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

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

    • 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.3.23的静态路由。

  • 查看日志: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.3.23)。

此步骤必须在路由器管理界面中完成,否则虚拟机无法回程响应。

防火墙与转发

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.3.23(你的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秒内没有收到响应,则认为连接已断开。

资源下载

提示:如遇链接失效,请在评论区留言反馈