udp2raw icon indicating copy to clipboard operation
udp2raw copied to clipboard

怎样给zerotier套上udp2raw-tunnel?

Open piiiiiiiiiiiiiii opened this issue 4 years ago • 67 comments

zerotier是一个p2p的水管,可以做到点对点穿透并直联,自建lan非常快,但是很容易被isp流控。

能否给zerotier套上udp2raw-tunnel,谢谢

piiiiiiiiiiiiiii avatar Jul 16 '20 01:07 piiiiiiiiiiiiiii

可以,windows版不支持服务端,但是可以在路由器中运行服务端(OpenWrt这些),zerotier再配置下路由,可以直接暴露内网的机器,最后客户端直接在远程主机上启动就行了 TIM图片20200726173514 TIM图片20200726173518

TKaxv-7S avatar Jul 26 '20 09:07 TKaxv-7S

@TKaxv-7S

效果如何?

piiiiiiiiiiiiiii avatar Sep 15 '20 02:09 piiiiiiiiiiiiiii

@piiiiiiiiiiiiiii 速度应该是一样的,我用出口带宽能跑满

TKaxv-7S avatar Sep 15 '20 02:09 TKaxv-7S

@TKaxv-7S 可以大佬你的截图我没看懂,怎么用呢?

是不是每个zerotier节点上面都需要部署udp2raw-tunnel ? 请详细说一下,谢谢

piiiiiiiiiiiiiii avatar Sep 16 '20 01:09 piiiiiiiiiiiiiii

@piiiiiiiiiiiiiii 速度应该是一样的,我用出口带宽能跑满

我有和本issues同样的疑问,借现有的issues问一下: 我看readme.md有提到:

假设您有一个服务器,ip为44.55.66.77,有一个服务监听在udp 7777端口。假设您本地的主机到44.55.66.77的UDP流量被屏蔽了,或者被qos了。 <中间的命令部分省略……> 想要在本地连接44.55.66.77:7777,只需要连接127.0.0.1:3333

这样,上边我理解的意思是端口是一对一通过隧道手动去映射到客户端的。但是zerotier-one udp穿透成功之后用于数据传输的端口似乎是随机的啊。我抓包看过,穿透成功后,没有任何一方的数据是通过控制平面端口9993进行通信的,不太能理解,您这样做完真的有效果么?还是说我对udp2raw-tunnel使用方法理解有错误?

flyfishcn avatar Sep 16 '20 02:09 flyfishcn

@flyfishcn udp2raw-tunnel是套在zerotier外的,肯定不会走9993端口了

TKaxv-7S avatar Sep 16 '20 03:09 TKaxv-7S

@piiiiiiiiiiiiiii 如果你的每个节点都需要用到udp2raw-tunnel,那每个节点都需要进行部署(对应服务端和客户端)。 如果你需要双向打通,那在每台电脑上要同时部署服务端与客户端。 如果你只需要单向打通,那在服务端上只有需要部署udp2raw-tunnel server,客户端(一台或多台)只需要部署udp2raw-tunnel client。

拿远程控制举例: ZeroTier配置:在官网页面单独给服务端设备(OpenWrt)配置路由,其他保持自己的配置就行 服务端设备(OpenWrt):部署ZeroTier、udp2raw-tunnel server,路由器再连接到目标主机(被控端电脑),同时要给目标主机分配静态IP并配置好udp2raw的端口、IP参数信息,启动udp2raw服务,长期用可以设置开机自启,目标主机上什么都不要配置,等待连接就行了。 客户端设备(控制端电脑):部署ZeroTier、udp2raw-tunnel client,配置好udp2raw的端口、IP参数信息,启动udp2raw客户端,自动连接上,现在可以启动远程工具,使用目标主机的静态IP连接即可。 上面只是大概介绍下流程,因为这个的确很麻烦,很多细节没法说清楚,实在想用是可以自己折腾出来的,这个作为参考应该会有帮助

TKaxv-7S avatar Sep 16 '20 03:09 TKaxv-7S

@flyfishcn udp2raw-tunnel是套在zerotier外的,肯定不会走9993端口了

我的意思是,我在没套udp2raw-tunnel的情况下,抓到的数据传输依旧是随机端口的,不是走控制平面的9993端口。所以我不太确定您的操作是否真的有起到作用。因为我这里开了udp2raw-tunnel的机器,仍然能抓到和对端的UDP通信,似乎就是没生效,在控制台中也看不到对端机器有连接。(当然我只测了我这里的两台设备,没有更多的数据来验证。)而按readme.md中的使用方法介绍看,udp伪装好像也只是指定端口,而非全局的。我有疑问的是这一点。

另外,我有测能指定连接端口的程序,是能正常走udp2raw-tunnel的,在控制台也能看到连接信息。

flyfishcn avatar Sep 16 '20 05:09 flyfishcn

@flyfishcn 你的网络环境应该很简单,可能是直通了,zerotier打洞适用在复杂的网络情况下,可以用多层路由的网络试试,我的网络环境很复杂,可以肯定的告诉你是有用的,远程控制、包括串流玩游戏都很稳定,在之前是一直被运营商断流的,后面的问题,用udp2raw-tunnel肯定是需要指定好端口的,没走这个端口的包那肯定是没被udp2raw-tunnel处理的

TKaxv-7S avatar Sep 16 '20 06:09 TKaxv-7S

@piiiiiiiiiiiiiii 如果你的每个节点都需要用到udp2raw-tunnel,那每个节点都需要进行部署(对应服务端和客户端)。 如果你需要双向打通,那在每台电脑上要同时部署服务端与客户端。 如果你只需要单向打通,那在服务端上只有需要部署udp2raw-tunnel server,客户端(一台或多台)只需要部署udp2raw-tunnel client。

拿远程控制举例: ZeroTier配置:在官网页面单独给服务端设备(OpenWrt)配置路由,其他保持自己的配置就行 服务端设备(OpenWrt):部署ZeroTier、udp2raw-tunnel server,路由器再连接到目标主机(被控端电脑),同时要给目标主机分配静态IP并配置好udp2raw的端口、IP参数信息,启动udp2raw服务,长期用可以设置开机自启,目标主机上什么都不要配置,等待连接就行了。 客户端设备(控制端电脑):部署ZeroTier、udp2raw-tunnel client,配置好udp2raw的端口、IP参数信息,启动udp2raw客户端,自动连接上,现在可以启动远程工具,使用目标主机的静态IP连接即可。 上面只是大概介绍下流程,因为这个的确很麻烦,很多细节没法说清楚,实在想用是可以自己折腾出来的,这个作为参考应该会有帮助

zerotier本来是客户端点到点的,那么套了udp2raw-tunnel的话,由于要走服务器,那么速度不就受限于服务器带宽了?

piiiiiiiiiiiiiii avatar Sep 16 '20 07:09 piiiiiiiiiiiiiii

@piiiiiiiiiiiiiii 看来上面都白说了。。。套udp2raw-tunnel也是点对点,只是客户端、服务端都需要搭好,还有,点对点本来就是受限与某一方带宽,与之前完全没有区别,不是“由于要走服务器”,而是数据本身就是服务器传出来的。。。中间没有第三方服务器参与流量转发

TKaxv-7S avatar Sep 16 '20 08:09 TKaxv-7S

@flyfishcn 你的网络环境应该很简单,可能是直通了,zerotier打洞适用在复杂的网络情况下,可以用多层路由的网络试试,我的网络环境很复杂,可以肯定的告诉你是有用的,远程控制、包括串流玩游戏都很稳定,在之前是一直被运营商断流的,后面的问题,用udp2raw-tunnel肯定是需要指定好端口的,没走这个端口的包那肯定是没被udp2raw-tunnel处理的

我这里一边是公网,一边是内网。但是想问的就是直通就不能用udp2raw-tunnel改善UDP QoS问题了么?udp带宽被QoS到只有1、2M,高峰时期可能连1M都达不到。TCP就能跑挺快,但是又不想TCP套TCP,会有一些问题。

还有我换个问法吧: 您之前提到:

用udp2raw-tunnel肯定是需要指定好端口的,没走这个端口的包那肯定是没被udp2raw-tunnel处理的

既然是指定端口,而zerotier-one并不能显式指定连接其他主机的ip和端口,那么如何让zerotier走udp2raw-tunnel?我这里在出口防火墙上抓包,能看到我两个主机之间的通信是走了随机端口的。而不是走了伪装过的TCP端口4096。

flyfishcn avatar Sep 16 '20 08:09 flyfishcn

@flyfishcn 其实你的问题就是zerotier没走udp2raw-tunnel,应该是调用时IP指向错了,查一下udp2raw-tunnel和zerotier的官方文档,理清服务端、客户端、zerotier默认路由与子路由之间的IP关系,应该就解决了

TKaxv-7S avatar Sep 16 '20 09:09 TKaxv-7S

@piiiiiiiiiiiiiii 看来上面都白说了。。。套udp2raw-tunnel也是点对点,只是客户端、服务端都需要搭好,还有,点对点本来就是受限与某一方带宽,与之前完全没有区别,不是“由于要走服务器”,而是数据本身就是服务器传出来的。。。中间没有第三方服务器参与流量转发

明白了。 如果zerotier自身也支持udp包协议混淆就nb了。

piiiiiiiiiiiiiii avatar Sep 23 '20 00:09 piiiiiiiiiiiiiii

我也有相同疑问,目前两台主机已经使用zerotier连通,但ping值太高,没有直连,走的中继,速度很慢,由于两台主机网络的限制且(无论是NAT类型还是禁止UDP)无法修改,所以我想问的是:是否可以使用udp2raw-tunnel来实现两台主机直连,如果可以是否有详细一点的操作说明?zerotier upd2raw-tunnel相关问题资源太少,只找到了当前话题,谢谢~

i-sync avatar Sep 24 '20 12:09 i-sync

我也有相同疑问,目前两台主机已经使用zerotier连通,但ping值太高,没有直连,走的中继,速度很慢,由于两台主机网络的限制且(无论是NAT类型还是禁止UDP)无法修改,所以我想问的是:是否可以使用udp2raw-tunnel来实现两台主机直连,如果可以是否有详细一点的操作说明?zerotier upd2raw-tunnel相关问题资源太少,只找到了当前话题,谢谢~

不排除是isp对协议有限制导致你的点对点不能握手成功,你可以搭一台自己的moon服务器试试

piiiiiiiiiiiiiii avatar Sep 25 '20 03:09 piiiiiiiiiiiiiii

@TKaxv-7S 大佬我想问下使用zerotier的话需要在两端都使用OpenWrt吗?

libra146 avatar Oct 29 '20 14:10 libra146

@TKaxv-7S 大佬我想问下使用zerotier的话需要在两端都使用OpenWrt吗?

一端就行

TKaxv-7S avatar Oct 29 '20 14:10 TKaxv-7S

@TKaxv-7S 感谢回复,再请教个问题,既然upd2raw-tunnel是套在zerotier外面的,那么问题在于,upd2raw-tunnel是怎么连接上服务器的?因为在配置时服务器客户端都要指定IP地址,服务器肯定是监听所有IP,那客户端的IP如何配置呢?配置成服务器的外网IP吗?还是说使用--lower-level参数走数据链路层?服务器的外网IP直接连接是不可以的, 因为还有运营商nat的存在,不打洞是无法直接连接上的。 image 就像这张图,其中数据发送流程就是:通过虚拟网卡加路由的方式将需要走隧道的流量转发到openvpn client,然后openvpn client通过配置文件中配置好的端口将流量转发给本地地址的3333端口,upd2raw-tunnel客户端将流量加密后发送给IP为45.66.77.88:8855的服务器,之后解密发送给openvpn server,通过虚拟网卡加路由转发给应用程序。这个流程是没问题的。 但是其中upd2raw-tunnel 客户端需要连接45.66.77.88:8855,这个IP看起来是个外网IP,如果是两个内网打洞的话是没有这个IP的,这时应该怎么配置upd2raw-tunnel客户端呢?

libra146 avatar Oct 30 '20 02:10 libra146

@TKaxv-7S 感谢回复,再请教个问题,既然upd2raw-tunnel是套在zerotier外面的,那么问题在于,upd2raw-tunnel是怎么连接上服务器的?因为在配置时服务器客户端都要指定IP地址,服务器肯定是监听所有IP,那客户端的IP如何配置呢?配置成服务器的外网IP吗?还是说使用--lower-level参数走数据链路层?服务器的外网IP直接连接是不可以的, 因为还有运营商nat的存在,不打洞是无法直接连接上的。 image 就像这张图,其中数据发送流程就是:通过虚拟网卡加路由的方式将需要走隧道的流量转发到openvpn client,然后openvpn client通过配置文件中配置好的端口将流量转发给本地地址的3333端口,upd2raw-tunnel客户端将流量加密后发送给IP为45.66.77.88:8855的服务器,之后解密发送给openvpn server,通过虚拟网卡加路由转发给应用程序。这个流程是没问题的。 但是其中upd2raw-tunnel 客户端需要连接45.66.77.88:8855,这个IP看起来是个外网IP,如果是两个内网打洞的话是没有这个IP的,这时应该怎么配置upd2raw-tunnel客户端呢?

配置地址是zerotier的指定的路由地址,比如:192.168.1.1、172.28.0.2,但这个地址是zerotier提供的。如果按照你的思路来,我之前说的upd2raw-tunnel在zerotier外 可能是错的,有可能是zerotier在upd2raw-tunnel外,又或者里外都有做数据处理,具体原理没深入,只能问作者了,但是有一点:客户端使用的地址是zerotier提供的,而且一定可用。

TKaxv-7S avatar Oct 30 '20 04:10 TKaxv-7S

@TKaxv-7S 我不是说我的思路是对的,我只是借用这张图来解释我认为可能的思路和数据流向,这张图所有的数据流向都是在第三层进行处理的,因为都用到了IP地址。我认为upd2raw-tunnel在zerotier外是对的,但是如果upd2raw-tunnel需要使用到zerotier的IP地址的话和前面的假设相冲突,这里就有了矛盾。 而且按理说如果zerotier在upd2raw-tunnel外的话,应该达不到抵抗qos的效果,因为数据包仍然是zerotier发送的,最外层仍然是udp,并且被upd2raw-tunnel处理过的包是被加密后放到了zerotier的udp包中的。。 所以大佬能否简单分享下大概的数据流向?

libra146 avatar Oct 31 '20 02:10 libra146

@TKaxv-7S 我不是说我的思路是对的,我只是借用这张图来解释我认为可能的思路和数据流向,这张图所有的数据流向都是在第三层进行处理的,因为都用到了IP地址。我认为upd2raw-tunnel在zerotier外是对的,但是如果upd2raw-tunnel需要使用到zerotier的IP地址的话和前面的假设相冲突,这里就有了矛盾。 而且按理说如果zerotier在upd2raw-tunnel外的话,应该达不到抵抗qos的效果,因为数据包仍然是zerotier发送的,最外层仍然是udp,并且被upd2raw-tunnel处理过的包是被加密后放到了zerotier的udp包中的。。 所以大佬能否简单分享下大概的数据流向?

其实我的疑问和你一样,按理说upd2raw-tunnel应该包在zerotier外,但是又和zerotier的IP路由有冲突,也是没想通,所以才会猜想upd2raw-tunnel在zerotier拿到网络数据前后都进行了处理,不然无法解释,真的要理解原理可能还是得看源码,可惜我是做Java的,看不懂C,我就不深入了,能用就行,哈哈

TKaxv-7S avatar Oct 31 '20 08:10 TKaxv-7S

@TKaxv-7S 好的,了解了,我自己再研究下,感谢大佬😁

libra146 avatar Nov 01 '20 02:11 libra146

@TKaxv-7S 好的,了解了,我自己再研究下,感谢大佬😁

我也只是个用户,大佬还是作者,没帮上你什么,不用这么客气哈😄

TKaxv-7S avatar Nov 01 '20 05:11 TKaxv-7S

@TKaxv-7S 大佬我想问下使用zerotier的话需要在两端都使用OpenWrt吗?

一端就行

如果是一端还有机会,两端就歇菜了,总不能走哪多带一个前置路由器 : )

piiiiiiiiiiiiiii avatar Dec 01 '20 07:12 piiiiiiiiiiiiiii

@TKaxv-7S 好的,了解了,我自己再研究下,感谢大佬😁

我也只是个用户,大佬还是作者,没帮上你什么,不用这么客气哈😄

成功在用了吗?

piiiiiiiiiiiiiii avatar Dec 01 '20 07:12 piiiiiiiiiiiiiii

@TKaxv-7S 朋友,请教下: 我这边的电信宽带的主机,远程控制rdp端口3389家里的移动宽带下的电脑,路由是n1已经配好zerotier和udp2raw server 请问端口怎么配置? server端 ./udp2raw_arm -s -l 0.0.0.0:4096 -r 192.168.194.64:3389 -a -k "passwd" --raw-mod e faketcp client端 ./udp2raw_mp.exe -c -l0.0.0.0:3333 -r192.168.194.154:4096 -k "passwd" --raw-mode easy-faketcp 如上配置,握手已经成功,但还是会被断流。154是路由,64是远程主机,即被控电脑(192的ip都是zerotier上生成的) 另外请问:套了这个udp2raw会和zerotier的moon模式有冲突吗?

zdypop avatar Dec 11 '20 07:12 zdypop

@TKaxv-7S 大佬好,挺好奇这个操作的,我有个问题,你说udp2raw是套在zerotier外面,但是udp2raw 并不具备打洞功能,是不是说你的 udp2raw server 是具有公网 IP 的?

如果有公网 IP 的话,那 zerotier 就显得有点多余了吧?或者说用 tinyfecVPN 就可以。

如果没有公网 IP 的话,是怎么解决打洞问题的?目前 zerotier 的打洞原理是基于运营商的 NAT 对 UDP 的响应,伪装成 TCP 的话,那么 NAT 也就会当成 TCP 去响应了吧,这时候 zerotier 的打洞还有效吗?

我这里搬运一下 https://github.com/coolsnowwolf/lede/issues/4124#issuecomment-606682243 的评论:

因为TCP和UDP在打洞行为不同,这是Socket(标准socket规范)的API造成的:

UDP的socket允许多个socket绑定到同一个本地端口,而TCP的socket则不允许

这是这样一个意思:A B要连接到S,肯定首先A B双方都会在本地创建一个socket, 去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写 端口,实际上也是绑定了的),假设为8888,这样A和B才分别建立了到S的通信信道。

接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。

但是如果是TCP的socket,则不能再创建socket并绑定到8888了,这样打洞就无法成功。

miyouzi avatar Dec 12 '20 01:12 miyouzi

@TKaxv-7S 大佬好,挺好奇这个操作的,我有个问题,你说udp2raw是套在zerotier外面,但是udp2raw 并不具备打洞功能,是不是说你的 udp2raw server 是具有公网 IP 的?

如果有公网 IP 的话,那 zerotier 就显得有点多余了吧?或者说用 tinyfecVPN 就可以。

如果没有公网 IP 的话,是怎么解决打洞问题的?目前 zerotier 的打洞原理是基于运营商的 NAT 对 UDP 的响应,伪装成 TCP 的话,那么 NAT 也就会当成 TCP 去响应了吧,这时候 zerotier 的打洞还有效吗?

我这里搬运一下 coolsnowwolf/lede#4124 (comment) 的评论:

因为TCP和UDP在打洞行为不同,这是Socket(标准socket规范)的API造成的: UDP的socket允许多个socket绑定到同一个本地端口,而TCP的socket则不允许 这是这样一个意思:A B要连接到S,肯定首先A B双方都会在本地创建一个socket, 去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写 端口,实际上也是绑定了的),假设为8888,这样A和B才分别建立了到S的通信信道。 接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。 但是如果是TCP的socket,则不能再创建socket并绑定到8888了,这样打洞就无法成功。

我的服务端装在自己的OpenWrt路由上,可以确定是没有公网IP,因为外面还有光猫。

上面的回复中我们也讨论过这个问题,这个操作确实很迷,我之前也只是发现能用,但是根据原理分析有一些地方说不通,不知道作者如何实现的,暂时只能胡乱猜想了

TKaxv-7S avatar Dec 12 '20 03:12 TKaxv-7S

@TKaxv-7S 朋友,请教下: 我这边的电信宽带的主机,远程控制rdp端口3389家里的移动宽带下的电脑,路由是n1已经配好zerotier和udp2raw server 请问端口怎么配置? server端 ./udp2raw_arm -s -l 0.0.0.0:4096 -r 192.168.194.64:3389 -a -k "passwd" --raw-mod e faketcp client端 ./udp2raw_mp.exe -c -l0.0.0.0:3333 -r192.168.194.154:4096 -k "passwd" --raw-mode easy-faketcp 如上配置,握手已经成功,但还是会被断流。154是路由,64是远程主机,即被控电脑(192的ip都是zerotier上生成的) 另外请问:套了这个udp2raw会和zerotier的moon模式有冲突吗?

配置看起来完全没问题,唯一不一样就是我的server配置没有 -a,你再调试下,找找问题问大佬吧,我也只是个普通用户 第二个问题:我也搭了moon,根据我使用的情况看来没有冲突

TKaxv-7S avatar Dec 12 '20 03:12 TKaxv-7S

@TKaxv-7S udp2raw client 需要一个 server 的IP 去连接,那么这个 IP 你用的是什么 IP 呢?是 zerotier 网络中的 IP 是吗?

拿远程控制举例: ZeroTier配置:在官网页面单独给服务端设备(OpenWrt)配置路由,其他保持自己的配置就行 服务端设备(OpenWrt):部署ZeroTier、udp2raw-tunnel server,路由器再连接到目标主机(被控端电脑),同时要给目标主机分配静态IP并配置好udp2raw的端口、IP参数信息,启动udp2raw服务,长期用可以设置开机自启,目标主机上什么都不要配置,等待连接就行了。 客户端设备(控制端电脑):部署ZeroTier、udp2raw-tunnel client,配置好udp2raw的端口、IP参数信息,启动udp2raw客户端,自动连接上,现在可以启动远程工具,使用目标主机的静态IP连接即可。 上面只是大概介绍下流程,因为这个的确很麻烦,很多细节没法说清楚,实在想用是可以自己折腾出来的,这个作为参考应该会有帮助

按照大佬上面的这段表述来看,是先搭建起了 zerotier 网络,然后再在这个网络中再去搭建 udp2raw 对吧?那其实是 zerotier 包在 udp2raw 外面。

至于你提到的效果变好的问题,下面是我的猜测: 我在readme中看到这段话:

心跳保活、自动重连,连接恢复

心跳保活、自动重连,udp2raw重连可以恢复上次的连接,重连后上层连接继续有效,底层掉线上层不掉线。有效解决上层连接断开的问题。 (功能借鉴自kcptun-raw)(就算你拔掉网线重插,或者重新拨号获得新ip,上层应用也不会断线)

加密、防重放攻击

用aes128cbc加密(或更弱的xor),hmac-sha1(或更弱的md5/crc32/simple)做数据完整校验。用类似ipsec/openvpn的replay window机制来防止重放攻击。

其他特性

信道复用,client的udp端支持多个连接。 server支持多个client,也能正确处理多个连接的重连和连接恢复。 NAT 穿透 ,tcp icmp udp模式都支持nat穿透。

我猜测是 udp2raw 提供了这些特性使得在 udp2raw 之上的连接更为稳定,不过从运营商来看,应该看起来都还是 UDP 数据流的样子(和 ISP 的包探测程序有关)。或者还有个可能:就是 ISP 负责 QoS 的包探测程序和 NAT 对包的识别是两套系统,这可能会导致 NAT 识别包为 UDP 并成功打洞,而 QoS 程序探测包为 TCP 而采取了和 UDP 不同的对待策略。

另外,说明中的 NAT 穿透 ,tcp icmp udp模式都支持nat穿透。 很有意思,不知道是不是指的我们这边的 P2P 穿透,如果作者能说明的话就好了

miyouzi avatar Dec 12 '20 03:12 miyouzi