问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

WireGuard 教程:使用 DNS-SD 进行 NAT-to-NAT 穿透

发布网友 发布时间:2024-10-10 05:14

我来回答

1个回答

热心网友 时间:2024-11-12 17:37

原文链接: *cloudnative.io/post...

WireGuard 是由 Jason A. Donenfeld 等人创建的下一代开源 VPN 协议,旨在解决许多困扰 IPSec/IKEv2、OpenVPN 或 L2TP 等其他 VPN 协议的问题。2020 年 1 月 29 日,WireGuard 正式合并进入 Linux 5.6 内核主线。

利用 WireGuard 我们可以实现很多非常奇妙的功能,比如跨公有云组建 Kubernetes 集群,本地直接访问公有云 Kubernetes 集群中的 Pod IP 和 Service IP,在家中没有公网 IP 的情况下直连家中的设备,等等。

如果你是第一次听说 WireGuard,建议你花点时间看看我之前写的 WireGuard 工作原理。然后可以参考下面两篇文章来快速上手:

如果遇到某些细节不太明白的,再去参考 WireGuard 配置详解。

本文将探讨 WireGuard 使用过程中遇到的一个重大难题:如何使两个位于 NAT 后面(且没有指定公网出口)的客户端之间直接建立连接。

WireGuard 不区分服务端和客户端,大家都是客户端,与自己连接的所有客户端都被称之为Peer。

1. IP 不固定的 Peer

WireGuard 的核心部分是 加密密钥路由(Cryptokey Routing),它的工作原理是将公钥和 IP 地址列表(AllowedIPs)关联起来。每一个网络接口都有一个私钥和一个 Peer 列表,每一个 Peer 都有一个公钥和 IP 地址列表。发送数据时,可以把 IP 地址列表看成路由表;接收数据时,可以把 IP 地址列表看成访问控制列表。

公钥和 IP 地址列表的关联组成了 Peer 的必要配置,从隧道验证的角度看,根本不需要 Peer 具备静态 IP 地址。理论上,如果 Peer 的 IP 地址不同时发生变化,WireGuard 是可以实现 IP 漫游的。

现在回到最初的问题:假设两个 Peer 都在 NAT 后面,且这个 NAT 不受我们控制,无法配置 UDP 端口转发,即无法指定公网出口,要想建立连接,不仅要动态发现 Peer 的 IP 地址,还要发现 Peer 的端口。

找了一圈下来,现有的工具根本无法实现这个需求,本文将致力于不对 WireGuard 源码做任何改动的情况下实现上述需求。

2. 中心辐射型网络拓扑

你可能会问我为什么不使用 中心辐射型(hub-and-spoke)网络拓扑?中心辐射型网络有一个 VPN 网关,这个网关通常都有一个静态 IP 地址,其他所有的客户端都需要连接这个 VPN 网关,再由网关将流量转发到其他的客户端。假设 Alice 和 Bob 都位于 NAT 后面,那么 Alice 和 Bob 都要和网关建立隧道,然后 Alice 和 Bob 之间就可以通过 VPN 网关转发流量来实现相互通信。

其实这个方法是如今大家都在用的方法,已经没什么可说的了,缺点相当明显:

本文想探讨的是Alice 和 Bob 之间直接建立隧道,中心辐射型(hub-and-spoke)网络拓扑是无法做到的。

3. NAT 穿透

要想在Alice 和 Bob 之间直接建立一个 WireGuard 隧道,就需要它们能够穿过挡在它们面前的 NAT。由于 WireGuard 是通过 UDP 来相互通信的,所以理论上 UDP 打洞(UDP hole punching) 是最佳选择。

UDP 打洞(UDP hole punching)利用了这样一个事实:大多数 NAT 在将入站数据包与现有的连接进行匹配时都很宽松。这样就可以重复使用端口状态来打洞,因为 NAT 路由器不会*只接收来自原始目的地址(信使服务器)的流量,其他客户端的流量也可以接收。

举个例子,假设Alice 向新主机 Carol 发送一个 UDP 数据包,而 Bob 此时通过某种方法获取到了 Alice 的 NAT 在地址转换过程中使用的出站源 IP:Port,Bob 就可以向这个 IP:Port(2.2.2.2:7777) 发送 UDP 数据包来和 Alice 建立联系。

其实上面讨论的就是完全圆锥型 NAT(Full cone NAT),即一对一(one-to-one)NAT。它具有以下特点:

大部分的 NAT 都是这种 NAT,对于其他少数不常见的 NAT,这种打洞方法有一定的局限性,无法顺利使用。

4. STUN

回到上面的例子,UDP 打洞过程中有几个问题至关重要:

RFC5389 关于 STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)的详细描述中定义了一个协议回答了上面的一部分问题,这是一篇内容很长的 RFC,所以我将尽我所能对其进行总结。先提醒一下,STUN 并不能直接解决上面的问题,它只是个扳手,你还得拿他去打造一个称手的工具:

STUN 本身并不是 NAT 穿透问题的解决方案,它只是定义了一个机制,你可以用这个机制来组建实际的解决方案。 — RFC5389

STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的 NAT 之后以及 NAT 为某一个本地端口所绑定的公网端口。这些信息被用来在两个同时处于 NAT 路由器之后的主机之间建立 UDP 通信。该协议由 RFC 5389 定义。

STUN 是一个客户端-服务端协议,在上图的例子中,Alice 是客户端,Carol 是服务端。Alice 向 Carol 发送一个 STUN Binding 请求,当 Binding 请求通过 Alice 的 NAT 时,源 IP:Port 会被重写。当 Carol 收到 Binding 请求后,会将三层和四层的源 IP:Port 复制到 Binding 响应的有效载荷中,并将其发送给 Alice。Binding 响应通过 Alice 的 NAT 转发到内网的 Alice,此时的目标 IP:Port 被重写成了内网地址,但有效载荷保持不变。Alice 收到 Binding 响应后,就会意识到这个 Socket 的公网 IP:Port 是 2.2.2.2:7777。

然而,STUN 并不是一个完整的解决方案,它只是提供了这么一种机制,让应用程序获取到它的公网 IP:Port,但 STUN 并没有提供具体的方法来向相关方向发出信号。如果要重头编写一个具有 NAT 穿透功能的应用,肯定要利用 STUN 来实现。当然,明智的做法是不修改 WireGuard 的源码,最好是借鉴 STUN 的概念来实现。总之,不管如何,都需要一个拥有静态公网地址的主机来充当信使服务器。

5. NAT 穿透示例

早在 2016 年 8 月...
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
母爱作文(围绕一句话来写)900字 月经期能喝冰糖沙梨水? 石家庄火车站骗钱 五等分的新娘手游汉化安卓游戏官方下载 昆明看守所那个看守所好在 成建军行政拘留 青岛贵捷充换电设备成套服务有限公司怎么样? 合肥贵捷商贸有限责任公司怎么样? 南京贵捷物资有限公司怎么样? 上海贵捷电气有限公司产品用途 NAT穿越是什么意思呀? UPNP经典应用 苹果六plus碎屏换屏幕的多少钱 ...里面有条语言信息说(是个男人说话):求你放过我吧,这种 跪求《老师,放过我》文 / 婉转的蓝 TXT全本+番外. ...老师提醒我以后的考试不能带进来了,这是不是意味着老师放过我... ...老师提醒我以后的考试不能带进来了,这是不是意味着老师放过我... 真丝面料的特点南韩丝与真丝的区别方法 这是不是作弊,老师放过我了吗? 这是不是作弊,老师放过我了吗? 2018惠州公务员工资待遇? 公务员工资怎么算 2019年公务员工资标准套改等级对照表公布 我在自考中看夹带被抓,请问考场老师没叫我签字是不是放过我了啊 我在自考中看夹带被抓,请问考场老师没叫我签字是不是放过我了啊 线上测试作弊,老师会放过我吗? 线上测试作弊,老师会放过我吗? 真丝面料如何通过摩擦声音鉴别真假? 空调出现F3怎么处理? ...片法箅式里,被减数,减数与差的和等于120,而减数是差的5倍.差是多少... ...被减数、减数、差的和是120,差与减数比是1:4,减数是__ 长虹55寸液晶电视哪款性价比高? 苹果六plus 换个屏幕需要多少钱? tcp穿越nat为什么很难 长虹电视55寸和创维50∨5电视哪个好 中国是第几个造原子弹的国家 我是一级建造师,可是我现单位不是建设单位? 一级建造师报名同一年可以更换单位么 三支一扶免试入读本科是什么意思 取得一级建造师后跳槽有影响吗 网关路由的NAT-T功能怎么打开? 我今年报考一级建造师,公司还让签个协议,明年我已老考生报名,能换单位... ...错误619不能连接到远程服务器,端口已经关闭。怎么解决? ...8个小时单休环境比较好但是工资只有3000多一点的工作,还有一个一天... 高圣远个人档案 NAT-T怎么打开? 如何打开NAT-T功能 VPN客户端拨入时出现619错误是怎么回事? VPN客户端驱动程序遇到一个错误,无法建立VPN 思科VPN 配置中 crypto isakmp nat-traversal 的作用? 脑袋有屎是什么动物