N2N使用tcptunnel绕过UDP屏蔽或QoS

N2N 2023/03/19

目前N2N默认还是UDP传输,在Linux下可以通过 -S2 参数强制使用TCP传输,以实现绕过部分特殊环境下对UDP的限制

但是Windows下并不支持 -S2 参数,所以之前写过 N2N使用udp2raw绕过UDP屏蔽或QoS

其原理是利用udp2raw把N2N的UDP数据包进行伪装成TCP数据包(faketcp),但其本质还是UDP,详见 官方说明

今天介绍的小工具为 gnb_udp_over_tcp,它可以实现将UDP数据转换为TCP进行传输,绕开UDP限制

工具示例

#example:
#./gnb_udp_over_tcp -u -l listen_udp_port tcp_address tcp_port
#./gnb_udp_over_tcp -t -l listen_tcp_port des_address des_udp_port
gnb_udp_over_tcp -u -l 监听的UDP端口 TCP源地址 TCP源端口
gnb_udp_over_tcp -t -l 监听的TCP端口 UDP源地址 UDP源端口

服务端

假设有一台CentOS 7,上面跑着N2N的服务端(supernode),端口为55555(UDP)

现在想通过gnb_udp_over_tcp将这个 55555 UDP端口转换为 44444 并监听到TCP

下载,解压,在bin\Linux_x86_64找到 gnb_udp_over_tcp ,CMD运行

gnb_udp_over_tcp -t -l 44444 127.0.0.1 55555

注意:这款小工具日志输出比较少,容易误认为没有运行

客户端

有一台Windows,下载,解压,在bin\Window10_x86_64找到 gnb_udp_over_tcp.exe

依然是通过gnb_udp_over_tcp,连接到服务端的 44444 端口(TCP),然后监听到本机 55555 端口

#77.77.77.77为服务端IP
gnb_udp_over_tcp.exe -u -l 55555 77.77.77.77 44444

注意:这里的77.77.77.77为服务端的IP地址,不能为域名形式

测试

EasyN2N里,服务端填写 127.0.0.1:55555

服务端通过iftop检测到 44444 端口下有大流量

另外,测试后发现这种模式下,P2P的组建不受影响,这一点比udp2raw要好~



22条评论

  • joe 评论于 回复

    edgesupernode之间是转换成tcp了,那对于p2p打通的时候,是不是edgeedge之间还是ucp隧道?这个数据你有研究过怎么包装成tcp吗?主要是udp流量太大太扎眼了,很容易被分析到。

    • joe 评论于 回复

      @joe
      :萌: 还有个疑问,如果部署的时候直接就部署成tcp隧道,p2p还能打通吗?没环境测试,纯粹交流哈~

  • crazycrazy 评论于 回复

    1.0版本应该是问题很大。GIT上最新是1.2,编译了跑起来,但是WINDOWS版的编译有错出不来。只能放弃。1.0版本的三四个人联上后就会出现TCP连接关闭提示断开,在n2n中每个连上的客户端会有两个IP地址,一个是虚拟IP,一个是127/0.0.1,每个人都会有这个相同的IP。可能是这个原因造成冲突掉开,也可能是1.0版本本身就BUG不行

  • SanRe 评论于 回复

    请问如果游戏是依靠组播来通讯的情况下 使用N2N组网以后游戏联机
    组播的这个广播也可以伪装成TCP么?
    看了udp2raw和gnb_udp_over_tcp这两个帖子 感觉gnb_udp_over_tcp没有加密应该性能更好
    因为我玩的游戏数据量很大 服务器最高带宽占用都在15mbps左右了
    一些用户不知道因为路由器问题还是网络问题 丢包掉线很严重
    在找办法改善

    • SanRe 评论于 回复

      @SanRe
      已经稳定部署了 组播游戏效果如何还需要再测试一下
      服务端的代码运行后关闭cmd窗口就会退出 版本也不是最新的
      有时候执行了还不生效 只能在执行完以后查看一下端口占用才知道有没有正常运行
      可以在服务端用nohup方法打开
      nohup gnb_udp_over_tcp -t -l 44444 127.0.0.1 55555 &
      这样关闭cmd窗口 程序也能挂起运行了

    • SanRe 评论于 回复

      @SanRe
      经过一晚上 服务端的gnb_udp_over_tcp还是挂了
      端口检测是被占用的状态 但是因为客户端打开gnb_udp_over_tcp是没有显示的 只能链接N2N测试 一直连不上

  • 鸭我太帅 评论于 回复

    博主你好,cmd运行了命令之后,有返回值或者返回语句吗?我这边没有看到返回值,不知道运行起来没有

    • Bug侠 评论于 回复

      @鸭我太帅
      它的返回值没有那么频繁,只要不报错,一般都是正常运行的

  • 虚之亚克洛 评论于 回复

    博主你好,我想问一下在服务器搭建gnb_udp_over_tcp后,一方通过gnb_udp_over_tcp连接到N2N服务端,一方使用UDP直连到N2N服务端,这种情况下双方P2P的组建会受到影响吗?

    • Bug侠 评论于 回复

      @虚之亚克洛
      看本文末尾~
      N2N是优先走UDP打洞,P2P成功后就和服务器没关系了,如果打洞不成功,然后才走服务器UDP中转或本文提到的TCP

      • 虚之亚克罗 评论于 回复

        @Bug侠
        博主我服务端和客户端都是win环境,我在gnb_udp_over_tcp.exe同目录下按照你上面写的去运行cmd指令都没有日志输出也无法建立连接,在路由器中已经打开了端口,但是单独在cmd里运行gnb_udp_over_tcp.exe又会显示英文版的help

      • 虚之亚克洛 评论于 回复

        @Bug侠
        话说应该是能使用与n2n服务端同一个端口吧,毕竟一个是tcp一个是udp

        • Bug侠 评论于 回复

          @虚之亚克洛
          呃……感谢反馈!我更新一下本文

  • tg 评论于 回复

    博主,我目前在N1盒子上运行OpenWrt,试了从博文中下载的openwrt各个文件,在N1上面都不能运行。现在想自己编译gnb_udp_over_tcp,在N1上面运行,架构是ARM Cortex-A53,环境都搭建好了,最后使用make编译的时候提示:no makefile found。ARM Cortex-A53这个架构应该选择哪个makefile文件?感谢!

    • Bug侠 评论于 回复

      @tg
      Makefile.linux改名Makefile试试?

      • tg 评论于 回复

        @Bug侠
        改了不行,编译出来的还是不能在openwrt上面运行,我的编译平台是Ubuntu22,AMD64架构,好像要交叉编译ARM Cortex-A53架构的才行。目前还没有找到编译方法。你能不能帮忙编译一个?谢谢

  • maomao 评论于 回复

    还没尝试游戏联机,但利用一次出差的机会也架设成功了,直接用windows开服务端也成功了,请问使用6tunnel在中间架设Ipv6的隧道在技术上可行吗?毕竟很多人没有公网v4,但基本都有公网v6。

    • Bug侠 评论于 回复

      @maomao
      目前N2N是不支持v6的,好像有修改版的分支支持v6,但我不记得是哪个了 :笑哭:

      • maomao 评论于 回复

        @Bug侠
        我的意思不是要N2N自身支持V6,而是像本文套tcp隧道这样去套一层V6隧道,如果技术上可行我去找一找。

        • Bug侠 评论于 回复

          @maomao
          呃……sorry,理解有误,技术肯定是可行的
          我的思路是:Supernode→UDP2TCP(v4TCP 127.0.0.1)-Frpc(公网v6TCP)→→→Frps(公网v6TCP)→TCP2UDP(v4UDP 127.0.0.1)→Edge
          当然,这里的Frp也可以换做NPS等内网穿透软件,不知道这个流程图能不能解释的清 :嘻嘻:

    评论(本站已开启评论回复邮件通知功能,请如实填写邮箱以便及时收到回复)