1 前言
大家好,我是寒暄。
由于我所在的研发部门与公司总部物理位置分离,而核心服务器资源集中部署于总部机房,因此日常工作中需通过公司 VPN(堡垒机)实现安全的内网访问。然而,当前网络链路存在显著瓶颈,高频次的跨地域数据交互导致访问延迟较高,尤其在服务部署、代码拉取等大流量操作场景下,传输效率低下的问题尤为突出,甚至多次出现操作超时中断的情况。鉴于现有远程访问方案对开发效率的实质性制约,经综合评估后,决定自主搭建符合研发场景需求的 VPN 服务,以优化网络连接质量、提升协同开发效能。
2 选择建议总结
经过这几天对不通类型的组网和vpn软件的测试和对比,得到以下总结:
需求场景 | 推荐方案 | 特点 | 部署复杂度 |
---|---|---|---|
小白用户/家庭组网 | Tailscale / ZeroTier | 自动穿透,全平台支持,设置简单,但是由于中继转发服务器在国外,所以延迟很高(平均延迟500ms),但是在国内也能用,适合那种只操作ssh需求 | ⭐☆☆☆☆(极简) |
路由器全局代理 | ExpressVPN / Surfshark | 提供官方固件,即装即用 | ⭐⭐⭐☆☆ |
自建高性能隧道 | WireGuard (支持Docker部署) | 使用国内的Endpoint服务能做到低延迟,适合NAS或VPS | ⭐⭐⭐☆☆ |
暴露内网Web服务 | FRP / Cloudflare Tunnel | 免费、支持HTTPS安全转发 | ⭐⭐⭐☆☆ |
多节点企业互联 | Tinc VPN / Netmaker | 网状网络,支持复杂拓扑 | ⭐⭐⭐⭐☆ |
在 VPN 搭建场景中,公网 IP 支持是实现稳定连接的基础条件,然而公开网络环境下的免费资源通常伴随带宽瓶颈,难以满足高效数据传输需求。综合技术可行性与成本效益,最终选定 WireGuard 作为内网隧道搭建方案。该方案凭借轻量级、高性能的特性,支持通过 VPS 自建中继节点,可有效突破传统免费服务的带宽限制,显著提升数据传输效率。对比其他解决方案,在国内网络环境下若要实现速度优化,或面临高额成本,或存在较高技术门槛,而 WireGuard 以其轻量化部署与灵活的中继机制,在平衡性能与成本方面展现出显著优势。
3 WireGuard 介绍
WireGuard VPN 的工作原理
核心原理说明
1. 加密隧道建立
- 密钥交换:客户端与服务端通过交换公钥(基于 Curve25519 椭圆曲线)完成身份认证。
- 会话密钥:使用 HKDF 从预共享密钥(PSK)派生临时会话密钥,保障前向安全性。
2. 数据包处理流程
- 加密算法:ChaCha20(数据加密) + Poly1305(完整性校验)。
- 头部开销:仅 20 字节(相比 IPsec 的 50+ 字节更高效)。
3. NAT 穿透
- 通过 UDP hole punching 技术自动穿透大多数 NAT 设备,无需手动端口映射。
4. 流量路由
[Interface]
Address = 10.8.0.1/24 # 定义VPN子网
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT # 允许转发流量
4 部署 WireGuard
部署架构图:
安装 WireGuard
首先使用公司不使用的笔记本或者台式机子,或者使用某一台能通内网的服务器都可以。作为WireGuard的服务端,本次我们使用公司不用的笔记本作为服务端
官网地址:https://www.wireguard.com/install/
安装好打开软件,点击左下角的新建隧道中的新建空隧道,如图所示。服务端(公司电脑)和客户端(公司外的电脑)都要下载安装。
- 服务端创建隧道:
配置文件如下:
[Interface]
PrivateKey = qESjFQiT75ka+dgVLVBuTkIzBZXyMJ1/majNJk7l/Es=
ListenPort = 51820
Address = 10.0.0.1/8
[Peer]
PublicKey = n8uo1RkKOuM1p0LpEQDrT3m2jpsKFN/c36dBNnKmMCo=
AllowedIPs = 10.0.0.2/8
PersistentKeepalive = 25
- 客户端创建隧道
配置文件如下:
[Interface]
PrivateKey = mIFbN0/yntetXWenBC5PT7fks2nfiviC5lRZW1lKNlQ=
Address = 10.0.0.2/8
DNS = 8.8.8.8
[Peer]
PublicKey = v78LQkUI7YSAskWLlp+FWNYzaGnP5PdOrZT82+IVSBY=
AllowedIPs = 10.0.0.0/8, 192.168.199.0/24
Endpoint = 自己的中继服务域名或ip:端口
PersistentKeepalive = 25
5 配置中继流量中转服务
有两种方式,第一种是使用免费的,第二种自己通过VPS自建WireGuard中继服务。我们直接使用免费的。
- 地址:https://www.luyouxia.com/
我们使用路由侠内网穿透工具来充当udp流量转发服务。他有1g的免费流量可以使用。
服务端配置udp流量内网映射
创建好后,就可以看到一条映射的公网地址,鼠标右键点击【复制地址】
把从路由侠复制的公网地址粘贴到客户端(公司外的电脑)隧道中的 Endpoint 后,然后点击【保存】即可。
客户端和服务端都配置好之后,启动隧道就可以成功建立链接,这个时候在客户端测试我们的虚拟网络IP,此时已经可以成功访问服务端了。还可以通过服务端本机的ip直接访问服务端。
问题:那现在我在客户端可以访问公司内网中的所有服务器吗?
答案是否定的,我们目前的配置还没有办法访问服务服务器本机意外的服务器,那我应该怎样配置才能达到怎样的效果了。而且公司的服务器,有一些甚至不在同一个路由子网。
6 配置子网路由转发
原理图如下:
1. 配置层(蓝色区域)
- NAT 创建:New-NetNat 创建地址转换池(10.0.0.0/8)
- IP 转发:注册表启用 IPEnableRouter=1
- 目标服务器路由:添加静态路由指向 Windows Server(192.168.200.227)
2. 流量路径(数字标注)
- 客户端发送加密数据到 WireGuard 服务端(UDP 51820)
- 服务端解密后交给 Windows Server 物理网卡
- NAT 网关修改源 IP(客户端 IP → 192.168.200.227)
- SNAT 转换后流量发往目标服务器
- 目标服务器通过静态路由返回流量
- Windows 路由表将流量导向 WireGuard 接口
- 加密后返回客户端
3. 关键路由关系
4. 检查和配置NAT
以管理员身份运行PowerShell
# 查看现有NAT配置
Get-NetNat
# 如果没有NAT,创建一个
New-NetNat -Name "WireGuardNAT" -InternalIPInterfaceAddressPrefix "10.0.0.0/8"
5. 确保IP转发已启用
# 检查IP转发状态
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name IPEnableRouter
# 如果不是1,设置为1
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name IPEnableRouter -Value 1
6. 在服务端测试直接连接
# 确认服务端能直接访问目标服务器
ping 192.168.199.9
telnet 192.168.199.9 80
7. 关键配置:在目标服务器添加返回路由
这是最重要的步骤,我们需要配置SNAT让目标服务器认为请求来自Windows服务端
# 添加路由 - 通过默认网关或直接路由
route add 192.168.199.0 mask 255.255.255.0 192.168.200.1 metric 1
# 或者如果在同一个网络段,直接添加
route add 192.168.199.0 mask 255.255.255.0 192.168.200.227 metric 1
# 查看是否添加成功
route print
注意:
192.168.199
是目标服务器网段(我们客户端想访问的网段),192.168.200
是本机服务器网段(也就是安装vpn服务的机子)
配置完成之后,无论你在任何地方通过WireGuard,就可以像在公司内部访问局域网一样访问公司内部服务器啦。而且WireGuard协议采用双向对称加密。十分安全可靠。
7 总结
对于绝大多数用户:WireGuard 是当前最安全的 VPN 选择,其密码学设计和代码质量远超传统方案。如果大家在工作中也有和我一样的vpn困扰,一起来尝试一下吧,有什么问题都可以在留言区留言。
评论区