udp2raw
udp2raw copied to clipboard
怎样给zerotier套上udp2raw-tunnel?
zerotier是一个p2p的水管,可以做到点对点穿透并直联,自建lan非常快,但是很容易被isp流控。
能否给zerotier套上udp2raw-tunnel,谢谢
可以,windows版不支持服务端,但是可以在路由器中运行服务端(OpenWrt这些),zerotier再配置下路由,可以直接暴露内网的机器,最后客户端直接在远程主机上启动就行了
@TKaxv-7S
效果如何?
@piiiiiiiiiiiiiii 速度应该是一样的,我用出口带宽能跑满
@TKaxv-7S 可以大佬你的截图我没看懂,怎么用呢?
是不是每个zerotier节点上面都需要部署udp2raw-tunnel ? 请详细说一下,谢谢
@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 udp2raw-tunnel是套在zerotier外的,肯定不会走9993端口了
@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 udp2raw-tunnel是套在zerotier外的,肯定不会走9993端口了
我的意思是,我在没套udp2raw-tunnel的情况下,抓到的数据传输依旧是随机端口的,不是走控制平面的9993端口。所以我不太确定您的操作是否真的有起到作用。因为我这里开了udp2raw-tunnel的机器,仍然能抓到和对端的UDP通信,似乎就是没生效,在控制台中也看不到对端机器有连接。(当然我只测了我这里的两台设备,没有更多的数据来验证。)而按readme.md中的使用方法介绍看,udp伪装好像也只是指定端口,而非全局的。我有疑问的是这一点。
另外,我有测能指定连接端口的程序,是能正常走udp2raw-tunnel的,在控制台也能看到连接信息。
@flyfishcn 你的网络环境应该很简单,可能是直通了,zerotier打洞适用在复杂的网络情况下,可以用多层路由的网络试试,我的网络环境很复杂,可以肯定的告诉你是有用的,远程控制、包括串流玩游戏都很稳定,在之前是一直被运营商断流的,后面的问题,用udp2raw-tunnel肯定是需要指定好端口的,没走这个端口的包那肯定是没被udp2raw-tunnel处理的
@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 看来上面都白说了。。。套udp2raw-tunnel也是点对点,只是客户端、服务端都需要搭好,还有,点对点本来就是受限与某一方带宽,与之前完全没有区别,不是“由于要走服务器”,而是数据本身就是服务器传出来的。。。中间没有第三方服务器参与流量转发
@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 其实你的问题就是zerotier没走udp2raw-tunnel,应该是调用时IP指向错了,查一下udp2raw-tunnel和zerotier的官方文档,理清服务端、客户端、zerotier默认路由与子路由之间的IP关系,应该就解决了
@piiiiiiiiiiiiiii 看来上面都白说了。。。套udp2raw-tunnel也是点对点,只是客户端、服务端都需要搭好,还有,点对点本来就是受限与某一方带宽,与之前完全没有区别,不是“由于要走服务器”,而是数据本身就是服务器传出来的。。。中间没有第三方服务器参与流量转发
明白了。 如果zerotier自身也支持udp包协议混淆就nb了。
我也有相同疑问,目前两台主机已经使用zerotier连通,但ping值太高,没有直连,走的中继,速度很慢,由于两台主机网络的限制且(无论是NAT类型还是禁止UDP)无法修改,所以我想问的是:是否可以使用udp2raw-tunnel来实现两台主机直连,如果可以是否有详细一点的操作说明?zerotier upd2raw-tunnel相关问题资源太少,只找到了当前话题,谢谢~
我也有相同疑问,目前两台主机已经使用zerotier连通,但ping值太高,没有直连,走的中继,速度很慢,由于两台主机网络的限制且(无论是NAT类型还是禁止UDP)无法修改,所以我想问的是:是否可以使用udp2raw-tunnel来实现两台主机直连,如果可以是否有详细一点的操作说明?zerotier upd2raw-tunnel相关问题资源太少,只找到了当前话题,谢谢~
不排除是isp对协议有限制导致你的点对点不能握手成功,你可以搭一台自己的moon服务器试试
@TKaxv-7S 大佬我想问下使用zerotier的话需要在两端都使用OpenWrt吗?
@TKaxv-7S 大佬我想问下使用zerotier的话需要在两端都使用OpenWrt吗?
一端就行
@TKaxv-7S 感谢回复,再请教个问题,既然upd2raw-tunnel是套在zerotier外面的,那么问题在于,upd2raw-tunnel是怎么连接上服务器的?因为在配置时服务器客户端都要指定IP地址,服务器肯定是监听所有IP,那客户端的IP如何配置呢?配置成服务器的外网IP吗?还是说使用--lower-level参数走数据链路层?服务器的外网IP直接连接是不可以的, 因为还有运营商nat的存在,不打洞是无法直接连接上的。
就像这张图,其中数据发送流程就是:通过虚拟网卡加路由的方式将需要走隧道的流量转发到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 感谢回复,再请教个问题,既然upd2raw-tunnel是套在zerotier外面的,那么问题在于,upd2raw-tunnel是怎么连接上服务器的?因为在配置时服务器客户端都要指定IP地址,服务器肯定是监听所有IP,那客户端的IP如何配置呢?配置成服务器的外网IP吗?还是说使用--lower-level参数走数据链路层?服务器的外网IP直接连接是不可以的, 因为还有运营商nat的存在,不打洞是无法直接连接上的。
就像这张图,其中数据发送流程就是:通过虚拟网卡加路由的方式将需要走隧道的流量转发到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 我不是说我的思路是对的,我只是借用这张图来解释我认为可能的思路和数据流向,这张图所有的数据流向都是在第三层进行处理的,因为都用到了IP地址。我认为upd2raw-tunnel在zerotier外是对的,但是如果upd2raw-tunnel需要使用到zerotier的IP地址的话和前面的假设相冲突,这里就有了矛盾。 而且按理说如果zerotier在upd2raw-tunnel外的话,应该达不到抵抗qos的效果,因为数据包仍然是zerotier发送的,最外层仍然是udp,并且被upd2raw-tunnel处理过的包是被加密后放到了zerotier的udp包中的。。 所以大佬能否简单分享下大概的数据流向?
@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 好的,了解了,我自己再研究下,感谢大佬😁
@TKaxv-7S 好的,了解了,我自己再研究下,感谢大佬😁
我也只是个用户,大佬还是作者,没帮上你什么,不用这么客气哈😄
@TKaxv-7S 大佬我想问下使用zerotier的话需要在两端都使用OpenWrt吗?
一端就行
如果是一端还有机会,两端就歇菜了,总不能走哪多带一个前置路由器 : )
@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模式有冲突吗?
@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 大佬好,挺好奇这个操作的,我有个问题,你说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 朋友,请教下: 我这边的电信宽带的主机,远程控制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 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 穿透,如果作者能说明的话就好了