什么是 LanLens?
LanLens 是一个开源的自托管网络监控和文档仪表盘,它能够持续扫描本地网络,通过 MAC/IP 地址识别每台设备,并提供一个简洁的深色主题 Web 界面,让用户可以管理、文档化和连接网络中的所有设备。
主要特点
- 自动 LAN 发现:通过
ARP 扫描自动发现网络中的设备
- 设备分类:通过
MAC 厂商标识符自动识别设备类型
- DHCP 标签检测:检测
DHCP 分配的 IP 地址
- 网段管理:支持按颜色、范围和
IP 使用率管理不同网段
- 设备文档:每个设备都可以添加自定义文档字段
- 服务清单:记录设备上运行的服务
- 一键连接:支持
SSH、RDP、HTTP、HTTPS 协议的一键连接
- 端口扫描:通过
nmap 进行端口扫描
- 深度扫描:通过
SSH(Linux)和 WinRM(Windows)进行深度扫描,获取硬件、操作系统、服务、容器信息
- 虚拟化检测:自动检测
Proxmox、KVM、Hyper-V 虚拟机管理程序
- 加密凭据存储:使用
Fernet 加密存储 SSH 和 WinRM 访问凭据
- Telegram 通知:新设备上线和设备更新时发送
Telegram 通知
- 多语言支持:支持
English、German 和 Italian 界面
- 响应式设计:支持桌面和移动端访问
- 开源免费:基于
MIT 协议开源,可免费使用和修改
应用场景
- 家庭网络管理:家庭用户可以监控家中所有联网设备,包括智能家居设备、电脑、手机等
- 小型办公室:小型企业可以管理办公室网络中的打印机、服务器、工作站等设备
- Homelab 爱好者:
Homelab 用户可以文档化管理自己的服务器和虚拟机
- 网络安全管理:网络管理员可以监控网络中新增设备,及时发现异常接入

LanLens 是一个功能全面的自托管 网络监控 工具,特别适合需要集中管理家庭或小型办公网络设备的用户。
安装
在群晖上以 Docker 方式安装。
重要说明
LanLens 需要使用 host 网络模式才能进行 ARP 扫描,建议使用命令行方式进行部署。
LanLens 镜像托管在 Docker Hub(alexrosbach/lanlens)和 ghcr.io(ghcr.io/alexrosbach/lanlens),本文以 Docker Hub 镜像为例。
准备工作
- 在
docker 文件夹中创建一个新文件夹 lanlens,再在其下建一个子文件夹 data
| 文件夹 |
装载路径 |
说明 |
docker/lanlens/data |
/data |
存放数据库和持久化数据 |
# 新建文件夹 lanlens 和 子目录
mkdir -p /volume1/docker/lanlens/data
# 进入 lanlens 目录
cd /volume1/docker/lanlens
- 生成一个随机的
SECRET_KEY(至少 32 个字符):
官方建议用下面的命令来生成,但是这个命令在群晖上可能不行
python3 -c "import secrets; print(secrets.token_hex(32))"
所以还是用我们惯常的命令
openssl rand -hex 32

记下生成的密钥,后续需要填入配置。
SECRET_KEY 说明:这是最重要的环境变量,LanLens 拒绝使用弱密钥启动。
docker cli 安装
如果你熟悉命令行,可能用 docker cli 更快捷
# 运行容器
docker run -d \
--name=lanlens \
--restart=unless-stopped \
--network=host \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
-v $(pwd)/data:/data \
-e SECRET_KEY=833c9672a9525b3ac9603559f47d35af63f176cd8629685ae021aaef502898f4 \
-e DEFAULT_ADMIN_PASSWORD=admin \
-e LANLENS_PORT=7765 \
-e BACKEND_PORT=17765 \
-e TZ=Asia/Shanghai \
alexrosbach/lanlens:latest
注意:由于 LanLens 使用 host 网络模式,端口映射直接在 LANLENS_PORT 环境变量中指定,无需通过 -p 参数映射。
环境变量说明
| 可变 |
值 |
说明 |
SECRET_KEY |
至少 32 位随机字符串 |
必需,用于加密凭据存储 |
DEFAULT_ADMIN_PASSWORD |
admin |
初始管理员密码,首次登录后需修改 |
LANLENS_PORT |
7765 |
HTTP 服务端口 |
BACKEND_PORT |
17765 |
内部 FastAPI 端口,一般无需修改 |
DB_PATH |
/data/lanlens.db |
SQLite 数据库路径 |
TZ |
Asia/Shanghai |
容器时区 |
docker-compose 安装
也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件
services:
lanlens:
image: alexrosbach/lanlens:latest
# To build locally instead of pulling from Docker Hub, uncomment:
# build: .
container_name: lanlens
restart: unless-stopped
# Required for ARP scanning: container must share the host network stack
# so scapy can send raw Ethernet frames via the host's physical NIC.
# Remove this and uncomment 'ports' below to use bridge networking —
# but note that ARP scanning will not work in bridge mode.
network_mode: host
cap_add:
- NET_ADMIN # network interface configuration
- NET_RAW # raw socket access for ARP broadcast
volumes:
- ./data:/data # SQLite database + persistent state
environment:
# ── REQUIRED ──────────────────────────────────────────────────────────────
# Replace with a strong random key (min 32 chars). App refuses to start otherwise.
# Generate: python3 -c "import secrets; print(secrets.token_hex(32))"
- SECRET_KEY=833c9672a9525b3ac9603559f47d35af63f176cd8629685ae021aaef502898f4
# ── OPTIONAL ──────────────────────────────────────────────────────────────
# Initial admin password (will be changed on first login)
- DEFAULT_ADMIN_PASSWORD=admin
# Host-mode HTTP port for the LanLens UI (for example 80, 8080, 7765)
- LANLENS_PORT=7765
# Internal API port used behind nginx (leave as-is unless you know why)
- BACKEND_PORT=17765
# Timezone (e.g. Europe/Berlin, America/New_York, UTC)
- TZ=Asia/Shanghai
# Host mode still allows a custom HTTP port.
# Example: set LANLENS_PORT=80 above if you want LanLens on port 80.
# ── Bridge networking alternative (ARP scanning disabled) ─────────────────
# Comment out network_mode and cap_add above, then uncomment:
# ports:
# - "8080:8080"
# and set LANLENS_PORT=8080 above so nginx listens on the same port.
healthcheck:
test: ["CMD-SHELL", "curl -fs http://localhost:$${LANLENS_PORT:-7765}/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
然后通过 SSH 登录到您的群晖,执行下面的命令:
# 将 docker-compose.yml 放入当前目录
# 一键启动
docker-compose up -d

运行
在浏览器中访问 http://<您的群晖IP>:7765 即可进入登录界面
默认账号密码 admin / admin 写在下方

第一次需要重置密码

登录成功后的主界面

首次登录后建议:
- 前往 Settings → Network 配置扫描网段
- 前往 Settings → Notifications 配置
Telegram 通知(可选)
- 等待首次扫描完成,即可在
Dashboard 查看网络设备

进阶功能
使用 MariaDB/MySQL 替代 SQLite
LanLens 默认使用 SQLite 存储数据。对于生产环境或需要多设备访问的场景,可以切换到 MariaDB 或 MySQL
需要修改 docker-compose.yml:
version: '3.8'
services:
lanlens:
image: alexrosbach/lanlens:latest
container_name: lanlens
restart: unless-stopped
network_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
volumes:
- ./data:/data
environment:
- SECRET_KEY=您的32位随机密钥
- DATABASE_URL=mysql+pymysql://lanlens:密码@mariadb:3306/lanlens
depends_on:
- mariadb
mariadb:
image: mariadb:11
container_name: lanlens-db
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=root密码
- MYSQL_DATABASE=lanlens
- MYSQL_USER=lanlens
- MYSQL_PASSWORD=密码
volumes:
- ./mariadb_data:/var/lib/mysql
深度扫描配置
LanLens 支持通过 SSH(Linux)和 WinRM(Windows)进行深度扫描,获取硬件、操作系统、服务、容器等信息。
可以参考官方文档:https://github.com/AlexRosbach/LanLens#deep-scan--required-permissions
注意事项
- 网络模式:
LanLens 必须使用 network_mode: host,这是 ARP 扫描的必需条件。bridge 模式下无法进行 ARP 扫描。
- 端口冲突:如果
7765 端口被占用,可以修改 LANLENS_PORT 环境变量使用其他端口。
- 数据备份:
v1.4.0 及更新版本包含数据库结构变更,强烈建议在更新前备份数据库。
- 密码重置:如果忘记管理员密码,可以通过以下命令重置:
docker exec -it lanlens reset-password --password "新密码"
- 安全性建议:
- 首次登录后立即修改默认密码
- 使用强随机
SECRET_KEY
- 如需
HTTPS 访问,建议将 LanLens 部署在反向代理后面
参考文档
LanLens: Self-hosted network monitoring and documentation dashboard
地址:https://github.com/AlexRosbach/LanLens
alexrosbach/lanlens - Docker Hub
地址:https://hub.docker.com/r/alexrosbach/lanlens
LanLens 官方文档 - Quick Start
地址:https://github.com/AlexRosbach/LanLens#quick-start