如何在保留原流量路径的前提下复制家用闭源电能表的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代理,同时保留原路径到厂商云(后期也可以替换成你的服务):
- 在Linux上搭建MITM代理,比如
mitmproxy:# 安装mitmproxy sudo apt install mitmproxy # 启动透明模式代理,监听8080端口 sudo mitmproxy --mode transparent --listen-port 8080 - 通过防火墙/交换机的策略路由,把电能表的443端口流量转发到Linux的8080端口(这一步会临时改变流量路径,但代理会把请求转发到原厂商服务器,不中断原通信)
- 导出mitmproxy的CA证书,安装到电能表的信任列表(这是关键!如果闭源设备不允许添加自定义CA,这个方法就用不了)
- 完成后mitmproxy就能解密HTTPS流量,你可以实时查看请求内容,甚至用它的Python API编写脚本解析数据、监控异常
思路2:分析加密流量的行为特征(无需解密)
如果电能表不支持添加自定义CA,那可以通过分析流量特征来监控异常:
- 先观察正常情况下电能表的HTTPS请求频率、数据包大小、请求间隔
- 用Python结合
scapy库编写脚本,实时捕获流量并统计这些特征 - 当出现异常(比如长时间无请求、数据包大小突变)时,触发告警(邮件、短信通知你水泵可能出问题)
- 这个方法拿不到具体能耗数据,但能满足你监控关键设备异常的核心需求
第四步:自定义服务处理数据
一旦你能拿到解密后的请求或能分析流量特征,就可以搭建自定义服务了:
- 如果用mitmproxy,直接写Python脚本集成进去,解析请求里的能耗数据,存储到本地数据库(比如SQLite、InfluxDB),同时设置阈值告警(比如水泵能耗突然飙升或降为0)
- 如果用流量特征分析,用
scapy或tcpdump结合Python脚本实时监控,异常时触发通知 - 后期厂商云彻底失效后,你可以修改策略路由,让电能表直接把请求发到你的自定义服务,完全替代原云服务(前提是你已经解析清楚了请求格式和参数)
备注:内容来源于stack exchange,提问作者develox




