使用OpenVPN搭建虚拟专用网络
目录
关键字
OpenVPN,ubuntu,科学上网
背景环境
我有这样一个需求,我经常用的Windows(机器A)不能访问外网,同时我有一台可以访问外网的服务器(机器B)。
我想用机器A和机器B搭建一个虚拟专用网络,说人话,就是我想机器A通过机器B的网络访问外网。通过OpenVPN就能实现。
具体环境:
- 机器A:我的电脑,手机,平板
- 机器B:云服务器(ubuntu24)
最终解决
先说方案,其他慢慢说。
我在网上找了很多方法,发现github上有个工具特别方便: https://github.com/Nyr/openvpn-install/tree/master
安装OpenVPN服务器端
在机器B执行: 可能需要sudo
wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh
首次执行,直接默认值,下一步,下一步…… 如果最终没有报错,OpenVPN服务器端就安装好了,同时生成.ovpn的客户端配置文件(具体位置看执行日志)。
再次执行:
# 输出:
Select an option:
1) Add a new client
2) Revoke an existing client
3) Remove OpenVPN
4) Exit
Option:
1.就是新生成一个.ovpn客户端配置文件。 2.重新生成一个已经存在的客户端配置文件。 3.卸载OpenVPN
安装客户端
下载OpenVPN的客户端。https://OpenVPN.net/ 这个网站可能需要科学上网,如果没有科学上网,找找其他资源。然后导入之前生成的.ovpn的客户端配置文件,然后连接就行了。
OpenVPN流量转发过程
1. OpenVPN 隧道建立
-
连接过程:
- 机器A(客户端)与机器B(服务器)建立加密的VPN隧道(如通过UDP端口1194)。
- 机器B为机器A分配一个虚拟IP(例如
10.8.0.2
),并告知客户端通过VPN路由流量。
-
关键配置:
- 服务器端(机器B)需启用
push "redirect-gateway def1"
,强制客户端(机器A)将所有流量(包括外网)通过VPN隧道发送。 - 服务器需开启IP转发(如Linux的
net.ipv4.ip_forward=1
)和NAT规则。
- 服务器端(机器B)需启用
2. 流量路径变化
-
原始状态:
- 机器A无外网访问权限,但可与机器B通信(如内网IP
192.168.1.2
→192.168.1.100
)。 - 机器B具备外网出口(如公网IP或通过其他网关)。
- 机器A无外网访问权限,但可与机器B通信(如内网IP
-
VPN连接后:
- 机器A的默认路由被修改,所有外网流量(如访问
8.8.8.8
)通过虚拟接口(如tun0
)发送到机器B。 - 机器B收到流量后,解密并执行以下操作:
- IP转发:将流量从虚拟接口(
tun0
)转发到物理外网接口(如eth0
)。 - NAT转换:使用机器B的公网IP替换机器A的虚拟IP作为源地址(MASQUERADE),确保外网响应返回至机器B。
- IP转发:将流量从虚拟接口(
- 机器A的默认路由被修改,所有外网流量(如访问
3. NAT与防火墙规则
-
NAT配置(以Linux为例):
# 启用IP转发 sysctl -w net.ipv4.ip_forward=1 # 添加NAT规则(假设外网接口为eth0) iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
- 此规则将来自VPN客户端(如
10.8.0.0/24
)的流量通过机器B的公网接口发送,并隐藏客户端的真实IP。
- 此规则将来自VPN客户端(如
-
防火墙放行:
- 确保机器B的防火墙允许从
tun0
接口到eth0
的转发流量。
- 确保机器B的防火墙允许从
4. 数据流示例
-
机器A请求访问
8.8.8.8
:- 原始数据包:源IP
10.8.0.2
→ 目标IP8.8.8.8
。 - 通过VPN隧道加密发送至机器B。
- 原始数据包:源IP
-
机器B处理:
- 解密数据包,源IP仍为
10.8.0.2
,目标IP8.8.8.8
。 - NAT转换:源IP被替换为机器B的公网IP(如
203.0.113.1
)。 - 转发至外网接口
eth0
,发送到8.8.8.8
。
- 解密数据包,源IP仍为
-
响应返回:
- 外网服务器响应到机器B的公网IP
203.0.113.1
。 - 机器B根据NAT表将目标IP还原为
10.8.0.2
,通过VPN隧道加密返回给机器A。
- 外网服务器响应到机器B的公网IP
5. 关键点总结
- 路由重定向:OpenVPN客户端修改默认网关,强制外网流量走VPN隧道。
- 服务器IP转发:机器B需启用内核IP转发功能。
- NAT转换:将客户端流量伪装为服务器公网IP,确保响应正确返回。
- 加密与解密:全程通过SSL/TLS保证传输安全。
常见问题排查
-
无法访问外网:
- 检查服务器是否启用
ip_forward
和正确配置NAT规则。 - 确认客户端路由表是否被正确修改(
ip route show
)。 - 检查防火墙是否放行
tun0
到外网接口的流量。
- 检查服务器是否启用
-
性能问题:
- 若延迟高,可尝试调整OpenVPN为UDP模式(默认)并优化MTU。
- 使用
mssfix
参数避免数据包分片。
个人博客:qinyangx.top