WireGuard 教程:WireGuard 的工作原理
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
无论你是想破墙而出,还是想在服务器之间组网,WireGuard 都不会让你失望,它就是组网的『乐高积木』,就像 ZFS 是构建文件系统的『乐高积木』一样。 WireGuard 与其他 威屁恩 协议的性能测试对比: 可以看到 WireGuard 直接碾压其他 威屁恩 协议。再来说说 WireGuard 优点:
WireGuard 不能做的事:
当然,你可以使用 WireGuard 作为底层协议来实现自己想要的功能,从而弥补上述这些缺憾。 本系列 WireGuard 教程分为两个部分,第一部分偏理论,第二部分偏实践。本文是第一部分,下面开始正文教程。 1. WireGuard 术语 Peer/Node/Device连接到 威屁恩 并为自己注册一个 威屁恩 子网地址(如 192.0.2.3)的主机。还可以通过使用逗号分隔的 CIDR 指定子网范围,为其自身地址以外的 IP 地址选择路由。 中继服务器(Bounce Server)一个公网可达的对等节点,可以将流量中继到 子网(Subnet)一组私有 IP,例如 CIDR 表示法这是一种使用掩码表示子网大小的方式,这个不用解释了。 NAT子网的私有 IP 地址由路由器提供,通过公网无法直接访问私有子网设备,需要通过 NAT 做网络地址转换。路由器会跟踪发出的连接,并将响应转发到正确的内部 IP。 公开端点(Public Endpoint)节点的公网 IP 地址:端口,例如 私钥(Private key)单个节点的 WireGuard 私钥,生成方法是: 公钥(Public key)单个节点的 WireGuard 公钥,生成方式为: DNS域名服务器,用于将域名解析为 威屁恩 客户端的 IP,不让 DNS请求泄漏到 威屁恩 之外。 2. WireGuard 工作原理 中继服务器工作原理中继服务器(Bounce Server)和普通的对等节点一样,它能够在 如果所有的对等节点都是公网可达的,则不需要考虑中继服务器,只有当有对等节点位于 NAT 后面时才需要考虑。 在 WireGuard 里,客户端和服务端基本是平等的,差别只是谁主动连接谁而已。双方都会监听一个 UDP 端口,谁主动连接,谁就是客户端。主动连接的客户端需要指定对端的公网地址和端口,被动连接的服务端不需要指定其他对等节点的地址和端口。如果客户端和服务端都位于 NAT 后面,需要加一个中继服务器,客户端和服务端都指定中继服务器作为对等节点,它们的通信流量会先进入中继服务器,然后再转发到对端。 WireGuard 是支持漫游的,也就是说,双方不管谁的地址变动了,WireGuard 在看到对方从新地址说话的时候,就会记住它的新地址(跟 mosh 一样,不过是双向的)。所以双方要是一直保持在线,并且通信足够频繁的话(比如配置 Wireguard 如何路由流量利用 WireGuard 可以组建非常复杂的网络拓扑,这里主要介绍几个典型的拓扑: ① 端到端直接连接 这是最简单的拓扑,所有的节点要么在同一个局域网,要么直接通过公网访问,这样 ② 一端位于 NAT 后面,另一端直接通过公网暴露 这种情况下,最简单的方案是:通过公网暴露的一端作为服务端,另一端指定服务端的公网地址和端口,然后通过 ③ 两端都位于 NAT 后面,通过中继服务器连接 大多数情况下,当通信双方都在 NAT 后面的时候,NAT 会做源端口随机化处理,直接连接可能比较困难。可以加一个中继服务器,通信双方都将中继服务器作为对端,然后维持长连接,流量就会通过中继服务器进行转发。 ④ 两端都位于 NAT 后面,通过 UDP NAT 打洞 上面也提到了,当通信双方都在 NAT 后面的时候,直接连接不太现实,因为大多数 NAT 路由器对源端口的随机化相当严格,不可能提前为双方协调一个固定开放的端口。必须使用一个信令服务器( 如果某一端同时连接了多个对端,当它想访问某个 IP 时,如果有具体的路由可用,则优先使用具体的路由,否则就会将流量转发到中继服务器,然后中继服务器再根据系统路由表进行转发。你可以通过测量 ping 的时间来计算每一跳的长度,并通过检查对端的输出( WireGuard 报文格式WireGuard 使用加密的 UDP 报文来封装所有的数据,UDP 不保证数据包一定能送达,也不保证按顺序到达,但隧道内的 TCP 连接可以保证数据有效交付。WireGuard 的报文格式如下图所示: 关于 WireGuard 报文的更多信息可以参考下面几篇文档: WireGuard 的性能WireGuard 声称其性能比大多数 威屁恩 协议更好,但这个事情有很多争议,比如某些加密方式支持硬件层面的加速。 WireGuard 直接在内核层面处理路由,直接使用系统内核的加密模块来加密数据,和 Linux 原本内置的密码子系统共存,原有的子系统能通过 关于性能比较的更多信息可以参考下面几篇文档:
WireGuard 安全模型WireGuard 使用以下加密技术来保障数据的安全:
WireGuard 的加密技术本质上是 关于 WireGuard 加密的更多资料请参考下方链接: WireGuard 密钥管理WireGuard 通过为每个对等节点提供简单的公钥和私钥来实现双向认证,每个对等节点在设置阶段生成密钥,且只在对等节点之间共享密钥。每个节点除了公钥和私钥,不再需要其他证书或预共享密钥。 在更大规模的部署中,可以使用 下面是一些有助于密钥分发和部署的服务: 如果你不想在
从技术上讲,多个服务端之间可以共享相同的私钥,只要客户端不使用相同的密钥同时连接到两个服务器。但有时客户端会需要同时连接多台服务器,例如,你可以使用 该文章在 2024/7/24 18:54:39 编辑过 |
关键字查询
相关文章
正在查询... |