V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pagxir
V2EX  ›  分享发现

谷歌 FCM 还是建议不要走直连

  •  
  •   pagxir · 244 天前 · 2153 次点击
    这是一个创建于 244 天前的主题,其中的信息可能已经有所发展或是发生改变。
    周末看了手机*#*#426#*#*的 FCM 诊断信息,心跳一直保持在 230 秒。手机是一台备用老手机,很多年了,,一般都是冲完电放一边,电池续航很差了。

    心跳一直在 230 秒感觉很费电,很影响续航。一开始以为是 wifi 网络问题,以为是 NAT 时间过短,就试着在路由器上转发一下增加一下 tcp 的 keepalive 。

    于是在路由器上执行:
    iptables -t nat -A PREROUTING -p tcp --dport 5228 -i wlan0 --to DNAT 192.168.1.1:5222
    socat TCP-LISTEN:5222,fork,reuseaddr TCP:64.233.189.188,keepcnt=3,keepidle=300,keepintvl=60
    然而半天测试下来,并没有啥用。

    从抓包看,最后的断开地方,看到手机有发送 client heart beat, 但是收不到应用层的 ACK (但是看到 TCP 的 ACK 是有的,偶尔还看到 client heart beat 后还有接收到 server heart beat )。

    初步觉得国内虽然 mtalk.google.com 没有直接阻断,但是还是有干扰,要么是靠近国内的 FCM 服务器不太稳定。

    最后,尝试在路由器上建立 ipsec 隧道,然后让连接美国的 FCM 服务器 mtalk.google.com/74.125.137.188, 然后 ipsec 是走 udp 封装,所以就一直 ping 避免 UDP 的 NAT 失效。 目前测试下来,FCM 连接 7 个小时没有断开,并且心跳已经能够从 230 升到了 770,并且感觉手机电量也不再崩的那么快了。

    所以,我觉得路由器上通过 UDP(udp2raw)转发 TCP/5228 流量应该是个不错的方案,比起直连好很多。

    至于,移动数据网络上,我测试把 mtalk.google.com 域名解释道国内的机器上,然后在国内机器通过 UDP 把 TCP/5228 转发出去,测试下来心跳时间可以稳定到 1100 秒。

    结论:不要在国内放任 FCM 直连,否则会影响续航以及推送的及时性。
    4 条回复    2023-08-28 09:20:11 +08:00
    PowerDi
        1
    PowerDi  
       243 天前
    直接开代理就行了吗
    elechi
        2
    elechi  
       243 天前
    用 4G 咋办?
    pagxir
        3
    pagxir  
    OP
       243 天前 via Android
    @elechi 我现在办法是,挂代理( ss/ray 等),然后在代理中 hook DNS ,将 mtalk.google.com 解析到国内的 VPS/挂机宝,然后在那个挂机宝/VPS 上作中转( UDP/udp2raw )处理。也就是 mtalk.google.com 既不走代理也不走直连,而是单独中转。
    pagxir
        4
    pagxir  
    OP
       243 天前 via Android
    @PowerDi 可能 TCP 承载的代理不会很稳定,可以在路由器上用 gost 走 quic/kcp 类的承载转发一下。如果确认 TCP 承载是稳定的直接走代理也可以。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   882 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:52 · PVG 05:52 · LAX 14:52 · JFK 17:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.