家里的网络在往哪儿跑,我做了块大屏看着
家里有多少台设备在联网?它们在跟谁说话?哪些流量出了国?
路由器后台能告诉你「谁用了多少流量」,但说不出去了哪儿。想知道这个,得把每一条连接都记下来。
于是有了这块大屏。
🛰️ 整套配置已开源:github.com/zhangwenqiang0214/home-netflow-dashboard
它长什么样
十一个面板,一屏看完:
- 国内 / 国外流量占比 —— 一个饼图,比想象中更有信息量
- 上行 / 下行方向 —— 谁在传,谁在收
- 流量时序曲线 —— 一天里哪个时段最忙
- 设备 TOP —— 家里哪台机器最能吃
- 出境 IP TOP —— 出了国的流量具体去了哪些地址
- 端口 TOP —— 走的什么协议
打开它最直观的收获,是看见了很多你不知道在联网的东西。智能音箱、电视盒子、某个插座——它们都在安静地跟外面说话,而且比你想的勤快。
数据是怎么流过来的
flowchart LR
subgraph H["家里"]
R["路由器<br/>softflowd<br/>NetFlow v9 · 1:64 采样"]
end
subgraph C["云服务器"]
G["goflow2"] --> K["Kafka"] --> D[("ClickHouse")]
end
R -- "UDP :2055" --> G
D --> V["Grafana 大屏"]
style R fill:#eef3f5,stroke:#5b8291
style D fill:#f7f0e6,stroke:#c08552
style V fill:#f7f0e6,stroke:#c08552
路由器这端跑 softflowd,监听内网桥接口。它不复制流量内容,只记录「谁跟谁、走哪个端口、传了多少字节」这样的元数据,然后按 NetFlow v9 格式发出去。
采样率设的 1:64——每 64 个包记一个。家用路由器的 CPU 很金贵,全量记录会把它拖垮,而看趋势并不需要全量。
云端用 goflow2 收,塞进 Kafka 缓冲,落到 ClickHouse。ClickHouse 是列式数据库,这种「一亿行、只查几列、要聚合」的场景正是它的主场。
Grafana 负责把它画出来。
怎么知道一个 IP 是不是国内的
这是整件事里最实用的一环。
大屏上「国内 / 国外」的划分,靠的是一张中国 IP 段字典——7456 条网段,加载成 ClickHouse 的 IP_TRIE 结构。查一个 IP 属不属于中国,就是一次前缀树查找,快到可以忽略。
1 | dictHas('dictionaries.china_ip', src_addr) |
数据来自公开维护的 china_ip_list。不需要任何商业 IP 库,也不需要注册 key。
想在地图上标出流量去了哪个国家的话,就需要 GeoIP 数据库了(比如 MaxMind GeoLite2,免费但要注册)。我暂时没上,因为「国内/国外」这一刀已经回答了我 80% 的疑问。
几个当时想明白的事
采样不丢失真相。 1:64 听起来很粗,但流量分布是长尾的——真正的大流量会被反复采到,小流量本来也不重要。看趋势和占比,采样完全够。
元数据比内容更有用。 我不需要知道某台设备传了什么,只需要知道它「凌晨三点还在跟境外某个 IP 持续通信」。后者才是异常信号,而且不用碰任何隐私内容。
别让监控系统影响被监控的对象。 softflowd 跑在路由器上,内存和 CPU 都要省着用;重活全放到云端。家里的网卡了,再漂亮的大屏也没意义。
开源了
整套东西放上去了:github.com/zhangwenqiang0214/home-netflow-dashboard
包含 docker-compose、ClickHouse 建表与视图、Grafana 大屏 JSON、路由器侧脚本,以及那份中国 IP 段字典。MIT 协议。
整理的时候顺手做了两件事。
一是把踩过的坑写进 README。比如 Grafana 千万别用 latest——它启动时会联网更新自带插件,网络不畅就一直卡着,HTTP 端口永不就绪,表现是”容器起来了但页面打不开”。这个坑当时找了很久,现在锁版本 + 关掉插件预装的配置直接写进 compose 了。
二是把设备清单换成了示例数据。原来那个 devices.csv 里是我家 19 台设备的 MAC 地址、内网 IP 和名字——摄像头、音箱、每个人的手机、NAS。那是一份完整的家庭画像,绝不能公开。仓库里现在是虚构的示例,MAC 用的是文档保留段,真实文件写进了 .gitignore。
做这类自建监控,最容易忽略的就是:你收集的数据本身,就是最该保护的东西。
一点感受
装完之后我盯着那块屏看了很久。
平时”上网”是个很抽象的词——你点一下,东西就出来了。而这块屏把它变具体了:几十条连接同时存在,有的一闪而过,有的持续几个小时;有些去了你认识的地方,有些去了你完全不知道的地方。
家里这张网一直都这么热闹,只是以前没人看着它。




