You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在保留原流量路径的前提下复制家用闭源电能表的HTTPS出站流量至本地Linux服务器并通过自定义服务处理

如何在保留原流量路径的前提下复制家用闭源电能表的HTTPS出站流量至本地Linux服务器并通过自定义服务处理

兄弟,我完全懂你的处境——花了钱的设备依赖快挂掉的云服务,还关乎关键水泵的监控,必须得自己动手救回来。结合你手里的ZyXEL防火墙、管理交换机,还有开发者背景,咱们一步步来解决这个问题:

第一步:实现流量镜像(不干扰原路径)

要保留原流量到厂商云的路径,**端口镜像(Port Mirroring)**是最稳妥的方案——它会把电能表的出站流量复制一份发到你的Linux服务器,完全不影响原通信。

方案1:用管理交换机做端口镜像(推荐)

如果电能表直接连在管理交换机上,操作最简单:

  • 登录交换机的Web管理界面或SSH CLI
  • 找到「端口镜像」(部分设备叫Mirroring/Span)配置项
  • 设置源端口:选择电能表连接的交换机端口,指定镜像它的出站流量(Egress)(如果需要看厂商的响应,也可以选双向流量)
  • 设置目的端口:选择Linux服务器连接的交换机端口,建议这个端口只用来做镜像,不要接其他设备避免干扰
  • 保存配置后,交换机就会自动把电能表的流量复制一份发到Linux服务器了

方案2:用ZyXEL USG防火墙做流量镜像

如果电能表通过防火墙转发流量,也可以用防火墙的镜像功能:

  • 登录USG管理界面,找到「流量镜像/镜像会话」相关选项
  • 创建镜像规则:指定源为电能表的IP地址,协议选HTTPS(443端口),方向为出站
  • 把镜像目标设为Linux服务器的IP,或直接指定防火墙连接Linux的端口作为镜像输出口
  • 注意:部分防火墙需要开启目标端口的混杂模式,确保不拦截镜像流量

第二步:在Linux服务器上接收并捕获镜像流量

镜像过来的是原始以太网帧,需要先把Linux网卡设为混杂模式才能接收:

# 临时开启混杂模式(重启网卡后失效)
sudo ip link set eth0 promisc on

# 永久开启(以Ubuntu为例,其他发行版配置路径略有不同)
sudo nano /etc/netplan/00-installer-config.yaml
# 在对应网卡配置下添加:promisc: true
sudo netplan apply

接下来用工具捕获流量,推荐两个选项:

  • tcpdump:适合后台运行或导出流量文件:
    # 捕获来自电能表IP(示例:192.168.1.100)的443端口流量,保存到文件
    sudo tcpdump -i eth0 host 192.168.1.100 and port 443 -w meter_traffic.pcap
    
  • Wireshark:图形界面工具,适合实时分析流量,方便你先观察电能表的HTTPS请求格式(比如目标域名、请求头规律)

第三步:解密HTTPS流量(最棘手的部分)

镜像过来的HTTPS流量是加密的,直接看是乱码,这里有两个可行思路:

思路1:中间人代理(MITM)配合流量转发

这个方法需要让电能表的流量先经过你的Linux代理,同时保留原路径到厂商云(后期也可以替换成你的服务):

  1. 在Linux上搭建MITM代理,比如mitmproxy
    # 安装mitmproxy
    sudo apt install mitmproxy
    # 启动透明模式代理,监听8080端口
    sudo mitmproxy --mode transparent --listen-port 8080
    
  2. 通过防火墙/交换机的策略路由,把电能表的443端口流量转发到Linux的8080端口(这一步会临时改变流量路径,但代理会把请求转发到原厂商服务器,不中断原通信)
  3. 导出mitmproxy的CA证书,安装到电能表的信任列表(这是关键!如果闭源设备不允许添加自定义CA,这个方法就用不了)
  4. 完成后mitmproxy就能解密HTTPS流量,你可以实时查看请求内容,甚至用它的Python API编写脚本解析数据、监控异常

思路2:分析加密流量的行为特征(无需解密)

如果电能表不支持添加自定义CA,那可以通过分析流量特征来监控异常:

  • 先观察正常情况下电能表的HTTPS请求频率、数据包大小、请求间隔
  • 用Python结合scapy库编写脚本,实时捕获流量并统计这些特征
  • 当出现异常(比如长时间无请求、数据包大小突变)时,触发告警(邮件、短信通知你水泵可能出问题)
  • 这个方法拿不到具体能耗数据,但能满足你监控关键设备异常的核心需求

第四步:自定义服务处理数据

一旦你能拿到解密后的请求或能分析流量特征,就可以搭建自定义服务了:

  • 如果用mitmproxy,直接写Python脚本集成进去,解析请求里的能耗数据,存储到本地数据库(比如SQLite、InfluxDB),同时设置阈值告警(比如水泵能耗突然飙升或降为0)
  • 如果用流量特征分析,用scapytcpdump结合Python脚本实时监控,异常时触发通知
  • 后期厂商云彻底失效后,你可以修改策略路由,让电能表直接把请求发到你的自定义服务,完全替代原云服务(前提是你已经解析清楚了请求格式和参数)

备注:内容来源于stack exchange,提问作者develox

火山引擎 最新活动