零依赖的局域网设备扫描器:Python 标准库后端 + 原生 JS 前端。
不需要 root,不装任何第三方包,一条 docker run 起来,浏览器打开就能用。
打开页面就能看到局域网里所有联网设备——IP、MAC、厂商、主机名、设备类型、开放端口、延迟, 并且把它们长期记成一本可编辑的台账:掉线的设备不删除,谁来过、谁什么时候走的都查得到。
路由器后台只给你一份 DHCP 租约列表(IP + 主机名),既没有厂商也没有历史。 这个工具补的就是这块:认出是什么设备,并且记住它。

首页:左边是在线/离线分布,右边是设备总览(可按列表 / 大 / 中 / 小四种密度展示)。 图为「演示模式」的假数据,用来展示界面。
容器起来后打开 http://<宿主机IP>:8765,会先看到登录页:
| 用户名 | 密码 |
|---|---|
admin | admin |
首次登录会强制要求修改密码(服务端强制:改密前访问任何业务接口都会被拒绝), 新密码至少 8 位。改完之后可以在侧边栏的用户管理里继续加账号,角色分:
admin:起扫描、改设备台账、管用户viewer:只读(能看首页 / 台账 / 历史 / 导出,不能改任何东西)用户、会话、本地令牌都在 /app/data 下(users.json / sessions.json / local_token),
所以挂载 volume 时它们会被一起持久化——不挂的话重建容器会回到默认账号。
局域网内走的是明文 HTTP,Cookie 有
HttpOnly+SameSite=Lax但没有 TLS。 只在可信网络里用;跨不可信网络请在前面套 HTTPS 反向代理。
docker run -d --name lan-scan --network host \
-v lan-scan-data:/app/data \
-e TZ=Asia/Shanghai \
--restart unless-stopped \
hzjackboy/lan-device-scanner:latest
然后浏览器打开 http://127.0.0.1:8765,选网段 → 点「开始扫描」。
同一个局域网的手机、平板也能访问:http://<宿主机IP>:8765。
--network host 是硬要求,不是可选项这个工具靠 ARP(二层广播域) 发现设备——读宿主机 ARP 表 + 发 UDP 触发 ARP 解析。
Docker 默认的 bridge 网络里容器被 NAT,容器的 /proc/net/arp 里只有 docker 网段那几个地址,
扫不到你的局域网。
| 部署位置 | ARP 发现 | 说明 |
|---|---|---|
Linux 主机(--network host) | ✅ | 推荐,能拿到真实 MAC |
Unraid 7(Network Type 选 Host) | ✅ | 最合适的环境之一,见下方「Unraid」 |
| 软路由 / NAS / 群晖(host 网络) | ✅ | 长期挂着跑最合适 |
K8s(hostNetwork: true) | ✅ | — |
| macOS 上的 Docker(含 colima) | ❌ | host 网络也只是虚拟机内网,实测容器看到的是 192.168.x.x 而不是宿主机的 10.0.0.x;macOS 上请在宿主机直接跑 Python |
用了 host 网络后不能再写 -p 端口映射,容器直接占用宿主机的 8765。
Unraid 7:Docker → Add Container,Repository 填 hzjackboy/lan-device-scanner:latest,
Network Type 必须选 Host(别用 Bridge),加一个 Path /app/data → /mnt/user/appdata/lan-device-scanner
和一个 Variable TZ=Asia/Shanghai 即可,不要加端口映射。
仓库里带了现成的模板 templates/lan-device-scanner.xml,放进
/boot/config/plugins/dockerMan/templates-user/ 就能在 Template 下拉里选到。
设备识别
设备台账
Web 界面
定时重扫
| 基础镜像 | python:3.13-alpine |
| 架构 | linux/amd64、linux/arm64(Docker 会自动挑对应架构) |
| 体积 | 约 17.5 MB(压缩后) |
| 暴露端口 | 8765 |
| 健康检查 | 内置 HEALTHCHECK,打 /api/status |
| 时区 | 默认 Asia/Shanghai,可用 -e TZ= 覆盖 |
多架构意味着 x86 的 NAS / 服务器和树莓派 / Apple Silicon 都能直接 docker pull,不用 --platform。
台账、日志、定时重扫配置都写在 /app/data,挂个卷就不会丢:
-v lan-scan-data:/app/data # 命名卷
-v /你的路径/lan-scan-data:/app/data # 或者宿主机目录
里面是:
| 文件 | 内容 |
|---|---|
devices.json | 设备台账(含人工编辑内容) |
auto.json | 定时重扫配置 |
server.log | 运行日志 |
⚠️
devices.json里有你网络的真实 MAC / IP / 主机名,别随手分享或提交到代码仓库。
想用 IEEE 全量厂商表(识别率更高):
docker exec lan-scan python3 update_oui.py --out /app/data/oui.csv
docker restart lan-scan
docker logs -f lan-scan # 看日志
docker restart lan-scan # 重启
docker rm -f lan-scan # 停止并删除(卷还在)
# 命令行跑一次扫描
docker exec lan-scan python3 - <<'PY'
import json, urllib.request
req = urllib.request.Request("http://127.0.0.1:8765/api/scan",
data=json.dumps({"subnet": "10.0.0.0/24", "profile": "fast"}).encode(),
headers={"Content-Type": "application/json"}, method="POST")
print(json.load(urllib.request.urlopen(req)))
PY
ping 命令;没有的话自动跳过 ICMP 阶段,其余功能不受影响服务默认监听 0.0.0.0,但需要登录(默认 admin/admin,首次登录强制改密)。在公共网络(咖啡馆、酒店 Wi-Fi)上仍建议 --host 127.0.0.1 只监听本机。
只在可信网络里运行;在公共 Wi-Fi 下请只监听本机。
另外,扫描他人网络可能违反当地法规或网络使用条款,请只扫自己有权管理的网络。
Content type
Image
Digest
sha256:0d4fc0b3a…
Size
17.5 MB
Last updated
1 day ago
docker pull hzjackboy/lan-device-scanner