N2N使用udp2raw绕过UDP屏蔽或QoS

N2N 2022/04/24

由于N2N在Windows下使用的是UDP进行通信,而在部分情况下,运营商会对UDP数据进行一定的限制

参考这篇:聊聊运营商对UDP的QoS限制和应对

所以本文主要介绍通过 udp2raw 来实现绕过N2N通信中的UDP屏蔽或QoS

原理

udp2raw tunnel,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS,或在UDP不稳定的环境下提升稳定性。可以有效防止在使用kcptun或者finalspeed的情况下udp端口被运营商限速

准备

以下操作演示基于CentOS 7 x64

1.搭建N2N服务器(略)

2.部署udp2raw

mkdir udp2raw
cd udp2raw
wget https://github.com/wangyu-/udp2raw/releases/download/20200818.0/udp2raw_binaries.tar.gz
tar xzvf udp2raw_binaries.tar.gz
mv udp2raw_amd64 /usr/local/bin/udp2raw
chmod +x /usr/local/bin/udp2raw
udp2raw -h

启动

服务端

假设supernode监听端口为 9527 ,udp2raw监听 19527 ,模式为 faketcp

更多命令说明见:udp2raw 命令行文档

udp2raw -s -l 0.0.0.0:19527  -r 127.0.0.1:9527 -k "asdf1234" --raw-mode faketcp -a

客户端

适用于Windows的客户端(解压得到 udp2raw_mp_wepoll.exe)

#替换77.77.77.77为自己的服务器地址
udp2raw_mp_wepoll.exe -c -l 0.0.0.0:9527  -r 77.77.77.77:19527 -k "asdf1234" --raw-mode faketcp

EasyN2N

服务端地址 本机地址:本机upd2raw监听端口

日志里可以看到已经成功连接到Supernode

问题

NAT穿透存在问题,无法P2P



17条评论

  • exia1112 评论于 回复

    bug哥,香港的兄弟跟我们走小黄鸭玩游戏,ping我们的虚拟ip会有一项失败,然后战斗一开始就断,用这个办法能有效解决么?望答复

  • SanRe 评论于 回复

    用了这个以后n2n组网似乎就受影响了?
    如果不是p2p状态的话 就收不到广播和组播 找不到游戏房间

  • 豆豆 评论于 回复

    你好,已按照CentOS部署了supernode和udp2raw,但是朋友使用EasyN2N只能使用supernode监听的端口连进来,按照教程使用udp2raw监听的端口连不进来。

    • Bug侠 评论于 回复

      @豆豆
      udp2raw监听的端口估计在【系统的防火墙】或者【云服务商的安全组】里没放行

      • 豆豆 评论于 回复

        @Bug侠
        感谢回复,我这边研究了一下两边的日志,根据日志显示,我的服务端能收到朋友客户端发过来的第一个握手包,也对其回复了,但朋友的客户端收不到服务端返回的包,请问搭建这个隧道是否对NAT类型有很严格的要求呢?

        • Bug侠 评论于 回复

          @豆豆
          客气了,我这边也暂时没思路,你可以翻翻udp2raw的git,看看有没有类似的问题
          udp2raw:https://github.com/wangyu-/udp2raw
          udp2raw wiki:https://github.com/wangyu-/udp2raw/wiki

  • maomao 评论于 回复

    您好,我是第一次尝试自建联机服务器,此前没有配置的经验,我还是没看懂该怎么配置,有几个细节我想问一下,您写在启动那一栏里的windows客户端的配置语句,是写在windows客户端中的服务端里吗?udp2raw_mp_wepoll.exe需要放在windows客户端程序文件夹的哪里?配置语句中的服务器地址是服务器的公网地址吗?填写语句运行以后,我如何判断udp2raw已经运行?其他客户端要连我的服务器是什么形式,是我填写配置语句后,他们直接连我的udp2raw绑定的端口?还是他们连n2n监听的端口,我需要像例子一样在本机再运行一个客户端连本机的udp2raw端口?

    • Bug侠 评论于 回复

      @maomao
      1.呃……第一个问题我都懵了,我一句话描述一下:Linux下运行了udp2raw的服务端(同时这台Linux上还跑的有N2N的服务端Supernode),然后又因为N2N的客户端Edge是跑在Windows下的,所以需要在这台Windows上跑udp2raw
      2.位置任意,通过CMD命令行启动
      3.我标注77.77.77.77的位置均为服务器公网IP
      4.判断udp2raw在运行看其日志输出即可
      5.其他客户端同样参照本文,任意一台客户端均需要执行本文【客户端】+【EasyN2N】下列出的步骤

      • maomao 评论于 回复

        @Bug侠
        感谢回复我这么小白的问题,也感谢大侠能开发一个这么轻量级的程序让我这种零基础的使用者也能架设虚拟局域网,经过学习Linux,现在已经架设成功了,但是省际,跨运营商的UDPQOS还是太严重了,udp tunnel不是每次都能顺利建立,而且建立了以后还是会经常掉线,请问当前有windows客户端能用的TCP tunnel吗?

        • Bug侠 评论于 回复

          @maomao
          两个思路吧……
          1.本机开一台Linux虚拟机或者内网找一台Linux物理机,然后跑edge强制使用TCP模式连接服务端(使用 -S2 参数),然后再各种转到本机上来使用,这是一个官方原生的方式使用TCP
          2.UDP伪装TCP,目前除了udp2raw,还有一个小工具Phantun https://github.com/dndx/phantun

  • monolight 评论于 回复

    n2n v3好像是不支持udp2raw的,组播发送不出去

  • 农民工本工 评论于 回复

    :害羞:
    博主,我按照这篇博客的教程一步步走下来,在N2N客户端上还是无法显示绿色勾勾咋办呀?两个windows客户端相互之间无法ping通。

    其中一台N2N客户端的log:
    [2023-02-08 16:50:07] adding supernode = 127.0.0.1:9527
    [2023-02-08 16:50:07] starting n2n edge 3.1.1-16-g23e168b-dirty-r1200 x64_static May 8 2022 23:45:52
    [2023-02-08 16:50:07] using compression: none.
    [2023-02-08 16:50:07] using null cipher.
    [2023-02-08 16:50:07] number of supernodes in the list: 1
    [2023-02-08 16:50:07] supernode 0 => 127.0.0.1:9527
    [2023-02-08 16:50:07] WARNING: encryption is disabled in edge
    [2023-02-08 16:50:07] successfully created resolver thread
    [2023-02-08 16:50:07] successfully created port mapping thread
    [2023-02-08 16:50:07] use manually set IP address
    [2023-02-08 16:50:07] created local tap device IP: 10.135.204.209, Mask: 255.255.255.0, MAC: 00:FF:23:C6:4F:6A
    [2023-02-08 16:50:07] edge started
    [2023-02-08 16:50:07] successfully joined multicast group 224.0.0.68:1968
    [2023-02-08 16:50:09] NAT-PMP added TCP port mapping: 10.155.11.220:53633 -> localhost:53633
    [2023-02-08 16:50:09] NAT-PMP added UDP port mapping: 10.155.11.220:53633 -> localhost:53633
    [2023-02-08 16:50:19] WARNING: supernode not responding, now trying [127.0.0.1:9527]

    云服务器的log:
    root@srrqbqforrc4cekn:~# udp2raw -s -l 0.0.0.0:19527 -r 127.0.0.1:9527 -k “chichi” –raw-mode faketcp -a
    [2023-02-08 16:51:43][INFO]argc=11 udp2raw -s -l 0.0.0.0:19527 -r 127.0.0.1:9527 -k chichi –raw-mode faketcp -a
    [2023-02-08 16:51:43][INFO]parsing address: 0.0.0.0:19527
    [2023-02-08 16:51:43][INFO]its an ipv4 adress
    [2023-02-08 16:51:43][INFO]ip_address is {0.0.0.0}, port is {19527}
    [2023-02-08 16:51:43][INFO]parsing address: 127.0.0.1:9527
    [2023-02-08 16:51:43][INFO]its an ipv4 adress
    [2023-02-08 16:51:43][INFO]ip_address is {127.0.0.1}, port is {9527}
    [2023-02-08 16:51:43][INFO]important variables: log_level=4:INFO raw_mode=faketcp cipher_mode=aes128cbc auth_mode=md5 key=chichi local_addr=0.0.0.0:19527 remote_addr=127.0.0.1:9527 socket_buf_size=1048576
    [2023-02-08 16:51:43][WARN]you can run udp2raw with non-root account for better security. check README.md in repo for more info.
    [2023-02-08 16:51:43][INFO]remote_ip=[127.0.0.1], make sure this is a vaild IP address
    [2023-02-08 16:51:43][INFO]const_id:d3cbaecf
    [2023-02-08 16:51:43][INFO]run_command iptables -N udp2rawDwrW_d3cbaecf_C0
    [2023-02-08 16:51:43][INFO]run_command iptables -F udp2rawDwrW_d3cbaecf_C0
    [2023-02-08 16:51:43][INFO]run_command iptables -I udp2rawDwrW_d3cbaecf_C0 -j DROP
    [2023-02-08 16:51:43][INFO]run_command iptables -I INPUT -p tcp -m tcp –dport 19527 -j udp2rawDwrW_d3cbaecf_C0
    [2023-02-08 16:51:43][WARN]auto added iptables rules
    [2023-02-08 16:51:43][INFO]now listening at 0.0.0.0:19527

    • 农民工本工 评论于 回复

      @农民工本工
      从云服务器的log来看,连接是建立成功过的,但是一直断开重连断开重连:
      [2023-02-08 17:20:16][INFO]now listening at 0.0.0.0:19527
      [2023-02-08 17:20:16][INFO][39.189.56.62:11746]received syn,sent syn ack back
      [2023-02-08 17:20:17][INFO][125.115.5.248:14285]received syn,sent syn ack back
      [2023-02-08 17:20:17][INFO][125.115.5.248:14285]got packet from a new ip
      [2023-02-08 17:20:17][INFO][125.115.5.248:14285]created new conn,state: server_handshake1,my_id is 76bdd82a
      [2023-02-08 17:20:17][INFO][125.115.5.248:14285]changed state to server_handshake1,my_id is 76bdd82a
      [2023-02-08 17:20:17][INFO][125.115.5.248:14285]received handshake oppsite_id:3979ec7d my_id:76bdd82a
      [2023-02-08 17:20:17][INFO][125.115.5.248:14285]oppsite const_id:e8e14f57
      [2023-02-08 17:20:17][INFO][125.115.5.248:14285]changed state to server_ready
      [2023-02-08 17:20:17][INFO][39.189.56.62:11746]got packet from a new ip
      [2023-02-08 17:20:17][INFO][39.189.56.62:11746]created new conn,state: server_handshake1,my_id is f3f9a435
      [2023-02-08 17:20:17][INFO][39.189.56.62:11746]changed state to server_handshake1,my_id is f3f9a435
      [2023-02-08 17:20:18][INFO][39.189.56.62:11746]received handshake oppsite_id:8b3a5862 my_id:f3f9a435
      [2023-02-08 17:20:18][INFO][39.189.56.62:11746]oppsite const_id:2eac8e34
      [2023-02-08 17:20:18][INFO][39.189.56.62:11746]changed state to server_ready
      [2023-02-08 17:21:58][INFO][39.189.56.62:11746]new conv conv_id=793baaa4, assigned fd=11
      [2023-02-08 17:22:10][INFO][39.189.56.62:11746]new conv conv_id=cec60e2a, assigned fd=12
      [2023-02-08 17:22:30][INFO][39.189.56.62:11746]new conv conv_id=6edfa1f1, assigned fd=13
      [2023-02-08 17:22:42][INFO][39.189.56.62:11746]new conv conv_id=15c0702a, assigned fd=14
      [2023-02-08 17:22:58][INFO][39.189.56.62:11746]new conv conv_id=60878591, assigned fd=15
      [2023-02-08 17:23:15][INFO][39.189.56.62:11746]new conv conv_id=ae52fd16, assigned fd=16
      [2023-02-08 17:23:31][INFO][39.189.56.62:11746]new conv conv_id=ee117917, assigned fd=17

      有啥建议嘛,博主?

  • FPC12138 评论于 回复

    您好,我有一个问题,情况如下:
    1、服务端是用的阿里云
    2、客户端的话,我和朋友都是用的openwrt,然后nat到各自的内网ip段
    我想问下,这个时候,我和朋友的windows机器联机是P2P的吗?通讯是用的tcp还是udp呢?可以在openwrt里面用这个方案吗?谢谢

    • Bug侠 评论于 回复

      @FPC12138
      1.P2P的判断:https://bugxia.com/2292.html
      2.windows下默认N2N走的UDP通信(Linux支持TCP)
      3.可以在openwrt下实现本文方案(需在udp2raw_binaries.tar.gz内使用对应架构的udp2raw)

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