使用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规则。

2. 流量路径变化

  • 原始状态

    • 机器A无外网访问权限,但可与机器B通信(如内网IP 192.168.1.2192.168.1.100)。
    • 机器B具备外网出口(如公网IP或通过其他网关)。
  • VPN连接后

    • 机器A的默认路由被修改,所有外网流量(如访问 8.8.8.8)通过虚拟接口(如 tun0)发送到机器B。
    • 机器B收到流量后,解密并执行以下操作:
      1. IP转发:将流量从虚拟接口(tun0)转发到物理外网接口(如 eth0)。
      2. NAT转换:使用机器B的公网IP替换机器A的虚拟IP作为源地址(MASQUERADE),确保外网响应返回至机器B。

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。
  • 防火墙放行

    • 确保机器B的防火墙允许从 tun0 接口到 eth0 的转发流量。

4. 数据流示例

  1. 机器A请求访问 8.8.8.8

    • 原始数据包:源IP 10.8.0.2 → 目标IP 8.8.8.8
    • 通过VPN隧道加密发送至机器B。
  2. 机器B处理

    • 解密数据包,源IP仍为 10.8.0.2,目标IP 8.8.8.8
    • NAT转换:源IP被替换为机器B的公网IP(如 203.0.113.1)。
    • 转发至外网接口 eth0,发送到 8.8.8.8
  3. 响应返回

    • 外网服务器响应到机器B的公网IP 203.0.113.1
    • 机器B根据NAT表将目标IP还原为 10.8.0.2,通过VPN隧道加密返回给机器A。

5. 关键点总结

  • 路由重定向:OpenVPN客户端修改默认网关,强制外网流量走VPN隧道。
  • 服务器IP转发:机器B需启用内核IP转发功能。
  • NAT转换:将客户端流量伪装为服务器公网IP,确保响应正确返回。
  • 加密与解密:全程通过SSL/TLS保证传输安全。

常见问题排查

  • 无法访问外网

    • 检查服务器是否启用 ip_forward 和正确配置NAT规则。
    • 确认客户端路由表是否被正确修改(ip route show)。
    • 检查防火墙是否放行 tun0 到外网接口的流量。
  • 性能问题

    • 若延迟高,可尝试调整OpenVPN为UDP模式(默认)并优化MTU。
    • 使用 mssfix 参数避免数据包分片。

个人博客:qinyangx.top