V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Sketch
V2EX  ›  分享创造

分享自己用 Go 写的游戏加速器 IkaGo

  •  
  •   Sketch · 2020-05-16 16:45:27 +08:00 · 14465 次点击
    这是一个创建于 1658 天前的主题,其中的信息可能已经有所发展或是发生改变。

    作为在校学生以及任系玩家,闲暇时间一直在 Switch 上玩,但平台上的数款游戏的联机都是玩家间各自通过 UDP 连接完成的。如果没有稳定的 UDP 环境,或者 NAT 类型不佳的话可能就只能享受单机。其中一个简单的解决途径便是使用加速器,但因为不想花钱,所以我就自己实现了一个。

    IkaGo

    IkaGo 是一个以 Go 语言撰写的,用于绕过 UDP 封锁、UDP QoS 以及 NAT 防火墙的代理。

    附上程序框图:

    diagram

    特性

    • 利用了类似 Udp2raw-tunnel 的 FakeTCP 机制,绕过 UDP 封锁与 UDP QoS
    • 利用了代理 ARP 应答指定 IP 地址的请求,实现将自身作为网关处理来自指定 IP 地址的网络流量(也就是类似市面上的加速器,将主机的 IP 地址与网关设为网络环境中不存在的值,由加速器来处理流量)
    • 通过 IkaGo-web,一个相关联的前端项目,监控网络流量
    • 多路复用、跨平台、Full Cone NAT 、加密、KCP 支持……

    与市面上的加速器的比较

    • IkaGo 将所有支持的包通过 FakeTCP 转换为 TCP 包,绕过 UDP 封锁与 UDP QoS
    • 多路复用使得多个主机可以一同被加速
    • 免费(但你还是需要租用 VPS 等服务器)、启动快、无广告、跨平台、设置可自定义、开源……

    一些不得不提的话

    实际上,加速器最重要的是线路而不是技术,市面上的加速器使用的 IPLC 、专线等才是其作为加速器最重要的部分。如果想要真的好好游戏,还是建议选择市面上的产品比较好。

    从本质上看,IkaGo 可以通过串联代理 ARP 、代理以及 Udp2raw-tunnel 来实现,IkaGo 从某种意义上只是简化了大量的中间流程,使得只需要简单的部署就能完成主机加速。

    IkaGo 之所以这样命名,是因为和自己喜欢的游戏有关,イカ+ Go 。

    项目地址


    希望 IkaGo 能帮助到需要解决联机游戏问题的你 😊

    第 1 条附言  ·  2020-05-17 15:18:04 +08:00

    补充

    • 需要游戏加速往往是在游戏中遇到了或是 NAT 穿透失败,或是掉线、高 Ping或是游戏运营商限制玩家 IP 等问题。IkaGo 可以解决这几个问题,但 IkaGo 的设计之初是为了主机加速,也就是应对 NAT 穿透失败这一情况的。由于对加速器而言,线路比技术更重要,如果你想在美服玩游戏并且没有 IPLC,那么选择市面上拥有专线的加速器会更好
    • IkaGo 只能代理来自其他设备的流量,并不能用于代理本地流量。如果你想要加速电脑游戏,那你需要在路由器或是另一台电脑等其他设备上运行 IkaGo。另外,IkaGo 目前不能筛选需要代理的流量而只能代理全部的流量,筛选需要代理的流量这一功能或许会在未来的更新中引入。因此,目前,如果想要加速电脑游戏,我更推荐使用可以通过 PID、PAC 筛选流量的透明代理应用
    • IkaGo 的一个典型使用参数已在 #26#27#29 中提供,如果你依然无法使用 IkaGo,那么可以阅读项目 README 中的 Troubleshoot 一章
    • IkaGo 的一部分实现方法与技术原理已在项目的 开发文档 中提供 😊
    72 条回复    2021-08-07 21:24:38 +08:00
    daya
        1
    daya  
       2020-05-16 17:18:16 +08:00 via iPhone
    很强
    9yu
        2
    9yu  
       2020-05-16 17:24:48 +08:00
    太帅了
    scnace
        3
    scnace  
       2020-05-16 17:24:53 +08:00 via Android
    甚至可以当毕设了(
    labulaka521
        4
    labulaka521  
       2020-05-16 17:45:36 +08:00 via Android
    棒!!!
    timqian
        5
    timqian  
       2020-05-16 18:09:49 +08:00 via Android
    赞,一个月玩一两次动森用户的福音
    donnior
        6
    donnior  
       2020-05-16 18:22:03 +08:00
    @Sketch 感谢楼主,有个问题

    -r addresses: Sources, use comma to separate multiple addresses. Packets with the same source's address will be proxied

    这个参数不太懂是啥意思,要怎么填?
    Sketch
        7
    Sketch  
    OP
       2020-05-16 18:30:10 +08:00 via iPhone
    @donnior 意思就是,转发哪些源地址的流量。
    一个典型的设置是,-publish 10.6.0.1 -r 10.6.0.2,10.6.0.3,然后将被代理设备的网络设置为 IP 10.6.0.2 或 10.6.0.3 网关 10.6.0.1 那就将转发来自 10.6.0.2 和 10.6.0.3 的流量
    NeedforV2
        8
    NeedforV2  
       2020-05-16 19:01:04 +08:00 via Android
    太强了!期待大神弄一个 openwrt 路由上能用的
    lzyliangzheyu
        9
    lzyliangzheyu  
       2020-05-16 19:31:23 +08:00 via Android
    关注一波
    dobelee
        10
    dobelee  
       2020-05-16 19:48:25 +08:00 via iPhone
    不玩游戏的弱弱问一下,游戏加速器和普通代理客户端有什么区别?
    CCIP
        11
    CCIP  
       2020-05-16 19:53:58 +08:00 via Android
    @dobelee 一个本来的作用是加密或者安全 一个是减少延迟和丢包
    Sketch
        12
    Sketch  
    OP
       2020-05-16 20:02:22 +08:00
    @dobelee 正如 @CCIP 说的,游戏加速器主要是用于减少延迟和丢包,所以才说线路是其最主要的一部分。当然,游戏加速器还有一个作用就是使 NAT 穿透失败的用户也能进行游戏,而这是 IkaGo 主要解决的问题
    m0cha
        13
    m0cha  
       2020-05-16 20:11:23 +08:00 via iPhone
    很厉害的大佬,第一次发帖就这么高质量,收藏
    akige
        14
    akige  
       2020-05-16 20:11:32 +08:00 via iPhone
    如果有中国到美国的大带宽光缆资源,可以做什么游戏的加速呢?
    Sketch
        15
    Sketch  
    OP
       2020-05-16 20:35:51 +08:00
    @akige 或许可以通过 IPLC 之类的减少时延,否则可能只有对时延不敏感的游戏可以。所以线路才是加速器最主要的一部分 😂
    donnior
        16
    donnior  
       2020-05-16 20:38:03 +08:00
    mac 上编译不通过,libpcap 已经通过 homebrew 安装了

    # github.com/google/gopacket/pcap
    ../../../go/pkg/mod/github.com/google/[email protected]/pcap/pcap.go:30:22: undefined: pcapErrorNotActivated
    Sketch
        17
    Sketch  
    OP
       2020-05-16 21:03:08 +08:00
    @donnior 感谢反馈,但是我可能很难解决这个问题,因为我并没有 macOS 的系统,所以是通过 GitHub Actions 完成的编译并在其他 macOS 上测试使用的,但一切正常。
    但是有几个细节不知道能不能帮到你。首先是我在 Github Actions 下编译时,并没有配置 libpcap,故 libpcap 可能在 macOS 中已经预装了。另外在 google/gopacket 的 issues 中,也存在类似的案例。因此,这可能是由于 libpcap 的安装,或是 Go 环境配置问题(我更倾向于)导致的
    Sketch
        18
    Sketch  
    OP
       2020-05-16 21:06:30 +08:00
    @donnior 我想再补充一点,在 https://github.com/google/gopacket/issues/629 这一 issue 最后的回复中,有人提到可以 sudo go build 。虽然这并不优雅,但至少 it works 。或许可以帮助到你 : )
    donnior
        19
    donnior  
       2020-05-16 21:41:07 +08:00
    @Sketch 我也查到这个 issue 了,折腾无果,放弃编译了;直接使用你发布的 release 包( ubuntu server 和 darwin client ),没有用源码运行;直接在我的 ubuntu 服务器上运行 `./ikago-server -p 38080` ,然后从家里的 mac 中运行客户端时,server 会直接退出,报错如下:

    panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x67f0a1]

    goroutine 11 [running]:
    log.(*Logger).Output(0x0, 0x2, 0xc000026340, 0x3d, 0x0, 0x0)
    /usr/local/go/src/log/log.go:162 +0x81
    ikago/internal/log.Verbosef(0x8772fd, 0x1b, 0xc000051da0, 0x2, 0x2)
    /mnt/c/Users/Xie/Documents/Code/ikago/internal/log/log.go:82 +0xa0
    ikago/internal/pcap.(*Conn).handshakeSYNACK(0xc000442000, 0xc000063920, 0x0, 0x0)
    /mnt/c/Users/Xie/Documents/Code/ikago/internal/pcap/conn.go:323 +0x7e3
    ikago/internal/pcap.(*Listener).Accept(0xc0003ce180, 0x0, 0x0, 0x0, 0x0)
    /mnt/c/Users/Xie/Documents/Code/ikago/internal/pcap/conn.go:815 +0x8c0
    main.open.func1(0x904c40, 0xc0003ce180)
    /mnt/c/Users/Xie/Documents/Code/ikago/cmd/ikago-server/main.go:555 +0x3b
    created by main.open
    /mnt/c/Users/Xie/Documents/Code/ikago/cmd/ikago-server/main.go:553 +0x7d1

    是不是发布的包有问题?怎么还有你的用户路径?
    Sketch
        20
    Sketch  
    OP
       2020-05-16 21:47:50 +08:00
    @donnior 感谢反馈。抱歉,这 2 份 Linux 的包是在 WSL 下编译的,确实有问题。我已重新在 Linux 下生成并更新了 release 中的 assets 。
    donnior
        21
    donnior  
       2020-05-16 21:54:24 +08:00
    @Sketch 貌似 linux server 包里面实际是 client 的执行文件?
    Sketch
        22
    Sketch  
    OP
       2020-05-16 21:57:25 +08:00
    @donnior 是的,打包打错了,所以又更新了一次 😂
    donnior
        23
    donnior  
       2020-05-16 22:07:17 +08:00
    @Sketch 还是有问题,😂

    on ubuntu server: `./ikago-server -p 38080`
    on my mac: `sudo ./ikago-client -s $my_server_ip:38080 -r 192.168.1.17 -publish 192.168.1.1`

    连接时候 server 直接挂掉:

    panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x680d3e]

    goroutine 12 [running]:
    sync.(*Mutex).Lock(...)
    /usr/local/go/src/sync/mutex.go:74
    log.(*Logger).Output(0x0, 0x2, 0xc000026340, 0x3d, 0x0, 0x0)
    /usr/local/go/src/log/log.go:153 +0x6e
    ikago/internal/log.Verbosef(0x890db6, 0x1b, 0xc000055db0, 0x2, 0x2)
    /home/sketch/ikago/internal/log/log.go:82 +0xa0
    ikago/internal/pcap.(*Conn).handshakeSYNACK(0xc000440000, 0xc000067b00, 0x0, 0x0)
    /home/sketch/ikago/internal/pcap/conn.go:323 +0x7cd
    ikago/internal/pcap.(*Listener).Accept(0xc0003d6180, 0x0, 0x0, 0x0, 0x0)
    /home/sketch/ikago/internal/pcap/conn.go:815 +0x9ce
    main.open.func1(0x91adc0, 0xc0003d6180)
    /home/sketch/ikago/cmd/ikago-server/main.go:555 +0x3b
    created by main.open
    /home/sketch/ikago/cmd/ikago-server/main.go:553 +0x7d4
    Sketch
        24
    Sketch  
    OP
       2020-05-16 22:15:31 +08:00
    @donnior 是 issue 。已经解决了,并且重新 release 了版本 v0.4.1 。macOS 我暂时无法打包,所以可以使用 Github Actions 中生成的 artifacts,或者设置 -log 参数。issue 的原因是,即使未设置 log 文件,也打印 verbose 到 log 文件内,导致了空指针引用。十分感谢反馈 😊
    donnior
        25
    donnior  
       2020-05-16 23:17:06 +08:00
    @Sketch 测试了一下,虽然运行成功了,但是没有效果(或者是我用法错了?)

    假设我的设备如下:

    server: 2.3.4.5:38080
    mac : 192.168.1.10
    路由器: 192.168.1.1
    switch 游戏机:192.168.1. 20

    能否帮给个实例配置? 这种方式 swtich 上是否还需要其他配置?
    Sketch
        26
    Sketch  
    OP
       2020-05-16 23:27:53 +08:00
    @donnior macOS 相比起 Windows 的约束更大,所以需要带上代理 ARP 运行,一个典型设置是:
    ikago-client:-rule -p 10.6.0.2 -r 10.6.0.1 -s server:port (配置防火墙,使用代理 ARP 将自身视为 10.6.0.2,代理来自 10.6.0.1 的流量,另外这也是某企鹅加速器的默认设置 😂)
    Switch 网络设置:IP 地址 10.6.0.1 子网掩码 255.255.255.0 网关 10.6.0.2
    macOS 下务必配置防火墙,具体可参考 README 中的 troubleshoot,或是使用 -rule (如上)并通过 sudo 运行 IkaGo (更推荐)
    Sketch
        27
    Sketch  
    OP
       2020-05-16 23:32:59 +08:00
    @donnior 补充一点,服务器上也建议使用 -rule 并通过 sudo 运行,或是参考 README 中的 troubleshoot 配置防火墙
    AFuture
        28
    AFuture  
       2020-05-16 23:38:49 +08:00 via iPhone
    我差点以为你是一个朋友😂他也自己用 go 写了一个加速器。
    Sketch
        29
    Sketch  
    OP
       2020-05-16 23:46:02 +08:00 via iPhone
    @donnior 订正一下,#26 中的 -p 应为 -publish
    qbmiller
        30
    qbmiller  
       2020-05-17 00:00:34 +08:00 via iPhone
    在校学生都这么牛逼了吗
    donnior
        31
    donnior  
       2020-05-17 00:15:47 +08:00
    @Sketch 谢谢,貌似已经成功连接了,但是 switch 上实际测试比直连貌似还慢一些 😂, 后面再多试试看看
    Sketch
        32
    Sketch  
    OP
       2020-05-17 00:21:20 +08:00
    @donnior 不客气,连接慢也有可能是服务器的问题,比如我自己腾讯云,通过 IkaGo 在 Switch 的连接测试里就不怎么样,但是通过 Speedtest 测速就还行,但是游戏的网速要求其实并不高所以没什么大问题。如果还有问题的话可以在 Github 中发 issue : )
    shansing
        33
    shansing  
       2020-05-17 01:05:12 +08:00
    支持一下楼主。顺便问下,因为类似 udp2raw 的方式不确定一些中转服务支不支持,有没有可能后续版本可选去除 fake TCP 呢?
    Sketch
        34
    Sketch  
    OP
       2020-05-17 01:13:34 +08:00   ❤️ 1
    @shansing 其实有使用规范 TCP 传输的功能,仅限通过 config 启动时,在 config 中设置 "tcp": true 开启。但是因为这一功能还不成熟,所以还处于实验性的状态下,并没有写在 README 中
    wangyucn
        35
    wangyucn  
       2020-05-17 05:40:54 +08:00   ❤️ 1
    滋瓷一个
    leafleave
        36
    leafleave  
       2020-05-17 07:28:52 +08:00 via Android
    支持
    TangMonk
        37
    TangMonk  
       2020-05-17 08:40:36 +08:00 via iPhone
    楼主买了 switch online 吗?
    yazoox
        38
    yazoox  
       2020-05-17 09:16:32 +08:00
    厉害!支持一下
    missdeer
        39
    missdeer  
       2020-05-17 10:04:18 +08:00
    牛逼牛逼
    jdlau
        40
    jdlau  
       2020-05-17 11:20:17 +08:00
    学习一下
    liuxu
        41
    liuxu  
       2020-05-17 12:50:40 +08:00
    我用下试试
    Nostopping
        42
    Nostopping  
       2020-05-17 12:59:37 +08:00
    @Sketch 26 楼的例子 client 是运行在路由器上的吗?如果我是 win 下运行 client 并且想代理本机流量应该怎么设置?
    在 win 下我 client -r 本机 ip -s 服务器 ip 这样运行就会不停的 send error: PacketSendPacket failed
    Sketch
        43
    Sketch  
    OP
       2020-05-17 13:07:37 +08:00
    @Nostopping #26 的例子是运行在电脑上的。由于某些众所周知的原因,IkaGo 并不能用于代理本地流量的,它实现的是类似市面上加速器“主机加速”的功能。如果要代理本地流量,Windows 的话可以用某些通过 PID 筛选流量的代理软件 : )
    longgediyi999
        44
    longgediyi999  
       2020-05-17 14:05:41 +08:00
    可以加速 PUBG 吗楼主
    Sketch
        45
    Sketch  
    OP
       2020-05-17 14:27:01 +08:00
    @longgediyi999 理论上 IkaGo 可以代理来自指定源地址所有支持的流量,但也如同 #43 所说的,是无法代理本地流量的,如果要代理 PC 游戏,那么需要再另一台设备上启动 IkaGo 。IkaGo 设计之初就是为主机游戏,Switch 或是 PS4 上的游戏,加速的。另外,正如我一再提及,加速器最重要的其实是线路,所以如果想要认真玩游戏可能还是选择市面上的加速器比较好。
    MartinWu
        46
    MartinWu  
       2020-05-17 14:52:59 +08:00
    一股淡淡的 geek 意味。。强。
    simpx
        47
    simpx  
       2020-05-17 15:39:49 +08:00
    看了下 github 主页,是浙大学弟啊

    学弟大几了,有没有兴趣看看实习
    CheekiBreeki
        48
    CheekiBreeki  
       2020-05-17 16:12:49 +08:00 via Android
    很強,先 star
    leetao94
        49
    leetao94  
       2020-05-18 09:06:19 +08:00
    果然兴趣是第一驱动力~~
    KickAssTonight
        50
    KickAssTonight  
       2020-05-18 09:51:15 +08:00
    支持!
    pzh
        51
    pzh  
       2020-05-18 12:04:32 +08:00 via iPhone
    内测人员前来支持🎉
    表示内测时被 intel 网卡驱动和 winpcap 折腾够呛(微星垃圾驱动)
    latteczy
        52
    latteczy  
       2020-05-18 12:14:07 +08:00
    加密是为了绕过 GFW 的探测么?
    Themyth
        53
    Themyth  
       2020-05-18 12:32:16 +08:00
    请问能否 n2n on IkaGo?
    或者 openvpn on IkaGo?
    谢谢
    Sketch
        54
    Sketch  
    OP
       2020-05-18 12:35:49 +08:00
    @latteczy 只能是,加密是为了包的完整性,设计 IkaGo 的目的仅仅只是游戏加速。
    Sketch
        55
    Sketch  
    OP
       2020-05-18 12:44:13 +08:00
    @Themyth IkaGo 的本质是代理 ARP + 代理 + Udp2raw-tunnel 。事实上,可以把 IkaGo 的代理 ARP 部分剥离出来,这样就可以接其他的代理了。目前,如果 OpenVPN 的下一级是 IkaGo 的话,可以是可以,但事实上做了代理( OpenVPN )+ 代理 ARP + 代理( IkaGo )+ FakeTCP,有点浪费。
    Themyth
        56
    Themyth  
       2020-05-18 13:26:02 +08:00
    @Sketch 是的,那 IKAGO 默认启用了 Kcp 吗
    Sketch
        57
    Sketch  
    OP
       2020-05-18 13:34:20 +08:00
    @Themyth 默认情况下,IkaGo 不使用 KCP 和加密,只使用 FakeTCP,因为对于游戏加速而言已经足够了。
    ohooooo
        58
    ohooooo  
       2020-05-18 14:52:17 +08:00
    大神的气息。
    killerirving
        59
    killerirving  
       2020-05-20 09:46:22 +08:00
    @Sketch 可以试试 travis 记得可以提供多系统环境
    EasonSummer
        60
    EasonSummer  
       2020-06-13 19:41:31 +08:00
    如果交叉编译能支持 openwrt 嘛?
    Sketch
        61
    Sketch  
    OP
       2020-06-13 21:31:14 +08:00
    @EasonSummer 我没试验过,但是我合并了别人提交的在 Arm 上编译的 PR,GitHub Actions 里有对应的 Artifacts
    labulaka521
        62
    labulaka521  
       2020-06-29 16:54:02 +08:00
    能请教下项目代码 /internal/pcap/fragment.go 这个文件的作用吗
    我看代码里传输层网络层数据链路层构建好后,然后调用了这个文件里面的函数,然后是按照 mtu 值将数据分割位 mtu 值得大小,然后在发出去,
    Sketch
        63
    Sketch  
    OP
       2020-06-29 18:06:34 +08:00
    @labulaka521 你说的没错,这个文件主要包括重组分片与分片(分包) 2 部分。
    Defragmenter 是重组分片器,其中 EasyDefragmenter 是一个规则宽松且支持重组“粘包”(由于 IkaGo 上层是通过 TCP 封装包,而 TCP 是一个流协议,故读出的数据并不完全对应一个包)的重组分片器,StrictDefragmenter 是官方的规则严格的重组分片器的一个封装。CreateIPv4FragmentPackets 是一个创建 IPv4 分片的函数,CreateTCPSegmentPackets 是一个创建 TCP 分段的函数。
    labulaka521
        64
    labulaka521  
       2020-06-30 14:25:36 +08:00 via iPhone
    @Sketch 感谢 学习了
    zjgsamuel
        65
    zjgsamuel  
       2020-07-03 10:47:13 +08:00
    昨晚试在我的 Switch 上试了一下 Win 台式机上装了代理 然后 按照教程 运行了命令 可以运行 显示正常 ~
    但是 在 Switch 上看不出有加速的迹象么? 我怎么样才能知道命令在运行呢?
    当我在 Switch 上 变了 IP 地址 命令行倒是有错误报错
    我更改了 我代理客户端上 允许 GDP 转发 允许局域网共享 , 然后 切换了各种代理的模式 貌似都不行呢
    肯定是我哪里不对
    Sketch
        66
    Sketch  
    OP
       2020-07-03 13:00:33 +08:00
    @zjgsamuel 呃……这个描述稍微有一点乱,要不开个 issue 我看看
    EasonSummer
        67
    EasonSummer  
       2020-07-26 15:08:18 +08:00
    server 端一定要关闭 ip 转发嘛?就是不能同时有 VPN 运行了嘛
    Sketch
        68
    Sketch  
    OP
       2020-07-26 21:18:48 +08:00
    @EasonSummer 是的,不过你也可以看看我后来的 https://www.v2ex.com/t/683486 这个项目
    horou
        69
    horou  
       2020-12-28 17:50:28 +08:00
    大佬牛皮!!已 star,刚好自己想实现一个 ps4 的加速器,一直找不到思路。^ ^
    hkshawn
        70
    hkshawn  
       2021-03-19 08:28:46 +08:00
    大佬是否考虑改吧改吧投放市场?可以联系联系~
    TG:@GhostShield_Y5
    Rx
        71
    Rx  
       2021-08-05 19:27:55 +08:00 via Android
    厉害👍🏻
    moksa
        72
    moksa  
       2021-08-07 21:24:38 +08:00
    不明觉厉。。。。希望有傻瓜教程....
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2866 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:37 · PVG 10:37 · LAX 18:37 · JFK 21:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.