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,是因为它拥有一系列突出的优点。为了让你能快速抓住核心,我先用一个表格来梳理它的主要优势。
首先,在你的云服务器(120.48.170.222)上安装必要的软件包。
# 更新系统
sudo apt update
sudo apt upgrade -y
# 安装OpenVPN和证书工具
sudo apt install openvpn easy-rsa -y证书是建立安全连接的基石,用于验证服务器和客户端的身份。
# 创建证书目录
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/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需要开启系统的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# 启动服务
sudo systemctl start openvpn-server@server
# 设置开机自启
sudo systemctl enable openvpn-server@server
# 检查状态
sudo systemctl status openvpn-server@server检查服务状态,确认其正常运行。可以通过 tail -f /var/log/messages查看日志。
在你的内网主机(192.168.3.23)上安装OpenVPN客户端软件。
# 使用Homebrew安装
brew install openvpn
# 或者下载OpenVPN Connect客户端(GUI版)
# https://openvpn.net/client-connect-vpn-for-mac-os/在云服务器上操作,为你的客户端主机生成证书和配置文件。
# 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配置说明:此文件将所有证书信息内嵌其中,客户端只需导入这一个文件即可连接,非常方便。
# 启用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# 使用命令行连接
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客户端主机)
登录路由器管理后台(通常通过浏览器访问 http://10.10.0.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)
在你的个人电脑上(远程用户):
按照类似“客户端配置”的步骤,为你自己的电脑生成一份独立的证书和配置文件(例如命名为 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服务器和客户端的日志通常能提供详细的错误信息。
希望这些补充说明能帮助更好地理解和完成配置。如果在具体操作中遇到问题,欢迎随时私信或者文章留言!
额外补充(快速回顾核心配置要点,并说明哪些地方可以根据你的实际情况进行简化或需要特别注意):
快速回顾核心配置要点
务必注意的细节
路由器的静态路由:这是实现双向互通的关键,也是最容易遗漏的一步。必须在你的路由器(网关10.10.0.1)上添加一条静态路由,告诉它“所有发给10.8.0.0/24网段的数据包,请转发给192.168.3.23(你的OpenVPN客户端)”。
防火墙规则:
云服务器:确保防火墙开放了OpenVPN的监听端口(如UDP 1194)。
内网主机(客户端):如果它开启了防火墙,需确保允许来自10.8.0.0/24网段的流量,或者开放相应服务端口。
虚拟机:同样需检查其防火墙设置,确保不会被阻止访问。
时间同步:服务器和所有客户端之间的时间应大致同步,否则SSL证书认证可能会失败,导致无法连接。
服务端配置:在 server.conf中,user nobody和 group nobody指令让OpenVPN以低权限用户运行,增强安全性。keepalive 10 120指令用于保持连接,服务器会每10秒ping一次客户端,如果120秒内没有收到响应,则认为连接已断开。