Closed akira304moto closed 8 months ago
我和你一样,一直有这个情况,我也是 R2S,做的主路由,固件基本都试过,包括原版的 OpenWrt,经过我多次待机测试:
测试设备:iPhone 13 Pro、iPhone XR、iPad Air 4
所以目前只能用的 ShellClash:Redir-host 模式才能正常
这会是什么问题?神奇,cy一下
很好奇,关注一下。
删除 Ad 规则
不要发布无意义的回复,大家有同样情况的可以将自己的网络环境阐述一下,方便找出问题
X86也遇到了同样的问题,我今天测试了删除苹果相关规则(之前用的ACL4的苹果规则,规则比较简单没有blackmatrix7全面,且为直连),让苹果走Final(final是走代理),耗电情况应该是正常了。模式为:redir-host,有时间再测试一下fake-ip。
我没有使用过passwall,想问一下你测试的passwall耗电情况细节问题。passwall设置的是什么分流规则,gfw列表还是绕过中国大陆IP?passwall有无设置苹果规则?如有设置,苹果连接走直连还是代理?
X86也遇到了同样的问题,我今天测试了删除苹果相关规则(之前用的ACL4的苹果规则,规则比较简单没有blackmatrix7全面,且为直连),让苹果走Final(final是走代理),耗电情况应该是正常了。模式为:redir-host,有时间再测试一下fake-ip。
你是只把里面 Apple-proxy.list 走代理了。还是整个 Apple.list 全走代理了,
@Franky18
... 让苹果走Final(final是走代理),耗电情况应该是正常了 ...
这两天调mosdns发现个情况,可能跟这个issue相关联。就是32-courier.push.apple.com这类推送相关的长链接域名,DNS拿到的中国IP也会被geoip库识别为非CN IP(geoip用的是Loyalsoldier的)。
这个现象导致的结果是,在Clash的dns机制中,用nameserver组获取的国内IP会被GEO IP识别为非CN,所以抛弃,进而使用fallback获取到位于国外的IP。然后clash策略组大概率会把apple走国内,也就把非CN IP走国内,可能会影响iOS的业务。如果让apple走了final,也就是非CN IP走了final,可能歪打正着解决了这个问题。。
以上只是描述下GEO IP这个坑,不一定是这个issue的成因。
@Franky18
... 让苹果走Final(final是走代理),耗电情况应该是正常了 ...
这两天调mosdns发现个情况,可能跟这个issue相关联。就是32-courier.push.apple.com这类推送相关的长链接域名,DNS拿到的中国IP也会被geoip库识别为非CN IP(geoip用的是Loyalsoldier的)。
这个现象导致的结果是,在Clash的dns机制中,用nameserver组获取的国内IP会被GEO IP识别为非CN,所以抛弃,进而使用fallback获取到位于国外的IP。然后clash策略组大概率会把apple走国内,也就把非CN IP走国内,可能会影响iOS的业务。如果让apple走了final,也就是非CN IP走了final,可能歪打正着解决了这个问题。。
以上只是描述下GEO IP这个坑,不一定是这个issue的成因。
我尝试使用blackmatrix7的更为全面的规则,且并未使用fall-back dns查询功能,观察苹果链接。看起来所有苹果域名以及ip链接都被规则捕获并直连。如果所有苹果链接都被规则捕获,理论上不应存在被geo ip误判的情况,但依然有耗电增加的问题。
X86也遇到了同样的问题,我今天测试了删除苹果相关规则(之前用的ACL4的苹果规则,规则比较简单没有blackmatrix7全面,且为直连),让苹果走Final(final是走代理),耗电情况应该是正常了。模式为:redir-host,有时间再测试一下fake-ip。
你是只把里面 Apple-proxy.list 走代理了。还是整个 Apple.list 全走代理了,
直接删除苹果相关所有规则,苹果的域名链接让clash查询dns,用ip判断是走geo ip cn(直连)还是final(代理),苹果的ip链接也是如此。
可以试试让所有会保持长连接的地址绕过内核,我的小米手机也出现了待机耗电异常的情况,发现待机时持续未知原因的唤醒,再将Google FCM和小米push绕过内核后,情况立刻消失
可以试试让所有会保持长连接的地址绕过内核,我的小米手机也出现了待机耗电异常的情况,发现待机时持续未知原因的唤醒,再将Google FCM和小米push绕过内核后,情况立刻消失
@LovelyToaster 请问mipush绕过内核走的是IP白名单吗? 网上没找到mipush的ip段,可否提供下?
update: 好像不需要,直接所有china ip都绕内核就好了;只有apple和fcm的国外ip段需要单独处理
可以试试让所有会保持长连接的地址绕过内核,我的小米手机也出现了待机耗电异常的情况,发现待机时持续未知原因的唤醒,再将Google FCM和小米push绕过内核后,情况立刻消失
@LovelyToaster 请问mipush绕过内核走的是IP白名单吗? 网上没找到mipush的ip段,可否提供下?
update: 好像不需要,直接所有china ip都绕内核就好了;只有apple和fcm的国外ip段需要单独处理
确实,我是直接china ip都绕过内核,然后fcm单独处理
可以试试让所有会保持长连接的地址绕过内核,我的小米手机也出现了待机耗电异常的情况,发现待机时持续未知原因的唤醒,再将Google FCM和小米push绕过内核后,情况立刻消失
@LovelyToaster 请问mipush绕过内核走的是IP白名单吗? 网上没找到mipush的ip段,可否提供下?
update: 好像不需要,直接所有china ip都绕内核就好了;只有apple和fcm的国外ip段需要单独处理
其实好像是只要走内核的连接都会造成我的手机唤醒耗电,我把mipush和FCM绕过内核让情况消失的前提是我对于手机的大部分应用回到后台后链接会被关闭,而且中国ip段绕过内核
其实好像是只要走内核的连接都会造成我的手机唤醒耗电,我把mipush和FCM绕过内核让情况消失的前提是我对于手机的大部分应用回到后台后链接会被关闭,而且中国ip段绕过内核
刚才发现了这个issue:https://github.com/v2ray/v2ray-core/issues/2564 测试了一下,走clash内核(direct)的长连接,每15秒都有个keep-alive包从clash内核发到客户端:
17:43:56.475915 IP localhost.7890 > localhost.56426: Flags [.], ack 1, win 512, options [nop,nop,TS val 3880779461 ecr 3880764357], length 0
17:43:56.475948 IP localhost.56426 > localhost.7890: Flags [.], ack 1, win 512, options [nop,nop,TS val 3880779462 ecr 3880734189], length 0
17:44:11.579883 IP localhost.7890 > localhost.56426: Flags [.], ack 1, win 512, options [nop,nop,TS val 3880794565 ecr 3880779462], length 0
17:44:11.579915 IP localhost.56426 > localhost.7890: Flags [.], ack 1, win 512, options [nop,nop,TS val 3880794565 ecr 3880734189], length 0
结合你的现象,猜测应该是golang的这个15秒interval的问题(clash内核也是go写的);至于是不是本issue的成因,还需要再测测。(如果是,可能也不是这个repo能解决的了)
关联一个clash的issue:https://github.com/Dreamacro/clash/issues/996
关联一个clash的issue:https://github.com/Dreamacro/clash/issues/996
按照这个issue 我自编译了一个内核,发现唤醒确实恢复正常了,耗电情况时间太短不确定
@Franky18
... 让苹果走Final(final是走代理),耗电情况应该是正常了 ...
这两天调mosdns发现个情况,可能跟这个issue相关联。就是32-courier.push.apple.com这类推送相关的长链接域名,DNS拿到的中国IP也会被geoip库识别为非CN IP(geoip用的是Loyalsoldier的)。
这个现象导致的结果是,在Clash的dns机制中,用nameserver组获取的国内IP会被GEO IP识别为非CN,所以抛弃,进而使用fallback获取到位于国外的IP。然后clash策略组大概率会把apple走国内,也就把非CN IP走国内,可能会影响iOS的业务。如果让apple走了final,也就是非CN IP走了final,可能歪打正着解决了这个问题。。
以上只是描述下GEO IP这个坑,不一定是这个issue的成因。
关注下,我也是Redir-host模式下把apple相关域名设置直连之后,包括32-courier.push.apple.com,apple-dns.net之类的,晚上待机耗电加快
更换GEOIP能否解决?另外苹果商店的软件下载明显变慢,比不用软路由慢的多
X86也遇到了同样的问题,我今天测试了删除苹果相关规则(之前用的ACL4的苹果规则,规则比较简单没有blackmatrix7全面,且为直连),让苹果走Final(final是走代理),耗电情况应该是正常了。模式为:redir-host,有时间再测试一下fake-ip。
我也是订阅转换用的ACL4的,然后切换mate模式在规则集与策略组管理里加上的blackmatrix7的,应该是这样操作的吧?
我给clash加长了keep-alive心跳间隔时长(默认是15s),并经过吃灰iPad一个多月的待机验证,观测到待机耗电确实是在减少了。至少对我来说clash的续航问题应该是这个issue导致的。
我的解决方案是在Clash.Meta上简单修改了一下keep-alive的心跳间隔:https://github.com/cubarco/Clash.Meta/commit/e5a0e6c0abc755391ee25f83cd4604715b96b4d5 。有异常耗电问题的朋友可以尝试下,release里面有预编译的binary。
我给clash加长了keep-alive心跳间隔时长(默认是15s),并经过吃灰iPad一个多月的待机验证,观测到待机耗电确实是在减少了。至少对我来说clash的续航问题应该是这个issue导致的。
我的解决方案是在Clash.Meta上简单修改了一下keep-alive的心跳间隔:cubarco/Clash.Meta@e5a0e6c 。有异常耗电问题的朋友可以尝试下,release里面有预编译的binary。
感谢大佬!我不严谨的测试了几天,耗电情况确实有改善。赞!
This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 5 days
up
我也遇到了类似的问题,我手机使用passwall 时待机基本走横线,不掉电,或者很少的电,使用open clash 后,晚上7个小时基本掉电20%+,其他用着很舒服,这点是真难受😁
更换GEOIP能否解决?另外苹果商店的软件下载明显变慢,比不用软路由慢的多
我也有这个问题,苹果商店时快时慢,大部分时间只能稳定在2M,偶尔满速,好像跟版本也有关系,最近的版本有这个问题,以前没有,同时三星商店没这个问题
可以试试让所有会保持长连接的地址绕过内核,我的小米手机也出现了待机耗电异常的情况,发现待机时持续未知原因的唤醒,再将Google FCM和小米push绕过内核后,情况立刻消失
@LovelyToaster 请问mipush绕过内核走的是IP白名单吗? 网上没找到mipush的ip段,可否提供下? update: 好像不需要,直接所有china ip都绕内核就好了;只有apple和fcm的国外ip段需要单独处理
确实,我是直接china ip都绕过内核,然后fcm单独处理
可以问下你的fcm的IP列表从哪找的吗?
可以试试让所有会保持长连接的地址绕过内核,我的小米手机也出现了待机耗电异常的情况,发现待机时持续未知原因的唤醒,再将Google FCM和小米push绕过内核后,情况立刻消失
@LovelyToaster 请问mipush绕过内核走的是IP白名单吗? 网上没找到mipush的ip段,可否提供下? update: 好像不需要,直接所有china ip都绕内核就好了;只有apple和fcm的国外ip段需要单独处理
确实,我是直接china ip都绕过内核,然后fcm单独处理
可以问下你的fcm的IP列表从哪找的吗?
ACL4SSR的库里面,不过也可以直接屏蔽5228这个端口号
如何屏蔽端口号,老哥可以大概说一下吗,谢谢
是指这个吗?
如何屏蔽端口号,老哥可以大概说一下吗,谢谢
是指这个吗?
是的 绕过5228即可
如何屏蔽端口号,老哥可以大概说一下吗,谢谢 是指这个吗?
是的 绕过5228即可
在这里添加了Apple APN的5223,应用后查看使用5223的连接还是会经过内核,不知道为何没有生效?
刚才发现了这个issue:v2ray/v2ray-core#2564 测试了一下,走clash内核(direct)的长连接,每15秒都有个keep-alive包从clash内核发到客户端: ...
结合你的现象,猜测应该是golang的这个15秒interval的问题(clash内核也是go写的);至于是不是本issue的成因,还需要再测测。(如果是,可能也不是这个repo能解决的了)
你好,我想请问下如何重现这个 15s 间隔的 keep alive 包?
我试了好几次,发现长连接保持非活跃状态时,clash meta 内核会每隔 30s 分别向客户端和服务端发送 keep alive 包,对应于这里的代码:
func tcpKeepAlive(c net.Conn) {
if tcp, ok := c.(*net.TCPConn); ok {
_ = tcp.SetKeepAlive(true)
_ = tcp.SetKeepAlivePeriod(30 * time.Second)
}
}
clash config 很简单,只有 mixed-port: 7890
一行,重现步骤是本地首先通过 nc
监听 45678
端口,然后再通过 clash socks5 代理连接该端口,我这边观察到的是 30s 一次的 keep alive 包,如图所示:
这些 keep alive 包会不断唤醒手机,我想这应该就是在 Apple Push/Google FCM 等长连接经过 clash 时,手机会不断耗电的原因。不管规则判定是直连还是通过远程节点连接,只要由 clash 内核发出连接皆会如此。
你好,我想请问下如何重现这个 15s 间隔的 keep alive 包?
@silverzhaojr
hi,我看了一下你的tcpdump命令,是在尝试抓取45678,也就是clash -> remote server这一段的包。而这个issue的成因,是client -> clash这一段的长链接keepalive。所以,在你的环境里,可以尝试抓包12345端口tcp包。
不过我不确定clash的socks5会不会也有15s的keepalive包,本issue的场景是redir或者tun。如果socks5抓不到15s的keepalive,你可以尝试redir模式,然后同样是抓client -> clash这一段的包。
我又仔细研究了下,可以确定是 clash 内核会每隔 15s 发出 keep alive 包不断唤醒手机,从而导致持续耗电。重现步骤如下:
mixed-port: 7890
一行;45678
端口,模拟 Apple Push / Google FCM 服务器;
$ nc -l 45678
12345
;
$ nc -p 12345 -X 5 -x 127.0.0.1:7890 127.0.0.1 45678
12345
上的网络包,可以看到 clash 内核每隔 15s 就会发送过来一个包,这些数据包会不断唤醒手机;
$ sudo tcpdump -i lo -n port 12345
1234
的数据包 REDIRECT 至 clash redir 端口 7892
)。事实上,所有模式都是这样,因为只要启用了 golang 的 keep alive 机制,默认 interval 就是 15s;
conn.(*net.TCPConn).SetKeepAlive(true)
https://github.com/search?q=repo%3AMetaCubeX%2FClash.Meta%20SetKeepAlive&type=code
整个过程如图所示:
socks5 模式:
redir 模式:
参考这个 issue golang/go/issues/48622 ,具体原因应该如下:
Google FCM / Apple Push 在与手机建立长连接后,它通常会在一定时间内发送心跳包,以维持该连接不被 nat 丢弃掉,这个心跳间隔通常为 5min ~ 28min。
如果该连接通过 clash 接手发起(不管是直连,还是通过远程节点连接),由于 go 默认启用了 keep alive,在发现该连接持续 KEEP_IDLE (15s) 没有数据活动,它会发起一个 keep alive 包给客户端(手机):
可见,对于正常的长连接来说,每隔 KEEP_IDLE (15s) 就会有一次探测包来唤醒手机,这种情况下耗电显然可观了。
根本原因是 go 默认将 KEEP_IDLE 和 KEEP_ALIVE_INTERVAL 设为相同,且其数值太小。
事实上 KEEP_IDLE 可以设置得比较大些,比如 10min ,而 KEEP_ALIVE_INTERVAL 可以是 15s,这样极端情况下,该无效连接最多会在内核中占据内存持续 10min + 15s * 9 = 735s,然后被移除。由于这时候客户端(手机)已经离线,所以这些探测包永远不会到达手机从而也不会再唤醒手机。
目前情况下,Go 语言无法单独设置 KEEP_IDLE 和 KEEP_ALIVE_INTERVAL,只能同时设置: https://go.dev/src/net/tcpsockopt_unix.go
若将其均设为 10min,则无效连接在内存中最多会保持 10min + 10min * 9 = 100min。由于客户端离开 clash 情况比较少见,且通常只会有一两个长连接,这样时长的内存占用应该是可以接受的。
由于目前官方 Clash 团队还没有关注这个 https://github.com/Dreamacro/clash/issues/2867 ,所以我直接改了下代码,将 TCP keep alive interval 设为了 1800s。大家可以测试看下,看看是否解决了这个问题:
https://github.com/silverzhaojr/clash/releases/tag/v1.18.0-fix-tcp-keep-alive
由于目前官方 Clash 团队还没有关注这个 Dreamacro/clash#2867 ,所以我直接改了下代码,将 TCP keep alive interval 设为了 1800s。大家可以测试看下,看看是否解决了这个问题:
https://github.com/silverzhaojr/clash/releases/tag/v1.18.0-fix-tcp-keep-alive
@silverzhaojr 你可以在这个issue里面网上翻翻,这个方案我已经提过:https://github.com/cubarco/Clash.Meta/commit/e5a0e6c0abc755391ee25f83cd4604715b96b4d5 ,而且验证是有效的。
@silverzhaojr 你可以在这个issue里面网上翻翻,这个方案我已经提过:cubarco/Clash.Meta@e5a0e6c ,而且验证是有效的。
我就是看了你这个代码做的改动🤣。这里主要是基于 Clash 的最新版本编译了下带有修复的代码,方便其他遇到这个问题的人暂时用着。
由于目前官方 Clash 团队还没有关注这个 Dreamacro/clash#2867 ,所以我直接改了下代码,将 TCP keep alive interval 设为了 1800s。大家可以测试看下,看看是否解决了这个问题: https://github.com/silverzhaojr/clash/releases/tag/v1.18.0-fix-tcp-keep-alive
@silverzhaojr 你可以在这个issue里面网上翻翻,这个方案我已经提过:cubarco/Clash.Meta@e5a0e6c ,而且验证是有效的。
@cubarco 能否给 meta 提个 pull request 修复一下
由于目前官方 Clash 团队还没有关注这个 Dreamacro/clash#2867 ,所以我直接改了下代码,将 TCP keep alive interval 设为了 1800s。大家可以测试看下,看看是否解决了这个问题: https://github.com/silverzhaojr/clash/releases/tag/v1.18.0-fix-tcp-keep-alive
@silverzhaojr 你可以在这个issue里面网上翻翻,这个方案我已经提过:cubarco/Clash.Meta@e5a0e6c ,而且验证是有效的。
@cubarco 能否给 meta 提个 pull request 修复一下
提高keep alive时间好像会导致部分连接不会断开,我改成3600后连接数经常200+,而且可以看见有很多相同连接存在几个小时,即使发出连接的设备已经关机,连接依旧存在
提高keep alive时间好像会导致部分连接不会断开,我改成3600后连接数经常200+,而且可以看见有很多相同连接存在几个小时,即使发出连接的设备已经关机,连接依旧存在
这个是预期的行为,上面有解释:https://github.com/vernesong/OpenClash/issues/2614#issuecomment-1665241053 。改成 30min 后,无效连接最多会存在 30min + 30min * 9 = 5hr。
最佳做法是等 Go 语言支持分开设置 KEEP_IDLE, KEEP_ALIVE_INTERVAL,KEEP_COUNT。
由于目前官方 Clash 团队还没有关注这个 Dreamacro/clash#2867 ,所以我直接改了下代码,将 TCP keep alive interval 设为了 1800s。大家可以测试看下,看看是否解决了这个问题:
https://github.com/silverzhaojr/clash/releases/tag/v1.18.0-fix-tcp-keep-alive
大佬能不能给一个meta版本的tun模式的内核编译成品呢
提高keep alive时间好像会导致部分连接不会断开,我改成3600后连接数经常200+,而且可以看见有很多相同连接存在几个小时,即使发出连接的设备已经关机,连接依旧存在
这个是预期的行为,上面有解释:#2614 (comment) 。改成 30min 后,无效连接最多会存在 30min + 30min * 9 = 5hr。
最佳做法是等 Go 语言支持分开设置 KEEP_IDLE, KEEP_ALIVE_INTERVAL,KEEP_COUNT。
https://github.com/MetaCubeX/Clash.Meta/issues/715#issuecomment-1707527012
貌似meta内核有大佬添加了配置,但是我不会配置。
貌似meta内核有大佬添加了配置,但是我不会配置。
根据这里的改动,应该是在 clash meta config.yaml 配置文件中增加一行:
# TCP keep alive interval,默认是 15s
keep-alive-interval: 15
将15
改成1800
,你可以试下是否生效。
注意要用这里的 alpha 版本:https://github.com/MetaCubeX/Clash.Meta/releases/tag/Prerelease-Alpha
在openclash中如何设置呢。
最新版的内核还没有修复这个问题吗?
最新版的内核还没有修复这个问题吗?
最新的alpha已经可以正常配置tcpalive时间了
我的iPhone和iPad一样的现象,连家里的Wi-Fi待机比蜂窝待机还要耗电多了。把OpenClash关掉,待机就正常了。。。 我用最新的OpenClash和最新的Meta内核,在配置文件里添加keep-alive-interval: 1800,也没有任何效果。
现在的临时解决方案:在OpenClash的黑白名单里添加了iPhone和iPad,不让它们走OpenClash了,它们出国用小火箭app代替。。。
这个问题OpenClash什么时候能给予解决啊
我的iPhone和iPad一样的现象,连家里的Wi-Fi待机比蜂窝待机还要耗电多了。把OpenClash关掉,待机就正常了。。。 我用最新的OpenClash和最新的Meta内核,在配置文件里添加keep-alive-interval: 1800,也没有任何效果。
现在的临时解决方案:在OpenClash的黑白名单里添加了iPhone和iPad,不让它们走OpenClash了,它们出国用小火箭app代替。。。
这个问题OpenClash什么时候能给予解决啊
我测试了下,openclash 0.4.151-beta里已经有相关选项可以调整tcp keep-alive 间隔了
Verify Steps
OpenClash Version
v0.45.47-beta
Bug on Environment
Official OpenWrt
Bug on Platform
Linux-armv8
To Reproduce
只需查看iPhone电量消耗即可
Describe the Bug
R2S 作为旁路由,由 TP-LINK 主路由的 DHCP 为连接的设备下发网关/DNS 指向它。官方 openwrt 22.03-rc5 固件,运行 openclash 会导致 iPhone 待机时耗电急剧增加。
尝试切换 redir-host/fake-ip 模式、开关旁路由模式、开关 DNS 劫持、切换 meta/TUN 核等操作,均未改变耗电增加的情况。
查看 iOS 设置中的“App 隐私报告”,待机时段没有异常连接。使用 AdGuard Home 记录,待机时应只连接过 iCloud 和推送通知服务器,无异常情况。
而关闭 openclash 后,使用 passwall 或直连,待机耗电均恢复正常水平。排除路由器 Wi-Fi 设置原因。
另外试过关闭 openclash 后,在手机本机运行 shadowrocket 和 stash,耗电只比正常多一点,远达不到 openclash 的情况,因此排除 clash 的原因。
OpenClash Log
OpenClash 调试日志
生成时间: 2022-08-08 08:20:59 插件版本: v0.45.47-beta 隐私提示: 上传此日志前请注意检查、屏蔽公网IP、节点、密码等相关敏感信息
OpenClash Config
No response
Expected Behavior
待机耗电恢复正常水平
Screenshots
以下测试在一台 iPhone 7 上进行:全程除查看电量外不操作手机,因此 App 电池用量处仅显示“设置”,用量几分钟。
可见使用 PassWall 时待机电量消耗正常;在其他设备操作关闭 PassWall 并开启 OpenClash,会立即影响到手机耗电。
一直开启 OpenClash,电量消耗严重。
关闭 OpenClash,手机本机运行 Stash,电量消耗正常。