爱意满满的作品展示区。
Sketch

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

  •  
  •   Sketch · May 16, 2020 · 17239 views
    This topic created in 2364 days ago, the information mentioned may be changed or developed.

    作为在校学生以及任系玩家,闲暇时间一直在 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 能帮助到需要解决联机游戏问题的你 😊

    Supplement 1  ·  May 17, 2020

    补充

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

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

    这个参数不太懂是啥意思,要怎么填?
    Sketch
    Sketch
    OP
    May 16, 2020 via iPhone
    7
    @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
    NeedforV2
    May 16, 2020 via Android
    8
    太强了!期待大神弄一个 openwrt 路由上能用的
    lzyliangzheyu
    lzyliangzheyu
    May 16, 2020 via Android
    9
    关注一波
    dobelee
    dobelee
    May 16, 2020 via iPhone
    10
    不玩游戏的弱弱问一下,游戏加速器和普通代理客户端有什么区别?
    CCIP
    CCIP
    May 16, 2020 via Android
    11
    @dobelee 一个本来的作用是加密或者安全 一个是减少延迟和丢包
    Sketch
    Sketch
    OP
    May 16, 2020
    12
    @dobelee 正如 @CCIP 说的,游戏加速器主要是用于减少延迟和丢包,所以才说线路是其最主要的一部分。当然,游戏加速器还有一个作用就是使 NAT 穿透失败的用户也能进行游戏,而这是 IkaGo 主要解决的问题
    m0cha
    m0cha
    May 16, 2020 via iPhone
    13
    很厉害的大佬,第一次发帖就这么高质量,收藏
    akige
    akige
    May 16, 2020 via iPhone
    14
    如果有中国到美国的大带宽光缆资源,可以做什么游戏的加速呢?
    Sketch
    Sketch
    OP
    May 16, 2020
    15
    @akige 或许可以通过 IPLC 之类的减少时延,否则可能只有对时延不敏感的游戏可以。所以线路才是加速器最主要的一部分 😂
    donnior
    donnior
    May 16, 2020
    16
    mac 上编译不通过,libpcap 已经通过 homebrew 安装了

    # github.com/google/gopacket/pcap
    ../../../go/pkg/mod/github.com/google/[email protected]/pcap/pcap.go:30:22: undefined: pcapErrorNotActivated
    Sketch
    Sketch
    OP
    May 16, 2020
    17
    @donnior 感谢反馈,但是我可能很难解决这个问题,因为我并没有 macOS 的系统,所以是通过 GitHub Actions 完成的编译并在其他 macOS 上测试使用的,但一切正常。
    但是有几个细节不知道能不能帮到你。首先是我在 Github Actions 下编译时,并没有配置 libpcap,故 libpcap 可能在 macOS 中已经预装了。另外在 google/gopacket 的 issues 中,也存在类似的案例。因此,这可能是由于 libpcap 的安装,或是 Go 环境配置问题(我更倾向于)导致的
    Sketch
    Sketch
    OP
    May 16, 2020
    18
    @donnior 我想再补充一点,在 https://github.com/google/gopacket/issues/629 这一 issue 最后的回复中,有人提到可以 sudo go build 。虽然这并不优雅,但至少 it works 。或许可以帮助到你 : )
    donnior
    donnior
    May 16, 2020
    19
    @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
    Sketch
    OP
    May 16, 2020
    20
    @donnior 感谢反馈。抱歉,这 2 份 Linux 的包是在 WSL 下编译的,确实有问题。我已重新在 Linux 下生成并更新了 release 中的 assets 。
    donnior
    donnior
    May 16, 2020
    21
    @Sketch 貌似 linux server 包里面实际是 client 的执行文件?
    Sketch
    Sketch
    OP
    May 16, 2020
    22
    @donnior 是的,打包打错了,所以又更新了一次 😂
    donnior
    donnior
    May 16, 2020
    23
    @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
    Sketch
    OP
    May 16, 2020
    24
    @donnior 是 issue 。已经解决了,并且重新 release 了版本 v0.4.1 。macOS 我暂时无法打包,所以可以使用 Github Actions 中生成的 artifacts,或者设置 -log 参数。issue 的原因是,即使未设置 log 文件,也打印 verbose 到 log 文件内,导致了空指针引用。十分感谢反馈 😊
    donnior
    donnior
    May 16, 2020
    25
    @Sketch 测试了一下,虽然运行成功了,但是没有效果(或者是我用法错了?)

    假设我的设备如下:

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

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

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