使用N2N搭建虚拟局域网联机游戏

分享, 折腾 2018/04/14

最近在折腾的一件事:如何在没有公网IP的情况下进行局域网游戏?

若干年前,一伙同学约战网吧,CS、红警之类的联机游戏玩的不亦乐乎,如今再想找回当年的感觉已经非常不容易。其中一个比较直接的原因是,不在一个局域网内。

前段时间不知怎么的,一群奔三的人居然想要联机CS。第一时间想到的是对战平台,可是总有几个强迫症,不想让电脑里再多安装一个软件。没办法,转而研究很古老的虚拟局域网软件Hamachi和LAN Bridger。Hamachi的小问题很多,个别机器无法成功连接,就算能ping通对方,延迟也是奇高。而LAN Bridger干脆是客户端都无法下载……接着就是各种尝试不同的方案,最终找到了一个比较完美的解决方案:N2N

—————————————

傻瓜教程:

Windows下使用N2N搭建虚拟局域网联机游戏(重写)

—————————————

今天就介绍一下使用Linux做服务端,Windows使用客户端建立N2N网络的方法。以下过程均基于CentOS 7 64bits

原理

和传统的中转传输不太一样的是,n2n的超级节点(可以看做是服务器)在边缘节点(Edge)完成首次握手后,中心节点不再起主要作用,edge之间的通信发生在两个edge node之间,不经过supernode中转。

准备

一台有公网IP的服务器、VPS等,作为服务端

N2N的服务端与客户端的编译与安装,见:https://bugxia.com/327.html

服务端(Linux)

首先搭建服务端,Linux下建服的方法很简单,一行命令的事

supernode -l 端口号 -f

参数说明

-f 前台运行(此参数只有N2N v2版本有效,若不加该参数,则为前台运行)
-u 指定运行所用的UID(可选)
-g 指定运行所用的GID(可选)
-v 输出比较详细的log(可选)

补充:服务端如开启iptables\firewalld\ufw等防火墙,需要放行supernode所设置的端口,否则客户端无法连接

#firewalld
firewall-cmd --zone=public --add-port=9527/udp --permanent
firewall-cmd --reload
#iptables
iptables -I INPUT -p udp --dport 9527 -j ACCEPT
service iptables save
service iptables restart
#ufw
ufw allow 9527/udp

windows下的服务端搭建方法类似,不再啰嗦,服务端下方链接有提供。

客户端

更新:

由于我自己也需要用到N2N,所以写了个Windows下的N2N客户端GUI工具,Windows下的N2N 客户端启动器

win下的客户端(包含服务端)下载:https://file.bugxia.com/s/b6MAp6LS78b6XBp

压缩包中包含了v1、v2版本的客户端(edge_v1\edge_v2)和服务端(supernode_v1\supernode_v2),还有客户端必须安装的虚拟网卡TapV9

注:如果之前使用过其他TAP类软件,已经安装过TAP-Windows Adapter V9,则直接跳过本步骤

安装虚拟网卡

安装的时候仅选择第一项即可,安装过程中可能会有安全提示,选择[安装]

安装完毕后会在网络适配器界面出现TAP-Windows Adapter V9

启动客户端

客户端(edge_v1和edge_v2)均需要给与管理员权限运行

以管理员权限启动CMD

在命令行下启动N2N客户端(edge),如果出现错误,见本文末说明

注意:

1.不同的客户端需要指定不同的IP,但需要同段,比如有4个客户端,则可以分别指定192.168.100.100~104,成功连接到中心节点(supernode)后4个客户端可以任意互通。如果连接成功,但是ping不通或者搜索不到对方建立的游戏,请确认是否关闭防火墙。

2.客户端需要管理员权限执行,因为要给虚拟网卡写入网络信息

3.需要和服务端版本保持一致,如:服务端使用supernode_v2,则客户端也需使用edge_v2

4.确保需要组网的客户端所设置的小组名称和密码一致

edge.exe -a 指定的虚拟局域网IP -c 小组名称 -k 小组密码 -l 服务器:端口
#如:
C:\desktop\edge_v2.exe -a 192.168.100.100 -c bugxia -k 123456 -l n2n.s1.bugxia.com:9527

参数说明

-d 虚拟网卡名
-a [static:|dhcp:]虚拟网段(IP),static模式其实可以不用加那个static: 直接写IP就行
-c 用于区分节点的社区(组)名
-k 用于加密的字符串
-K 用于加密的Key文件,和-k不能共存
-s 子网掩码
-l supernode的IP:端口,可以指定多个supernode的
-i NAT打洞间隔
-b 当使用DHCP时定期刷新IP
-p 指定本地端口
-u 指定运行所用的UID(windows不适用)
-g 指定运行所用的GID(windows不适用)
-f 前台运行(windows不适用)
-m 为虚拟网卡指定MAC地址
-r 启用包转发,当-a指定DHCP时需要启用
-E 接收组播MAC地址
-v 输出比较详细的log
-t 指定用于管理的UDP端口

PING

本机是192.168.100.100,朋友是192.168.100.101

CS

常见的连接提示

v1

无法连接服务器时会重复提示Registering with supernode

成功连接Received REGISTER_ACK from remote peer

v2

无法连接服务器时会重复提示WARNING:Supernode not responding – moving to 0 of 1

成功连接Rx REGISTER_SUPER_ACK myMAC=

常见问题解决方法

1.无法ping通

如果出现一方可以ping通,另一方无法ping通,则很有可能为对方开启了防火墙,关闭防火墙即可

2.无法连接到服务器

检查客户端填写的服务器端口是否正确

检查服务器端口是否在iptables等防火墙中放行

检查客户端是否以管理员权限运行

3.客户端不断重复ERROR等信息

若能正常联机,则可以忽略错误提示

4.待补充



54条评论

  • 扇子 评论于

    Bug侠 你好(听说你能立刻收到通知,,)
    我准备用N2N联机星际争霸1,游戏局域网采用UDP联机
    WIN7用V1 网络搭建并能 PING通,和实现共享文件
    无法搜索到游戏(双方均关闭防火墙,无第三方防御软件)

    • Bug侠 评论于

      @扇子 不好意思,这两天没注意到消息……
      星际我还没试过,但是理论上来说,一般没有N2N搞不定的联机游戏,出问题基本都是客户端这边的问题。
      我晚上下个星际1,试试以后再回复你 :笑哭:

  • 墨绿 评论于

    你好站长 我想问一下能ping通对方而且防火墙也关了 但在 无主之地3 还是搜不到对方,其他游戏又可以

    • Bug侠 评论于

      @墨绿 不好意思啊,我也没细研究过无主之地3的联机,我猜想很多游戏联机机制可能不太一样,导致无法搜到。如果其他游戏可以的话,那说明n2n组虚拟网是没有问题的,所以还得从游戏这边排查一下。 :害羞:

  • Hosigus 评论于

    站长好,首先感谢您的教程,非常有用。
    想向您询问一个特殊情况:我的服务端是ubuntu,启动了服务。客户端是windows。两个都是我自己用ntop/n2n的dev分支编译(交叉编译)的。服务端端口能正常通信(使用nc测试连接),服务端启动服务后客户端连接在”edge started”过后没有日志输出,即没有正常连接,也没有报错信息。当客户端连接一个错误的端口时,有错误信息输出。
    请问您可以给我一些提示或建议吗?

    • Bug侠 评论于

      @Hosigus 唉,我也是一知半解,所以只能是盲猜一番了。
      =============
      1.有没有尝试使用其他人编译的?或者是meyerd的n2n?同样是没有输出吗?
      2.拿着你编译的edge,换到别人的电脑或者其他网络环境再测试一次呢?
      3.nc是通的,应该是只能说明端口没有问题,问题还是发生在edge和supernode通信的过程中导致打洞不成功,这个得翻源代码逐行分析。

  • 有信 评论于

    站长你好,问题是这样的,能ping通,我的外网ip是192.168.0.105,在本机上创建游戏服务器,房间名称是192.168.0.105:7777,我设的n2n是192.168.10.4,小伙伴是192.168.10.1,小伙伴搜不到服务器。

    • Bug侠 评论于

      @有信 有几个不太明白的地方:
      1.外网ip是192.168.0.105?是你的路由器给的地址对吧,192.168.10.4是N2N指定的地址,然后房间名称是192.168.0.105:7777?7777是什么端口?这里有点不太明白
      2.你和朋友在不同的网络环境下,需要通过N2N联机对吧

      • 有信 评论于

        @Bug侠 1.是路由器ip,7777是游戏的端口,应该可以忽略,感觉上猜测需要connect 192.168.0.105才能连上游戏
        2.不在同一个地方,他家和我家的样子。

        • Bug侠 评论于

          @有信 明白了,也就是使用N2N组网的时候无法搜到对方,我把问题好像想复杂了。
          几个排查步骤:
          1、确认双方的N2N客户端均出现” Rx REGISTER_SUPER_ACK myMAC=……“的字样,表示连接上supernode服务器
          2、尝试ping对方的虚拟IP,如果确认已连上supernode服务器,并且双方都在同一个虚拟局域网网段内,但无法ping通,建议关闭windows防火墙再试。
          3、如果能ping通,但搜不到,可以尝试使用CS之类的自带调试台的游戏,使用connect命令手动连接到对方房间

          • 有信 评论于

            @Bug侠 1,2没问题,能ping通的,有一些其他游戏可以玩。
            3,问题在于不是所有游戏都能调出控制台,connect。假如可以connect,猜测这个游戏需要connect 192.168.0.105才可以。
            4,有没有可能让游戏只使用n2n的虚拟网卡
            (war3搜不到房间,晚上用cs试试。)

            • Bug侠 评论于

              @有信 我也不清楚有些游戏搜寻房间的机制
              之前有个评论和你的情况类似,当时我对war3也测试了一下,情况如下:
              ============
              我这边和朋友下了魔兽3测试了一下,同时也测试了CS、流星,都是可以正常联机的。见图:
              https://s2.ax1x.com/2019/02/07/ktQu4J.png
              https://s2.ax1x.com/2019/02/07/ktQmEF.png
              https://s2.ax1x.com/2019/02/07/ktQnN4.png
              不过测试过程中,发现一个问题:
              A建立的房间,B能看见也能加入;而B建立的房间,A无法看见也无法加入,但是双方都能ping通。
              于是就尝试把B的电脑防火墙关闭,重启游戏,再次建立房间,A就可以看见B的房间并成功加入游戏。
              ============

              • 有信 评论于

                @Bug侠 我想知道你用的是什么系统测试的,win7还是win10。
                可以确定不是防火墙的问题,试过双方都关闭防火墙,war3依旧搜不到房间,互相看不见
                cs是connect连上的,不是搜到的
                有没有可能让电脑以虚拟网卡为主

                • Bug侠 评论于

                  @有信 这是当时的截图,Win10 1803,我和我朋友都是Win10。
                  自定义程序使用指定网卡,这个路子我还没研究过,不过我这边确实是折腾了半天防火墙、路由器什么的就能搜到了,具体是不是防火墙导致的,还不能下定论。
                  不过既然能connect连上,说明N2N是通的,服务端是没问题的,更多的还得从客户端这边下手研究研究。

                • Bug侠 评论于

                  @有信 对了,还有一位博主对N2N有很深的研究,你可以参考参考他博客里的文章:http://www.lucktu.com/archives/783.html

  • 阿杜 评论于

    站长你好,我的意思是V2版本的那个管理端口怎么用(默认是5645),如何管理?这个端口能否修改?

    • Bug侠 评论于

      @阿杜 不好意思,这个参数我也没细研究过 :笑哭:

  • 阿杜 评论于

    您好,请问这个服务端在WIN7 命令行下如何运行?能详细说下吗?本人菜鸟,您上文只说了一句很简单带过,不懂:((

      • 阿杜 评论于

        @Bug侠 非常感谢,!!测试成功。另外问下如果我要自己定义管理端口的话,是不是就需要自己重新编译服务端,自己定义端口了?

        • Bug侠 评论于

          @阿杜 -l 可以指定端口,比如上面命令的9527,可以任意替换其他未被占用的端口

  • 许彪 评论于

    客户端是win10 1903系统,服务端centos7,端口无误,防火墙已关,都是用的V2。centos7启动成功了,windows客户端一直报WARNING: Supernode not responding – moving to 0 of 1

    • Bug侠 评论于

      @许彪 其他win客户端呢?出现这个提示,表示客户端连不上服务端,要么就是服务端的防火墙(iptables\firewalld),要么就是客户端win的防火墙,或者就是运营商UDP封锁,不过这个可能性较小,建议再多排查,我这边无法给你一个准确的解决方法,抱歉了~

      • 许彪 评论于

        @Bug侠 感谢站长~找到一个原因了,服务端开放的端口不能走TCP,走UDP就连接上了,但是很奇怪,服务端明明是编译的V2版本,客户端要用V2s才能连接上,下班试试能不能愉快游戏。再次感谢站长创作的优质内容!祝好

        • Bug侠 评论于

          @许彪 不用客气,找到原因就好,N2N只有v1和v2存在大版本的差异,V2s只是其一个分支 :萌:

  • Gene 评论于

    你好,我想问一下。不关闭windows防火墙的话,开放哪些端口才能ping通

    • Bug侠 评论于

      @Gene 单独设置放行ping的话可以参考:https://blog.csdn.net/wy_bk/article/details/85013933
      =====
      p.s 放行ping而外,如果还要联机游戏,还需要再新建游戏的tcp\udp入站出站规则,略微麻烦

  • 林半仙 评论于

    你好想问一下 centos可以用客户端吗? 有具体方法吗?

    • Bug侠 评论于

      @林半仙 可以的,CentOS下使用n2n比Windows下还简单。不过很抱歉,我这边没有教程。

      • 林半仙 评论于

        @Bug侠 我自己试过 总是PING不通

        • Bug侠 评论于

          @林半仙 是两个edge之间不通吗?有没有检查防火墙firewalld或者iptables相关的设置。我这边不太方便,明晚回去可以折腾折腾CentOS下的客服端。

      • 林半仙 评论于

        @Bug侠 两台win 一台centos 用V2所有都ping不通 V1两台win可以ping通 CENTOS所有都不通。。

        • Bug侠 评论于

          @林半仙 好吧,这个情况我也没遇到过,所以暂时没法帮到你。明天我先在我这边部署一下Win和CentOS下v1和v2的环境,再分析分析,这会儿电脑没在手边……

        • Bug侠 评论于

          @林半仙 我这边搭建了2台Win和2台CentOS,都没有出现Win和CentOS无法互通的问题。
          https://bugxia.com/1342.html
          :笑哭:

  • shrek 评论于

    您好,我的情况是双方都能ping通,防火墙没有关闭,但是minecraft局域网游戏服务器搜寻不到对方,请问这可能是哪方面的原因呢?

    • Bug侠 评论于

      @shrek 不好意思,我的世界我没尝试过。不过如果双方都能ping通对方的话,可以试试用其他游戏测试连通性。
      比如我之前在联机CS时也是出现搜不到对方的问题,但是通过cs内置的控制台命令connect 192.168.*.* 就可以连接到对方建立的游戏里。

      • shrek 评论于

        @Bug侠 好的,谢谢您了。实在不行的话我直接用游戏对战平台了。

  • linmo 评论于

    能不能出个关于手机hin2n的配置教程呢,

  • whitedew 评论于

    老哥我的debug窗口没有东西https://i.loli.net/2019/01/01/5c2acff3a1e78.jpg
    ,ping不通朋友防火墙都关了

    • Bug侠 评论于

      @whitedew 不好意思,目前 win10 1809 下会有这个bug,正在修复

  • 帝国 评论于

    我参考您的文章和其他一些教程搭建好了n2n,连接信息也是成功的,但是游戏里还是看不到对方。游戏是文明6,steam正版,有局域网模式。

    • Bug侠 评论于

      @帝国 双方都能ping通对方吗?

  • 冰皇 评论于

    emmmm,我在联机工具上好像出现了些问题,一个人连进房间另外一个人就进不去了,只要那个人退出,这个进不去的人就可以进去,ip没有冲突,不知道为什么

  • 大头 评论于

    你这个还是两两连接啊?怎么组成局域网呢?

    • Bug侠 评论于

      @大头 怎么是两两连接呢……不同的客户端(edge)自定义同段但不同的IP,加入相同的小组,再连接相同的中心节点(supernode),就可以组网了啊。

      • 大头 评论于

        @Bug侠 必须连接相同的小组才行啊? 用这个吗?
        -c 用于区分节点的社区(组)名

        • Bug侠 评论于

          @大头 对,同IP段不同IP、同小组、同密码、同中心节点,否则即使连上中心节点,也是无法互通的。

          • 大头 评论于

            @Bug侠 谢谢大牛牛,有qq吗

            • Bug侠 评论于

              @大头 QQ万年不在线一次,有事直接留言就行,我能立刻收到通知。 :二哈:

  • 猫头鹰 评论于

    您好,请问N2N是否可以帮助电信和网通的玩家顺利的p2p联机(一款叫做欧陆风云的游戏,通过steam联机,全国各地共19个人)?我是个新手,在挑选工具上犹疑不决,N2N跟Softethen VPN哪个更合用呢?

    • Bug侠 评论于

      @猫头鹰 欧陆风云有局域网联机模式吗?如果有的话,N2N就可以帮助你和其他朋友组成一个虚拟的局域网。
      softether v*p*n和n2n的原理不一样,n2n组成的虚拟局域网数据传输可以不经过中转服务器,所以能获得更好的延迟,并且部署比较简单。
      如果只是为了联机游戏,还是推荐n2n

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