juewuy / ShellCrash

Run sing-box/mihomo as client in shell
8.73k stars 1.46k forks source link

[可复现 / 可提供测试设备] (路由器工作在旁路由 AP 模式时)在 AC86U 路由器的 386 官改 / 梅林 / Paldier 固件上存在兼容问题。 #208

Closed Mirr0ch1 closed 1 year ago

Mirr0ch1 commented 2 years ago

您好,我使用一台 AC86U 作为家庭网络中(192.168.20.0)的 AP(192.168.20.2)。

同时利用其硬件实现 Clash 的旁路由 —— 需要翻墙的设备,手动将网关地址 设置为 192.168.20.2,便可经过路由器中的 Clash 代理流量。

ShellClash 工作在 real-ip / redir 模式下,并使用 tproxy 转发 udp。

问题(1)

配置完成后,重启路由器之后,clash 命令失效,上次开机时配置的变量消失。 重走在线配置后发现,您的脚本是通过 sed 在 /jffs/scripts/nat-start 中添加了重启初始化命令。

但是, 官改、梅改、梅林固件工作在 AP 模式时,不存在 /jffs/scripts/nat-start 文件 ,重启初始化命令无法正常写入。

我手动 touch 一个空白 nat-start 文件后再次走了一遍在线配置后,问题解决。

Q :是否可以在配置脚本中增加一个 “不存在文件、则创建” 的判定?

问题(2)

ShellClash初始化过程当中,会提示 “检测到你的设备尚未开启ip转发,局域网设备将无法正常连接网络,是否立即开启?”,猜测由于工作在 AP 模式,固件自动关闭了内核的 ip 转发功能。

若此时选择“否”,手动指定网关的设备的流量无法经过 ShellClash。

选择“是”,则手动指定网关的设备联网正常,tcp / udp 均可被转发。

但重启路由器后, 由于对应的启用 ip 转发命令位于 /etc/init.d/procps ,该目录重启路由器后会重置 ,ip 转发状态丢失。

于是,我重启路由器后,重新通过 测试菜单 重走初始化引导,此时再次遇到开启 ip 转发提示,但这次开始报错:

检测到你的设备尚未开启ip转发,局域网设备将无法正常连接网络,是否立即开启?
是否开启?(1/0) > 1
/jffs/clash/clash.sh: line 1171: /etc/init.d/procps: not found

此时, tcp 可正常通过 redir 转发,udp 无法通过 tproxy 转发

Q :这部分超过我能力范围了,不知道如何解决。我手上还有闲置的 AC86U,若您需要我可将设备邮寄给您。

感谢。

juewuy commented 2 years ago

@Mirr0ch1 第一个问题我记得应该是修过,不过华硕系统固件很杂乱,不确保都能正确识别 第二个问题如果AP原本就可以用,那么不用开启理论上也是可以使用的,而且路由设备一般都是默认开启的,我也不明白为什么AP模式会有这些问题 事实上shellclash并不支持在AP或者中继设备上使用

Mirr0ch1 commented 2 years ago

确实,我在openwrt上作为旁路由时 偶尔也会撞bug。 后来在另一个家中专门搞了个debian server 做旁路由,shellclash 才彻底工作正常。

理论上说旁路由模式也是ok的,只是脚本部分语句有些不兼容,假如您有精力的话还是希望有时间能排查下🙈🙈

darkrain88 commented 2 years ago

AC86U 梅林 Firmware Version:[386.7_2]

安装在jffs里面, 启动不了, fatal error: pageAlloc: out of memory

1 启动/重启clash服务 2 clash功能设置 3 停止clash服务 4 禁用clash开机启动 5 设置定时任务 6 导入配置文件 7 clash进阶设置 8 其他工具 9 更新/卸载

0 退出脚本 请输入对应数字 > 1

fatal error: pageAlloc: out of memory

runtime stack: runtime.throw({0x4c8580, 0x18}) runtime/panic.go:1198 +0x54 fp=0x7fd5832ad0 sp=0x7fd5832aa0 pc=0x45444 runtime.(pageAlloc).grow(0x87d928, 0x4000000000, 0x400000) runtime/mpagealloc.go:399 +0x204 fp=0x7fd5832b40 sp=0x7fd5832ad0 pc=0x399d4 runtime.(mheap).grow(0x87d920, 0x1) runtime/mheap.go:1408 +0x3b0 fp=0x7fd5832bc0 sp=0x7fd5832b40 pc=0x37bf0 runtime.(mheap).allocSpan(0x87d920, 0x1, 0x0, 0x2e) runtime/mheap.go:1179 +0x188 fp=0x7fd5832c40 sp=0x7fd5832bc0 pc=0x37248 runtime.(mheap).alloc.func1() runtime/mheap.go:913 +0x88 fp=0x7fd5832c90 sp=0x7fd5832c40 pc=0x36ce8 runtime.(mheap).alloc(0x87d920, 0x1, 0x2e, 0x1) runtime/mheap.go:907 +0x64 fp=0x7fd5832ce0 sp=0x7fd5832c90 pc=0x36bd4 runtime.(mcentral).grow(0x88fde8) runtime/mcentral.go:241 +0x74 fp=0x7fd5832d30 sp=0x7fd5832ce0 pc=0x27074 runtime.(mcentral).cacheSpan(0x88fde8) runtime/mcentral.go:161 +0x954 fp=0x7fd5832dc0 sp=0x7fd5832d30 pc=0x26e84 runtime.(mcache).refill(0x7fa0d12108, 0x2e) runtime/mcache.go:162 +0xc0 fp=0x7fd5832e20 sp=0x7fd5832dc0 pc=0x25ba0 runtime.(*mcache).nextFree(0x7fa0d12108, 0x2e) runtime/malloc.go:880 +0x94 fp=0x7fd5832e70 sp=0x7fd5832e20 pc=0x1bd04 runtime.mallocgc(0x188, 0x4bd1e0, 0x1) runtime/malloc.go:1071 +0x4c0 fp=0x7fd5832f00 sp=0x7fd5832e70 pc=0x1c360 runtime.newobject(0x4bd1e0) runtime/malloc.go:1228 +0x38 fp=0x7fd5832f30 sp=0x7fd5832f00 pc=0x1c8b8 runtime.malg(0x8000) runtime/proc.go:4220 +0x2c fp=0x7fd5832f80 sp=0x7fd5832f30 pc=0x514fc runtime.mpreinit(0x864ba0) runtime/os_linux.go:355 +0x28 fp=0x7fd5832fa0 sp=0x7fd5832f80 pc=0x41a48 runtime.mcommoninit(0x864ba0, 0xffffffffffffffff) runtime/proc.go:803 +0x118 fp=0x7fd5832ff0 sp=0x7fd5832fa0 pc=0x49588 runtime.schedinit() runtime/proc.go:691 +0x94 fp=0x7fd5833050 sp=0x7fd5832ff0 pc=0x49074 runtime.rt0_go() runtime/asm_arm64.s:86 +0xa8 fp=0x7fd5833080 sp=0x7fd5833050 pc=0x75478 clash服务启动失败!请查看报错信息! fatal error: runtime: out of memory

runtime stack: runtime.throw({0x4c70f7, 0x16}) runtime/panic.go:1198 +0x54 fp=0x7fd8e36570 sp=0x7fd8e36540 pc=0x45444 runtime.sysMap(0x4000000000, 0x400000, 0x898770) runtime/mem_linux.go:169 +0xbc fp=0x7fd8e365b0 sp=0x7fd8e36570 pc=0x279dc runtime.(mheap).grow(0x87d920, 0x1) runtime/mheap.go:1393 +0x2e8 fp=0x7fd8e36630 sp=0x7fd8e365b0 pc=0x37b28 runtime.(mheap).allocSpan(0x87d920, 0x1, 0x0, 0x2e) runtime/mheap.go:1179 +0x188 fp=0x7fd8e366b0 sp=0x7fd8e36630 pc=0x37248 runtime.(mheap).alloc.func1() runtime/mheap.go:913 +0x88 fp=0x7fd8e36700 sp=0x7fd8e366b0 pc=0x36ce8 runtime.(mheap).alloc(0x87d920, 0x1, 0x2e, 0x1) runtime/mheap.go:907 +0x64 fp=0x7fd8e36750 sp=0x7fd8e36700 pc=0x36bd4 runtime.(mcentral).grow(0x88fde8) runtime/mcentral.go:241 +0x74 fp=0x7fd8e367a0 sp=0x7fd8e36750 pc=0x27074 runtime.(mcentral).cacheSpan(0x88fde8) runtime/mcentral.go:161 +0x954 fp=0x7fd8e36830 sp=0x7fd8e367a0 pc=0x26e84 runtime.(mcache).refill(0x7fb1069108, 0x2e) runtime/mcache.go:162 +0xc0 fp=0x7fd8e36890 sp=0x7fd8e36830 pc=0x25ba0 runtime.(mcache).nextFree(0x7fb1069108, 0x2e) runtime/malloc.go:880 +0x94 fp=0x7fd8e368e0 sp=0x7fd8e36890 pc=0x1bd04 runtime.mallocgc(0x188, 0x4bd1e0, 0x1) runtime/malloc.go:1071 +0x4c0 fp=0x7fd8e36970 sp=0x7fd8e368e0 pc=0x1c360 runtime.newobject(0x4bd1e0) runtime/malloc.go:1228 +0x38 fp=0x7fd8e369a0 sp=0x7fd8e36970 pc=0x1c8b8 runtime.malg(0x8000) runtime/proc.go:4220 +0x2c fp=0x7fd8e369f0 sp=0x7fd8e369a0 pc=0x514fc runtime.mpreinit(0x864ba0) runtime/os_linux.go:355 +0x28 fp=0x7fd8e36a10 sp=0x7fd8e369f0 pc=0x41a48 runtime.mcommoninit(0x864ba0, 0xffffffffffffffff) runtime/proc.go:803 +0x118 fp=0x7fd8e36a60 sp=0x7fd8e36a10 pc=0x49588 runtime.schedinit() runtime/proc.go:691 +0x94 fp=0x7fd8e36ac0 sp=0x7fd8e36a60 pc=0x49074 runtime.rt0_go() runtime/asm_arm64.s:86 +0xa8 fp=0x7fd8e36af0 sp=0x7fd8e36ac0 pc=0x75478 fatal error: runtime: out of memory

runtime stack: runtime.throw({0x4c70f7, 0x16}) runtime/panic.go:1198 +0x54 fp=0x7fe6ec00c0 sp=0x7fe6ec0090 pc=0x45444 runtime.sysMap(0x4000000000, 0x400000, 0x898770) runtime/mem_linux.go:169 +0xbc fp=0x7fe6ec0100 sp=0x7fe6ec00c0 pc=0x279dc runtime.(mheap).grow(0x87d920, 0x1) runtime/mheap.go:1393 +0x2e8 fp=0x7fe6ec0180 sp=0x7fe6ec0100 pc=0x37b28 runtime.(mheap).allocSpan(0x87d920, 0x1, 0x0, 0x2e) runtime/mheap.go:1179 +0x188 fp=0x7fe6ec0200 sp=0x7fe6ec0180 pc=0x37248 runtime.(mheap).alloc.func1() runtime/mheap.go:913 +0x88 fp=0x7fe6ec0250 sp=0x7fe6ec0200 pc=0x36ce8 runtime.(mheap).alloc(0x87d920, 0x1, 0x2e, 0x1) runtime/mheap.go:907 +0x64 fp=0x7fe6ec02a0 sp=0x7fe6ec0250 pc=0x36bd4 runtime.(mcentral).grow(0x88fde8) runtime/mcentral.go:241 +0x74 fp=0x7fe6ec02f0 sp=0x7fe6ec02a0 pc=0x27074 runtime.(mcentral).cacheSpan(0x88fde8) runtime/mcentral.go:161 +0x954 fp=0x7fe6ec0380 sp=0x7fe6ec02f0 pc=0x26e84 runtime.(mcache).refill(0x7fa3fdf108, 0x2e) runtime/mcache.go:162 +0xc0 fp=0x7fe6ec03e0 sp=0x7fe6ec0380 pc=0x25ba0 runtime.(mcache).nextFree(0x7fa3fdf108, 0x2e) runtime/malloc.go:880 +0x94 fp=0x7fe6ec0430 sp=0x7fe6ec03e0 pc=0x1bd04 runtime.mallocgc(0x188, 0x4bd1e0, 0x1) runtime/malloc.go:1071 +0x4c0 fp=0x7fe6ec04c0 sp=0x7fe6ec0430 pc=0x1c360 runtime.newobject(0x4bd1e0) runtime/malloc.go:1228 +0x38 fp=0x7fe6ec04f0 sp=0x7fe6ec04c0 pc=0x1c8b8 runtime.malg(0x8000) runtime/proc.go:4220 +0x2c fp=0x7fe6ec0540 sp=0x7fe6ec04f0 pc=0x514fc runtime.mpreinit(0x864ba0) runtime/os_linux.go:355 +0x28 fp=0x7fe6ec0560 sp=0x7fe6ec0540 pc=0x41a48 runtime.mcommoninit(0x864ba0, 0xffffffffffffffff) runtime/proc.go:803 +0x118 fp=0x7fe6ec05b0 sp=0x7fe6ec0560 pc=0x49588 runtime.schedinit() runtime/proc.go:691 +0x94 fp=0x7fe6ec0610 sp=0x7fe6ec05b0 pc=0x49074 runtime.rt0_go() runtime/asm_arm64.s:86 +0xa8 fp=0x7fe6ec0640 sp=0x7fe6ec0610 pc=0x75478

pscj commented 1 year ago

同样是ac86u,启动报out of memory

juewuy commented 1 year ago

内存不足尝试使用官方原版内核 使用简化版规则 如果还不行,那就没办法了

pscj commented 1 year ago

感谢 我还是换个设备试试 内存不足是硬伤