WireGuard是一个易于配置、快速、安全的基于UDP协议的开源VPN软件。Wireguard具有自定义配置路由转发的能力,所以可以被用来在多个不同地域将设备所在的内网网络通过路由转发的方式串通起来,组建一张属于自己的大内网!有时候,我们想将本地计算机上提供的服务与小伙伴分享,但是我们既没有公网IP,又希望能够有足够的安全性,避免使其暴露在公网上。因此,我们基于Wireguard这一项最基本的特性,设计和实现了一套异地组网方案。
1 案例
下面是一个整体异地组网演示案例的原理图:
图中IP为192.168.10.2的计算机,如果想访问IP为192.168.20.2的计算机,那么它的数据包的路由转发过程将如下(其他同理):
> tracert 192.168.20.2 通过最多 30 个跃点跟踪到 192.168.20.2 的路由 1 1 ms 1 ms 1 ms 192.168.10.1 2 16 ms 16 ms 16 ms 172.16.0.1 3 26 ms 26 ms 26 ms 172.16.0.3 4 27 ms 27 ms 27 ms 192.168.20.2 跟踪完成。
2 原理
其实这一套方案实现的原理并不难,关键秘诀就在于上方IP为 1.1.1.1 的公网服务器,和中间的3个路由器设备上。路由器作为IP数据包转发的关键设备,用来接入VPN并提供数据包转发最合适不过了。由于市面上家用路由器的固件普遍不支持Wireguard等VPN,并且企业级路由器的购买成本和使用过程中的耗电量非常高昂,所以这里推荐使用软路由设备,并且刷OpenWRT固件,或者直接使用通用的Linux系统。
其组网基本原理是,通过接入wireguard,可以为几个接入了Internet网络的内部网络网关分配IP,并使其互通,从而等效为一张网络层互通的虚拟私有网络,如下图所示。
在图中这里,中间的三个路由器主要起网关作用。根据路由规则,IP为 192.168.10.2 的设备要访问192.168.20.2 的设备,数据包首先会发给它自己的网关 192.168.10.1,然后该路由器根据路由规则会将数据包发给它的上一级路由 172.16.0.1。此时,该“路由器”会在路由表中查询到子网为 192.168.20.0/24 的路由需要发给节点 172.16.0.3,节点 172.16.0.3 收到数据包后根据路由规则,又会发给 192.168.20.2,因此目标主机便会收到数据包。
3 实现步骤
3.1 准备
- 带公网IP的服务器一台 (可以是云服务器,或任何一台具有公网IP的Linux系统主机)
- 软路由设备若干台,每个内部网络至少需要一台 (可以装普通Linux系统,也可以用OpenWrt系统)
- 可用于测试的内网普通主机若干台
3.2 安装
分别在带公网IP的服务器上、若干台软路由器上安装Wireguard。如果使用Linux系统,可以尝试使用一键安装脚本:
https://github.com/hwdsl2/wireguard-install/blob/master/README-zh.md
详细教程这里就不放了,推荐的搜索关键词见下方,用搜索引擎搜一下都有:
Linux安装Wireguard
OpenWrt安装Wireguard
3.3 配置
3.3.1 公网服务器上配置
[Interface] PrivateKey = (保密信息保密信息保密信息) Address = 172.16.0.0/24 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE ListenPort = (自定义端口号) DNS = (自定义DNS解析服务器IP) MTU = 1420 [Peer] PublicKey = (保密信息保密信息保密信息) AllowedIPs = 172.16.0.2/32,192.168.10.0/24 [Peer] PublicKey = (保密信息保密信息保密信息) AllowedIPs = 172.16.0.3/32,192.168.20.0/24 [Peer] PublicKey = (保密信息保密信息保密信息) AllowedIPs = 172.16.0.4/32,192.168.30.0/24
3.3.2 软路由器上配置
以 192.168.10.1 节点上的配置为例:
[Interface] PrivateKey = (保密信息保密信息保密信息) Address = 172.16.0.2/24 PostUp = iptables -A FORWARD -i client_route -j ACCEPT; iptables -A FORWARD -o client_route -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -A FORWARD -i eth0 -j ACCEPT; iptables -A FORWARD -o eth0 -j ACCEPT; iptables -t nat -A POSTROUTING -o client_route -j MASQUERADE PostDown = iptables -D FORWARD -i client_route -j ACCEPT; iptables -D FORWARD -o client_route -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -D FORWARD -i eth0 -j ACCEPT; iptables -D FORWARD -o eth0 -j ACCEPT; iptables -t nat -D POSTROUTING -o client_route -j MASQUERADE DNS = (自定义DNS解析服务器IP) MTU = 1420 [Peer] PublicKey = (保密信息保密信息保密信息) Endpoint = (公网服务器IP):(公网服务器自定义端口号) AllowedIPs = 172.16.0.0/24, 192.168.20.0/24, 192.168.30.0/24 (注意这里不写软路由自身的LAN所在的网段) PersistentKeepalive = 25
3.3.3 开启IPv4/IPv6转发
这个在不同系统上执行的命令不同,推荐通过搜索引擎搜索“Linux下启用IP转发”关键字,全都有。
3.3.4 验证
在其中一个内部网络中,例如 192.168.10.0/24 中,内部任意一台主机可以ping通另一个内部网络中的目标主机,例如 192.168.20.2,反向亦然,则说明异地组网方案实施成功。
4 总结
本篇博客分享了一种基于wireguard的异地组网技术方案。这种方案的优点是安全性高、配置简单、功能强大和免费,缺点是不同内部网络之间的带宽受限于公网服务器的上下行带宽的最小值,并且即使A网络和B网络都在同一个城市,延迟也会等于A网络到公网服务器加上B网络到公网服务器的总延迟。
为了解决这一问题,tailscale 软件也是一个推荐的改进方案,所有的连接均是P2P的,也就是虽然有公网服务器建立的桥梁,但是A和B之间数据可以直通而不必通过公网服务器中转,从而解决上述问题。但该软件的免费版本有使用规模限制,超出规模需购买收费版本,因此仅推荐有财力且有相关需求时再去考虑。
版权声明本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。本文地址: https://blog.ailemon.net/2023/10/25/wg-based-net-connection-bettwen-multi-region/ All articles are under Attribution-NonCommercial-ShareAlike 4.0 |
“基于Wireguard实现多地域设备异地组网”上的4条回复
tailscale依然受限与公网服务器带宽,通过ping命令或者在公网服务器上抓包可以进行验证。且公网服务器的用处就是让内网设备彼此之间能够找到。
奥这样啊,我没抓包验证过tailscale,有空了我试试。公网服务器确实是必不可少的
我的错误,我没弄明白p2p原理,p2p确实不用受限于公网服务器。在建立连接时会用的公网ip。谢谢您的文章
不客气~