鸿蒙OS VPN冲突与iptables规则冲突

应用冲突 / 1人浏览

凌晨三点的矿机,突然掉线了

老周把咖啡杯重重砸在桌上,屏幕上的曲线像心电图一样骤停——三台蚂蚁矿机的算力曲线,在凌晨三点零七分同时跌成了一条直线。他首先想到的是矿池问题,但刷新后台,发现所有矿机的网络连接显示为“已断开”。更诡异的是,手机上的鸿蒙OS设备明明连着同一个WiFi,却显示网络正常。他抓起Mate 60 Pro,打开终端模拟器,输入ping 192.168.1.1——延迟正常。但当他尝试SSH连接矿机时,连接被秒拒。

“这他妈是见鬼了?”老周是圈内小有名气的“矿场电工”,专门负责维护那些藏在集装箱里的显卡矿机。他很快意识到,问题不在矿机,而在手机——准确说,是鸿蒙OS自带的“网络加速”功能。这个功能默认开启,会自动检测网络质量,并在检测到“异常”时,尝试通过VPN链路重新路由流量。而老周的矿机管理网络,恰好跑在一条OpenVPN隧道上,用于跨机房调度。

鸿蒙的“智能”与矿机的“固执”

鸿蒙OS的VPN模块设计得极其“聪明”——它会同时维护多条路由表,并在应用层做流量感知。当老周打开矿池管理App时,鸿蒙检测到该App的流量特征与“视频流媒体”相似(因为矿池API返回的JSON数据包很大,且包含大量长连接),于是自动将这条流量切到了VPN隧道。但问题是,矿机的SSH管理端口(22)和矿池的API端口(8080)在VPN隧道内是可达的,而鸿蒙的“智能分流”却把流量分到了物理网卡——因为它认为VPN隧道“延迟过高”。

结果就是:矿机管理App在鸿蒙上看到的IP是VPN内网IP,但实际发出的数据包却走了物理网卡,导致源地址不匹配,矿机直接丢弃了所有来自“未知IP”的请求。老周尝试在鸿蒙的“VPN设置”里关闭“智能分流”,但发现这个选项在开启“网络加速”后是灰色的——系统强制接管了路由决策。

他改用电脑去SSH矿机,发现一切正常。问题确认:鸿蒙OS的VPN策略与矿机的iptables规则发生了冲突。矿机的防火墙规则只允许来自VPN网段(10.8.0.0/24)的SSH连接,而鸿蒙的流量被错误地标记为“物理网卡来源”,自然被拒之门外。

iptables的“一刀切”与鸿蒙的“动态路由”

矿机上的iptables规则是老周两个月前配置的,当时为了防DDoS攻击,他写了一条极其严格的INPUT链:

-A INPUT -s 10.8.0.0/24 -p tcp --dport 22 -j ACCEPT -A INPUT -p tcp --dport 22 -j DROP

这条规则的意思是:只允许来自VPN内网的SSH连接,其他来源一律丢弃。这在传统Linux环境下没问题,因为所有管理流量都会通过OpenVPN隧道进入。但鸿蒙OS的“动态路由”功能打破了这一假设——它会在检测到WiFi信号弱时,自动将VPN流量切换到蜂窝数据,而切换的瞬间,数据包的源IP会从10.8.0.x变成运营商分配的公共IP(如100.64.0.x)。

更糟的是,鸿蒙的“VPN加速”会在切换后主动重发之前未确认的TCP包。这些重发包的源IP已经是公共IP,而矿机的iptables规则直接将其丢弃。老周在矿机上用tcpdump抓包,看到了一连串的SYN包,源地址是100.64.5.23,目标端口是22,全部被DROP。

“这鸿蒙简直是在搞网络爆破。”老周骂了一句,但他知道,这不仅仅是鸿蒙的锅。他的iptables规则确实太粗暴了——没有考虑“连接跟踪”状态,也没有为“已建立的连接”放行。正确的做法应该是:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -s 10.8.0.0/24 -p tcp --dport 22 -j ACCEPT -A INPUT -p tcp --dport 22 -j DROP

但老周不想改矿机上的规则,因为矿机数量太多,而且每台矿机的系统环境不同,有些跑的是定制版Linux,有些是Windows。他决定从鸿蒙侧入手——但鸿蒙的VPN设置里,根本没有“禁用动态路由”的选项。

虚拟币矿场里的“系统级战争”

老周的矿场里,除了矿机,还有十几台用于监控的鸿蒙设备(包括几台平板和手机)。这些设备都安装了官方的“矿池监控”App,用于实时查看算力和温度。但在鸿蒙OS的“多设备协同”功能下,这些设备会自动组成一个“超级终端”,共享网络资源。

问题就出在这里:当一台鸿蒙手机通过VPN连接矿机时,另一台鸿蒙平板如果也在同一WiFi下,系统会自动将平板的VPN流量“借道”给手机,以实现所谓的“网络加速”。但这种加速是无状态的——它不维护VPN隧道的连接状态,只是简单地把数据包从平板的物理网卡转发出去。结果,矿机的iptables看到的源IP是平板的IP,而不是VPN内网IP,直接拒绝。

老周尝试在鸿蒙的“超级终端”里断开平板,但发现平板上的“矿池监控”App会自动触发“VPN重连”,导致手机上的VPN隧道也被迫重建。每次重建,矿机的iptables连接跟踪表都会产生大量未完成条目,最终导致nf_conntrack表溢出,整个矿机的网络栈崩溃。

“这他妈是系统级战争。”老周说。他不得不写了一个脚本,在每台矿机上每五分钟检查一次conntrack表的使用率,超过80%就自动重启防火墙服务。但这样做的副作用是:VPN连接会被频繁断开,矿池的API请求超时率飙升,导致部分矿机被矿池误判为“离线”,从而触发自动关机保护。

临时方案:用“虚拟IP”骗过鸿蒙

老周在矿工群里求助,一个叫“币圈老猫”的人给出了一个绝妙的方案:在鸿蒙设备上创建一个“虚拟VPN接口”,使用iptables的SNAT规则,将所有出站流量伪装成VPN内网IP。具体做法是:

  1. 在鸿蒙设备上开启“开发者模式”,并启用“USB网络共享”。
  2. 通过adb shell进入系统,创建一个tun0接口。
  3. 使用iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE将所有从物理网卡发出的流量伪装成tun0的IP。

这样一来,矿机的iptables看到的源IP就是10.8.0.x,而鸿蒙的“动态路由”依然在物理网卡上工作,但数据包经过NAT后,源地址被重写。老周在矿机上用tcpdump验证,发现SSH连接恢复正常。

但这个方法有一个致命缺陷:鸿蒙OS的“网络加速”会定期检查VPN隧道的“健康状态”,如果检测到隧道内流量与物理网卡流量不一致(比如源IP是10.8.0.x但物理网卡是192.168.1.x),就会判定隧道“异常”,自动断开VPN。老周不得不写一个守护进程,每秒向tun0接口发送一个空包,以维持隧道活性。

最终结局:放弃鸿蒙,改用专用管理终端

折腾了三天三夜,老周终于放弃了。他把所有鸿蒙设备从矿场管理网络中移除,换成了两台旧iPad和一台Windows平板。原因很简单:鸿蒙OS的“智能”设计不适合矿场这种需要精确控制网络路径的场景。矿机的iptables规则是为了安全,而鸿蒙的“动态路由”是为了用户体验,两者在本质上是对立的。

“虚拟币矿场不需要智能,只需要稳定。”老周在群里总结道。他后来写了一个详细的排障指南,专门针对“鸿蒙OS VPN冲突”问题,包括如何关闭“网络加速”、如何禁用“超级终端”的流量共享,以及如何在鸿蒙上手动配置静态路由。但指南的第一条建议,永远是:“换设备。”

而那个nf_conntrack表溢出的问题,老周最终通过在矿机上增加net.netfilter.nf_conntrack_max=131072解决了。但他也明白,这只是治标不治本——只要鸿蒙还在试图“优化”网络路径,类似的冲突就会不断发生。

凌晨四点,老周看着恢复正常的算力曲线,长舒了一口气。他决定明天去买一台华为的MateStation台式机,专门跑矿池管理工具——至少,那上面没有鸿蒙的“智能路由”。

版权声明:

作者: 最新鸿蒙OS VPN免费节点分享

链接: https://harmonyosvpn.com/app-conflict/harmonyos-vpn-conflict-iptables-rule.htm

来源: harmonyosvpn.com

文章版权归作者所有,未经允许请勿转载。

最新文章

归档

标签