作为在校学生以及任系玩家,闲暇时间一直在 Switch 上玩,但平台上的数款游戏的联机都是玩家间各自通过 UDP 连接完成的。如果没有稳定的 UDP 环境,或者 NAT 类型不佳的话可能就只能享受单机。其中一个简单的解决途径便是使用加速器,但因为不想花钱,所以我就自己实现了一个。
IkaGo 是一个以 Go 语言撰写的,用于绕过 UDP 封锁、UDP QoS 以及 NAT 防火墙的代理。
附上程序框图:
实际上,加速器最重要的是线路而不是技术,市面上的加速器使用的 IPLC 、专线等才是其作为加速器最重要的部分。如果想要真的好好游戏,还是建议选择市面上的产品比较好。
从本质上看,IkaGo 可以通过串联代理 ARP 、代理以及 Udp2raw-tunnel 来实现,IkaGo 从某种意义上只是简化了大量的中间流程,使得只需要简单的部署就能完成主机加速。
IkaGo 之所以这样命名,是因为和自己喜欢的游戏有关,イカ+ Go 。
希望 IkaGo 能帮助到需要解决联机游戏问题的你 😊
1
daya 2020-05-16 17:18:16 +08:00 via iPhone
很强
|
2
9yu 2020-05-16 17:24:48 +08:00
太帅了
|
3
scnace 2020-05-16 17:24:53 +08:00 via Android
甚至可以当毕设了(
|
4
labulaka521 2020-05-16 17:45:36 +08:00 via Android
棒!!!
|
5
timqian 2020-05-16 18:09:49 +08:00 via Android
赞,一个月玩一两次动森用户的福音
|
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 这个参数不太懂是啥意思,要怎么填? |
7
Sketch OP @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 的流量 |
8
NeedforV2 2020-05-16 19:01:04 +08:00 via Android
太强了!期待大神弄一个 openwrt 路由上能用的
|
9
lzyliangzheyu 2020-05-16 19:31:23 +08:00 via Android
关注一波
|
10
dobelee 2020-05-16 19:48:25 +08:00 via iPhone
不玩游戏的弱弱问一下,游戏加速器和普通代理客户端有什么区别?
|
12
Sketch OP |
13
m0cha 2020-05-16 20:11:23 +08:00 via iPhone
很厉害的大佬,第一次发帖就这么高质量,收藏
|
14
akige 2020-05-16 20:11:32 +08:00 via iPhone
如果有中国到美国的大带宽光缆资源,可以做什么游戏的加速呢?
|
15
Sketch OP @akige 或许可以通过 IPLC 之类的减少时延,否则可能只有对时延不敏感的游戏可以。所以线路才是加速器最主要的一部分 😂
|
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 |
17
Sketch OP @donnior 感谢反馈,但是我可能很难解决这个问题,因为我并没有 macOS 的系统,所以是通过 GitHub Actions 完成的编译并在其他 macOS 上测试使用的,但一切正常。
但是有几个细节不知道能不能帮到你。首先是我在 Github Actions 下编译时,并没有配置 libpcap,故 libpcap 可能在 macOS 中已经预装了。另外在 google/gopacket 的 issues 中,也存在类似的案例。因此,这可能是由于 libpcap 的安装,或是 Go 环境配置问题(我更倾向于)导致的 |
18
Sketch OP @donnior 我想再补充一点,在 https://github.com/google/gopacket/issues/629 这一 issue 最后的回复中,有人提到可以 sudo go build 。虽然这并不优雅,但至少 it works 。或许可以帮助到你 : )
|
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 是不是发布的包有问题?怎么还有你的用户路径? |
20
Sketch OP @donnior 感谢反馈。抱歉,这 2 份 Linux 的包是在 WSL 下编译的,确实有问题。我已重新在 Linux 下生成并更新了 release 中的 assets 。
|
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 |
24
Sketch OP @donnior 是 issue 。已经解决了,并且重新 release 了版本 v0.4.1 。macOS 我暂时无法打包,所以可以使用 Github Actions 中生成的 artifacts,或者设置 -log 参数。issue 的原因是,即使未设置 log 文件,也打印 verbose 到 log 文件内,导致了空指针引用。十分感谢反馈 😊
|
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 上是否还需要其他配置? |
26
Sketch OP @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 (更推荐) |
27
Sketch OP @donnior 补充一点,服务器上也建议使用 -rule 并通过 sudo 运行,或是参考 README 中的 troubleshoot 配置防火墙
|
28
AFuture 2020-05-16 23:38:49 +08:00 via iPhone
我差点以为你是一个朋友😂他也自己用 go 写了一个加速器。
|
30
qbmiller 2020-05-17 00:00:34 +08:00 via iPhone
在校学生都这么牛逼了吗
|
32
Sketch OP @donnior 不客气,连接慢也有可能是服务器的问题,比如我自己腾讯云,通过 IkaGo 在 Switch 的连接测试里就不怎么样,但是通过 Speedtest 测速就还行,但是游戏的网速要求其实并不高所以没什么大问题。如果还有问题的话可以在 Github 中发 issue : )
|
33
shansing 2020-05-17 01:05:12 +08:00
支持一下楼主。顺便问下,因为类似 udp2raw 的方式不确定一些中转服务支不支持,有没有可能后续版本可选去除 fake TCP 呢?
|
34
Sketch OP @shansing 其实有使用规范 TCP 传输的功能,仅限通过 config 启动时,在 config 中设置 "tcp": true 开启。但是因为这一功能还不成熟,所以还处于实验性的状态下,并没有写在 README 中
|
35
wangyucn 2020-05-17 05:40:54 +08:00 1
滋瓷一个
|
36
leafleave 2020-05-17 07:28:52 +08:00 via Android
支持
|
37
TangMonk 2020-05-17 08:40:36 +08:00 via iPhone
楼主买了 switch online 吗?
|
38
yazoox 2020-05-17 09:16:32 +08:00
厉害!支持一下
|
39
missdeer 2020-05-17 10:04:18 +08:00
牛逼牛逼
|
40
jdlau 2020-05-17 11:20:17 +08:00
学习一下
|
41
liuxu 2020-05-17 12:50:40 +08:00
我用下试试
|
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 |
43
Sketch OP @Nostopping #26 的例子是运行在电脑上的。由于某些众所周知的原因,IkaGo 并不能用于代理本地流量的,它实现的是类似市面上加速器“主机加速”的功能。如果要代理本地流量,Windows 的话可以用某些通过 PID 筛选流量的代理软件 : )
|
44
longgediyi999 2020-05-17 14:05:41 +08:00
可以加速 PUBG 吗楼主
|
45
Sketch OP @longgediyi999 理论上 IkaGo 可以代理来自指定源地址所有支持的流量,但也如同 #43 所说的,是无法代理本地流量的,如果要代理 PC 游戏,那么需要再另一台设备上启动 IkaGo 。IkaGo 设计之初就是为主机游戏,Switch 或是 PS4 上的游戏,加速的。另外,正如我一再提及,加速器最重要的其实是线路,所以如果想要认真玩游戏可能还是选择市面上的加速器比较好。
|
46
MartinWu 2020-05-17 14:52:59 +08:00
一股淡淡的 geek 意味。。强。
|
47
simpx 2020-05-17 15:39:49 +08:00
|
48
CheekiBreeki 2020-05-17 16:12:49 +08:00 via Android
很強,先 star
|
49
leetao94 2020-05-18 09:06:19 +08:00
果然兴趣是第一驱动力~~
|
50
KickAssTonight 2020-05-18 09:51:15 +08:00
支持!
|
51
pzh 2020-05-18 12:04:32 +08:00 via iPhone
内测人员前来支持🎉
表示内测时被 intel 网卡驱动和 winpcap 折腾够呛(微星垃圾驱动) |
52
latteczy 2020-05-18 12:14:07 +08:00
加密是为了绕过 GFW 的探测么?
|
53
Themyth 2020-05-18 12:32:16 +08:00
请问能否 n2n on IkaGo?
或者 openvpn on IkaGo? 谢谢 |
55
Sketch OP @Themyth IkaGo 的本质是代理 ARP + 代理 + Udp2raw-tunnel 。事实上,可以把 IkaGo 的代理 ARP 部分剥离出来,这样就可以接其他的代理了。目前,如果 OpenVPN 的下一级是 IkaGo 的话,可以是可以,但事实上做了代理( OpenVPN )+ 代理 ARP + 代理( IkaGo )+ FakeTCP,有点浪费。
|
57
Sketch OP @Themyth 默认情况下,IkaGo 不使用 KCP 和加密,只使用 FakeTCP,因为对于游戏加速而言已经足够了。
|
58
ohooooo 2020-05-18 14:52:17 +08:00
大神的气息。
|
59
killerirving 2020-05-20 09:46:22 +08:00
@Sketch 可以试试 travis 记得可以提供多系统环境
|
60
EasonSummer 2020-06-13 19:41:31 +08:00
如果交叉编译能支持 openwrt 嘛?
|
61
Sketch OP @EasonSummer 我没试验过,但是我合并了别人提交的在 Arm 上编译的 PR,GitHub Actions 里有对应的 Artifacts
|
62
labulaka521 2020-06-29 16:54:02 +08:00
能请教下项目代码 /internal/pcap/fragment.go 这个文件的作用吗
我看代码里传输层网络层数据链路层构建好后,然后调用了这个文件里面的函数,然后是按照 mtu 值将数据分割位 mtu 值得大小,然后在发出去, |
63
Sketch OP @labulaka521 你说的没错,这个文件主要包括重组分片与分片(分包) 2 部分。
Defragmenter 是重组分片器,其中 EasyDefragmenter 是一个规则宽松且支持重组“粘包”(由于 IkaGo 上层是通过 TCP 封装包,而 TCP 是一个流协议,故读出的数据并不完全对应一个包)的重组分片器,StrictDefragmenter 是官方的规则严格的重组分片器的一个封装。CreateIPv4FragmentPackets 是一个创建 IPv4 分片的函数,CreateTCPSegmentPackets 是一个创建 TCP 分段的函数。 |
64
labulaka521 2020-06-30 14:25:36 +08:00 via iPhone
@Sketch 感谢 学习了
|
65
zjgsamuel 2020-07-03 10:47:13 +08:00
昨晚试在我的 Switch 上试了一下 Win 台式机上装了代理 然后 按照教程 运行了命令 可以运行 显示正常 ~
但是 在 Switch 上看不出有加速的迹象么? 我怎么样才能知道命令在运行呢? 当我在 Switch 上 变了 IP 地址 命令行倒是有错误报错 我更改了 我代理客户端上 允许 GDP 转发 允许局域网共享 , 然后 切换了各种代理的模式 貌似都不行呢 肯定是我哪里不对 |
67
EasonSummer 2020-07-26 15:08:18 +08:00
server 端一定要关闭 ip 转发嘛?就是不能同时有 VPN 运行了嘛
|
68
Sketch OP @EasonSummer 是的,不过你也可以看看我后来的 https://www.v2ex.com/t/683486 这个项目
|
69
horou 2020-12-28 17:50:28 +08:00
大佬牛皮!!已 star,刚好自己想实现一个 ps4 的加速器,一直找不到思路。^ ^
|
70
hkshawn 2021-03-19 08:28:46 +08:00
大佬是否考虑改吧改吧投放市场?可以联系联系~
TG:@GhostShield_Y5 |
71
Rx 2021-08-05 19:27:55 +08:00 via Android
厉害👍🏻
|
72
moksa 2021-08-07 21:24:38 +08:00
不明觉厉。。。。希望有傻瓜教程....
|