wangyu- / udp2raw

A Tunnel which Turns UDP Traffic into Encrypted UDP/FakeTCP/ICMP Traffic by using Raw Socket,helps you Bypass UDP FireWalls(or Unstable UDP Environment)
MIT License
7.17k stars 1.16k forks source link

怎样给zerotier套上udp2raw-tunnel? #332

Open piiiiiiiiiiiiiii opened 4 years ago

piiiiiiiiiiiiiii commented 4 years ago

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

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

TKaxv-7S commented 4 years ago

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

piiiiiiiiiiiiiii commented 4 years ago

@TKaxv-7S

效果如何?

TKaxv-7S commented 4 years ago

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

piiiiiiiiiiiiiii commented 4 years ago

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

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

flyfishcn commented 4 years ago

@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使用方法理解有错误?

TKaxv-7S commented 4 years ago

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

TKaxv-7S commented 4 years ago

@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连接即可。 上面只是大概介绍下流程,因为这个的确很麻烦,很多细节没法说清楚,实在想用是可以自己折腾出来的,这个作为参考应该会有帮助

flyfishcn commented 4 years ago

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

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

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

TKaxv-7S commented 4 years ago

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

piiiiiiiiiiiiiii commented 4 years ago

@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的话,由于要走服务器,那么速度不就受限于服务器带宽了?

TKaxv-7S commented 4 years ago

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

flyfishcn commented 4 years ago

@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。

TKaxv-7S commented 4 years ago

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

piiiiiiiiiiiiiii commented 4 years ago

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

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

i-sync commented 4 years ago

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

piiiiiiiiiiiiiii commented 4 years ago

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

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

libra146 commented 3 years ago

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

TKaxv-7S commented 3 years ago

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

一端就行

libra146 commented 3 years ago

@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客户端呢?

TKaxv-7S commented 3 years ago

@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提供的,而且一定可用。

libra146 commented 3 years ago

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

TKaxv-7S commented 3 years ago

@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,我就不深入了,能用就行,哈哈

libra146 commented 3 years ago

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

piiiiiiiiiiiiiii commented 3 years ago

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

一端就行

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

piiiiiiiiiiiiiii commented 3 years ago

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

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

成功在用了吗?

zdypop commented 3 years ago

@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模式有冲突吗?

miyouzi commented 3 years ago

@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了,这样打洞就无法成功。

TKaxv-7S commented 3 years ago

@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 commented 3 years ago

@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,根据我使用的情况看来没有冲突

miyouzi commented 3 years ago

@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 穿透,如果作者能说明的话就好了

TKaxv-7S commented 3 years ago

@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 穿透,如果作者能说明的话就好了

很有可能是你说的这种情况,确实效果很好了,远程串流打游戏都能支持(至少坦克世界1080P非常顺畅),不过有时候会有瞬间的卡顿,影响微乎其微,可能就是利用了运营商策略的漏洞,有机会的话以后看源码再研究下,暂时先不深究了😄 我感觉这个项目有点黑科技的感觉,作者虽然没说很清楚,但是实际使用效果是有意料之外的提升,还是挺感谢作者,不过确实能说明白就更好了

miyouzi commented 3 years ago

我在 ZeroTier 的论坛提交了加入udp2raw的请求(英语渣请不要介意:sweat_smile:),有兴趣的话可以去投个票或者评论。 https://discuss.zerotier.com/t/end-to-end-traffic-use-udp2raw/1231

另外一个老哥提到加入 tinyfecvpn https://discuss.zerotier.com/t/add-fec-code-to-tunnels/101

PS:有点意外 ZeroTierOne 的 issue 和 ZeroTier 的论坛 都很少提到 udp2raw 或 udpspeeder

zdypop commented 3 years ago

谢谢@TKaxv-7S指教:),搞定了。去掉-a的参数,另外将远程主机的地址改成了路由下的内网地址。现在很顺畅。 感谢@wangyu-提供这么好的工具

libra146 commented 3 years ago

谢谢@TKaxv-7S指教:),搞定了。去掉-a的参数,另外将远程主机的地址改成了路由下的内网地址。现在很顺畅。 感谢@wangyu-提供这么好的工具

@zdypop 可以分享下你的配置和网络结构吗,我之前试过没成功,按照 readme 中的说明也握手成功了, 但是最后无法通过 UDP 连接远程桌面, 据我所知远程桌面貌似只用 UDP 是无法连接的,需要使用 TCP 进行认证后续才可以用 UDP,但是程序只监听了 UDP 端口,我尝试使用程序直接发送 UDP 数据包到另一端也没有收到,不知道是不是隧道没建立(可是说不通,握手都成功了,就是连不上),后来由于时间原因就没有再试。

libra146 commented 3 years ago

image

如图所示,左侧是家里的服务器,由于没有可刷机的路由器并且人不在家,所以使用虚拟机装了一个openwrt,和被控电脑在一个网段并且可以互相通信,配置好了zerotier网络,然后运行上面的命令,通过openwrt将数据包转发到130,客户端运行客户端对应的命令(试过了,加不加 -a 参数都不行),提示握手成功了,日志如下图:

image image

测试中发现 udp2raw 只监听了 UDP 协议的 3333 端口,所以我猜测可能是连接远程桌面不成功的原因之一。但是使用程序直接发送 UDP 数据包另一端也不能接收到这就说不通了。192.168.194.x 网段互相是可以 ping 通的,也就是说打洞是成功的。 由于还没有搞懂到底为什么可以这么用,所以暂时没有什么其他的调试思路。

zdypop commented 3 years ago

@libra146 我这两天一直在测试。发现用n1(154,zerotier分配的地址)做server,传输大文件的时候会被断开与n1的连接。 现在用阿里云vps做server (用vps的公网ip),被控机用内网地址,发现比较稳。 我在n1上装了zerotier,打通了家里内网和zerotier所分配网段的连接。

libra146 commented 3 years ago

@libra146 我这两天一直在测试。发现用n1(154,zerotier分配的地址)做server,传输大文件的时候会被断开与n1的连接。 现在用阿里云vps做server (用vps的公网ip),被控机用内网地址,发现比较稳。 我在n1上装了zerotier,打通了家里内网和zerotier所分配网段的连接。

如果是大文件被断开的情况,可能udp2raw没有生效?因为据我所知流量被Qos后就会这样。用vps坐server 倒是可以,但是带宽太小了,远程桌面有时会卡顿,不流畅

zdypop commented 3 years ago

@libra146 确实,用vps带宽小,桌面还算流畅,但传文件很慢。 最近发现一个新办法,就时rdp的远程主机和客户机都规定走tcp,这样比较完美。而且不用udp2raw了。 可以到win的组策略里设置。

libra146 commented 3 years ago

@libra146 确实,用vps带宽小,桌面还算流畅,但传文件很慢。 最近发现一个新办法,就时rdp的远程主机和客户机都规定走tcp,这样比较完美。而且不用udp2raw了。 可以到win的组策略里设置。

这样也有问题,即使是规定了走 TCP,打洞后的隧道也是用的 UDP 协议来承载流量的,仍然会被运营商 Qos。隧道中走什么协议无所谓,问题就在于隧道的流量是由 UDP 承载的。

coppercash commented 3 years ago

我看 wiki 里的例子是「VPN 跑在 udp2raw 上」,估计反过来「upd2raw 跑在 VPN 上」不行。可能流量特征还是由跑在下面的 VPN 决定的。也就是 zerotier 的流量特征还是普通 UDP,会被 QOS。

当然,我也不懂原理。强烈希望被打脸。 因为我自己的 case 是,server client 都没有公网 IP,只能依赖 tinc 或者 zerotier 打洞。 tinc 支持 tcp 不会被 QOS 但打洞失败。 zerotier 打洞成功但是不支持 tcp 被疯狂 QOS。

本来想让 upd2raw 帮我伪装下 zerotier 的流量。不过看了诸位的讨论,感觉希望渺茫😢。

heartnn commented 3 years ago

从别的地方抄的

What ports does ZeroTier use?

It listens on three 3 UDP ports:

9993 - The default A random, high numbered port derived from your ZeroTier address A random, high numbered port for use with UPnP/NAT-PMP mappings

That means your peers could be listening on any port. To talk with them directly, you need to be able send to any port.

piiiiiiiiiiiiiii commented 3 years ago

我在 ZeroTier 的论坛提交了加入udp2raw的请求(英语渣请不要介意😅),有兴趣的话可以去投个票或者评论。 https://discuss.zerotier.com/t/end-to-end-traffic-use-udp2raw/1231

另外一个老哥提到加入 tinyfecvpn https://discuss.zerotier.com/t/add-fec-code-to-tunnels/101

PS:有点意外 ZeroTierOne 的 issue 和 ZeroTier 的论坛 都很少提到 udp2raw 或 udpspeeder

人家的网络没这么bt

OXERIS commented 3 years ago

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

老哥能给个完整的配置教程吗,小白快看不懂了

OXERIS commented 3 years ago

image

如图所示,左侧是家里的服务器,由于没有可刷机的路由器并且人不在家,所以使用虚拟机装了一个openwrt,和被控电脑在一个网段并且可以互相通信,配置好了zerotier网络,然后运行上面的命令,通过openwrt将数据包转发到130,客户端运行客户端对应的命令(试过了,加不加 -a 参数都不行),提示握手成功了,日志如下图:

image image

测试中发现 udp2raw 只监听了 UDP 协议的 3333 端口,所以我猜测可能是连接远程桌面不成功的原因之一。但是使用程序直接发送 UDP 数据包另一端也不能接收到这就说不通了。192.168.194.x 网段互相是可以 ping 通的,也就是说打洞是成功的。 由于还没有搞懂到底为什么可以这么用,所以暂时没有什么其他的调试思路。

请教一下,我在虚拟机上配置了软路由,其实,只需要在路由器上部署udp2raw转发来自zerotier的流量就行了对吧,并不需要在我在虚拟机上部署zerotier,对吗?

OXERIS commented 3 years ago

image 如图所示,左侧是家里的服务器,由于没有可刷机的路由器并且人不在家,所以使用虚拟机装了一个openwrt,和被控电脑在一个网段并且可以互相通信,配置好了zerotier网络,然后运行上面的命令,通过openwrt将数据包转发到130,客户端运行客户端对应的命令(试过了,加不加 -a 参数都不行),提示握手成功了,日志如下图: image image 测试中发现 udp2raw 只监听了 UDP 协议的 3333 端口,所以我猜测可能是连接远程桌面不成功的原因之一。但是使用程序直接发送 UDP 数据包另一端也不能接收到这就说不通了。192.168.194.x 网段互相是可以 ping 通的,也就是说打洞是成功的。 由于还没有搞懂到底为什么可以这么用,所以暂时没有什么其他的调试思路。

请教一下,我在虚拟机上配置了软路由,其实,只需要在路由器上部署udp2raw转发来自zerotier的流量就行了对吧,并不需要在我在虚拟机上部署zerotier,对吗? 怎样能保证udp2raw套在zoretier的外面

piiiiiiiiiiiiiii commented 3 years ago

我有一个这样的想法: 1.在家里使用openwrt路由器,跑udp2raw,下面接我的nas,办公室也一样 2.随身备一个op路由器,上面了跑udp2raw,出差的时候电脑通过这个路由器上网

zerotier被xx的问题不就解决了? @TKaxv-7S

OXERIS commented 3 years ago

机智

piiiiiiiiiiiiiiiiiiiiii notifications@github.com 于 2021年1月16日周六 18:31写道:

我有一个这样的想法: 1.在家里使用openwrt路由器,跑udp2raw 2.随身备一个op路由器,上面了跑udp2raw,出差的时候电脑通过这个路由器上网

zerotier被xx的问题不就解决了? @TKaxv-7S https://github.com/TKaxv-7S

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/wangyu-/udp2raw-tunnel/issues/332#issuecomment-761540736, or unsubscribe https://github.com/notifications/unsubscribe-auth/AEO22IUNCO3EFKFDDRID3MTS2FTHLANCNFSM4O3JBNCQ .

OXERIS commented 3 years ago

我有一个这样的想法: 1.在家里使用openwrt路由器,跑udp2raw,下面接我的nas,办公室也一样 2.随身备一个op路由器,上面了跑udp2raw,出差的时候电脑通过这个路由器上网

zerotier被xx的问题不就解决了? @TKaxv-7S

是不是两台没有公网ip,在不同局域网下的内网设备,要每次手动指定监听的ip和端口

sing1ee commented 3 years ago

e udp穿透成功之后用于数据传输的端口似乎是随机的啊。我抓包看过,穿透成功后,没有任何一方的数据是通过控制平面端口9993

端口是随机的。udp2raw,要根据真实的端口来

sing1ee commented 3 years ago

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

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

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

比较赞同你的说法,如果两端都在内网,udp2raw是没有用的,这个本身不打洞

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

不能使用udp2raw-tunnel,因为这样出口的端口就变了,之前zt打洞的状态就不对了。如果zt远端是有公网ip的,应该可行。