网络实战 | 小白也能部署完整免费的 LibreNMS 网络监控系统

网络实战 | 小白也能部署完整免费的 LibreNMS 网络监控系统

2 周前 11 0 0℃

网络实战 | 小白也能部署完整免费的 LibreNMS 网络监控系统

本文记录了一次基于 Docker 的 LibreNMS 实际部署过程,从系统时区、Docker 环境准备开始,…

这周在整理监控系统方案时,AI 给我推荐了一个工具—— LibreNMS
评价很直接:一套完全开源免费的 IT 网络监控系统,功能全面,个人能用,企业也能用,对网络工程师、弱电工程师都比较友好。

从功能上看,LibreNMS 覆盖了网络运维中最常用的监控指标,包括服务器、交换机、路由器等设备的接口流量、CPU、内存、接口状态以及 Ping 可达性等。基本上日常排障和运行状态关注的内容,都可以在一个界面里看到。

比较有价值的是它的 Network Map(网络拓扑) 功能,可以自动识别设备之间的连接关系,并根据接口流量、状态变化实时变色。接口 UP / Down 一眼可见,排查问题时不需要在设备列表里反复翻,非常直观。

一、部署思路

快速上线、结构清晰、访问安全、后期维护成本低。

使用官方 Docker 镜像部署 LibreNMS

通过 Docker Compose 一键启动完整环境,避免手动安装依赖,结构清晰,升级也相对可控。

使用 Nginx 作为 TLS 反向代理

LibreNMS 默认是 HTTP 明文访问,账号密码在网络中是裸奔的。现在的网络环境里,各种流量分析设备很多,HTTPS 已经是最低要求。

宿主机只开放必要端口

只暴露访问和日志相关端口,其余全部关闭,避免容器被直接访问。

  • 18000/tcp:LibreNMS Web(Nginx 反代)
  • 514/udp:Syslog
  • 162/udp:SNMP Trap

其余端口保持关闭,外部无法直接访问容器,整体安全性更可控。

二、基础环境准备

2.1 修改系统时区

提前修改系统时区,如果不修改后面安装 LibreNMS 时 cron 会因为时区不一致而报错。

timedatectl set-timezone Asia/Shanghai

2.2 Docker安装

确保Ubuntu系统有完整的 “根 CA 证书集合”ca-certificates存在,确保gnupg工具集合存在。

sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release

添加 Docker 官方 GPG key

为了安装 最新版的 Docker Engine,我们需要使用 Docker 官方软件源。

这个软件源不是 Ubuntu 默认信任的,必须先添加 Docker 的 GPG 公钥,让Ubuntu知道“这个来源可靠”。

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

添加 Docker 仓库

给 Ubuntu 系统添加 Docker 官方的第三方软件源

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新并安装 Docker

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

三、LibreNMS安装

① 创建 LibreNMS 工作目录

mkdir -p /opt/librenms
cd /opt/librenms

② 下载 LibreNMS 官方 Docker 项目

官方把 Docker 部署模板放在 GitHub 上,我们直接下载 master 分支的 zip 包

wget https://github.com/librenms/docker/archive/refs/heads/master.zip
unzip master.zip

解压以后会得到一个docker-master文件夹:

  • examples/ 目录是我们需要的
  • 其他文件主要用于构建官方镜像,用不上

③ 进入官方的 Compose 示例目录

cd /opt/librenms/docker-master/examples/compose

修改.env

Docker Compose 的基础环境变量(数据库、时区等)

# -------------------------------
# LibreNMS Docker Compose 环境变量
# 官方示例修改为上海时间 + 容器安全用户
# -------------------------------

# 容器内时区,必须正确,否则日志和 RRD 图表时间会错
TZ=Asia/Shanghai

# 容器内运行 LibreNMS 的用户 UID / GID
# 官方示例使用 1000(非 root 安全模式)
# 即使宿主机没有 UID=1000 的用户也可以正常运行
PUID=1000
PGID=1000

# -------------------------------
# MariaDB 数据库初始化
# -------------------------------

# 创建的数据库名称
MYSQL_DATABASE=librenms

# 创建的数据库用户名
MYSQL_USER=librenms

# 数据库用户密码,请务必设置安全密码
MYSQL_PASSWORD=luoziwangluo

⑤ 修改librenms.env

LibreNMS 主容器的设置(DB、Redis 等)

# -------------------------------
# LibreNMS 内部配置
# -------------------------------

# PHP 配置:中大型网络建议增加内存和 Opcache
MEMORY_LIMIT=1024M
MAX_INPUT_VARS=5000
UPLOAD_MAX_SIZE=64M
OPCACHE_MEM_SIZE=512

# 如果你使用 NGINX/Traefik 做 HTTPS 反代
REAL_IP_FROM=0.0.0.0/0
REAL_IP_HEADER=X-Forwarded-For
LOG_IP_VAR=remote_addr

# 缓存驱动,使用 Redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
REDIS_HOST=redis

# SNMP 社区字符串
LIBRENMS_SNMP_COMMUNITY=luoziwangluo

# weathermap 插件配置
LIBRENMS_WEATHERMAP=true
LIBRENMS_WEATHERMAP_SCHEDULE=*/5 * * * *

APP_URL=https://192.168.3.9:18000

⑥ 修改 msmtpd.env

发送报警邮件用的 SMTP 配置

# -------------------------------
# msmtpd 配置文件 - 使用 QQ 邮箱 SMTP
# -------------------------------

# QQ 邮箱 SMTP 服务器
SMTP_HOST=smtp.qq.com

# SMTP 端口,587=STARTTLS
SMTP_PORT=587

# 是否启用 TLS
SMTP_TLS=on

# 是否启用 STARTTLS
SMTP_STARTTLS=on

# 是否检查证书合法性
SMTP_TLS_CHECKCERT=on

# 是否需要账号密码认证
SMTP_AUTH=on

# SMTP 用户名(QQ 邮箱账号,不带 @qq.com)
SMTP_USER=你的QQ邮箱账号

# SMTP 授权码(注意:不是登录密码,需要在 QQ 邮箱设置获取授权码)
SMTP_PASSWORD=你的授权码

# 发件人地址(完整邮箱)
SMTP_FROM=你的QQ邮箱@qq.com

⑦ 修改 compose.yml

官方打包好的完整服务编排文件

name: librenms

services:
  db:
    image: mariadb:10
    container_name: librenms_db
    command:
      - "mysqld"
      - "--innodb-file-per-table=1"
      - "--lower-case-table-names=0"
      - "--character-set-server=utf8mb4"
      - "--collation-server=utf8mb4_unicode_ci"
    volumes:
      - "./db:/var/lib/mysql"
    environment:
      - "TZ=${TZ}"
      - "MARIADB_RANDOM_ROOT_PASSWORD=yes"
      - "MYSQL_DATABASE=${MYSQL_DATABASE}"
      - "MYSQL_USER=${MYSQL_USER}"
      - "MYSQL_PASSWORD=${MYSQL_PASSWORD}"
    restart: always

  redis:
    image: redis:7.2-alpine
    container_name: librenms_redis
    environment:
      - "TZ=${TZ}"
    restart: always

  msmtpd:
    image: crazymax/msmtpd:latest
    container_name: librenms_msmtpd
    env_file:
      - "./msmtpd.env"
    restart: always

  librenms:
    image: librenms/librenms:latest
    container_name: librenms
    hostname: librenms
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - db
      - redis
      - msmtpd
    volumes:
      - "./librenms:/data"
    env_file:
      - "./librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "SESSION_SECURE_COOKIE=true"
    restart: always

  dispatcher:
    image: librenms/librenms:latest
    container_name: librenms_dispatcher
    hostname: librenms-dispatcher
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    volumes:
      - "./librenms:/data"
    env_file:
      - "./librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "DISPATCHER_NODE_ID=dispatcher1"
      - "SIDECAR_DISPATCHER=1"
    restart: always

  syslogng:
    image: librenms/librenms:latest
    container_name: librenms_syslogng
    hostname: librenms-syslogng
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    ports:
      - target: 514
        published: 514
        protocol: tcp
      - target: 514
        published: 514
        protocol: udp
    volumes:
      - "./librenms:/data"
    env_file:
      - "./librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "SIDECAR_SYSLOGNG=1"
    restart: always

  snmptrapd:
    image: librenms/librenms:latest
    container_name: librenms_snmptrapd
    hostname: librenms-snmptrapd
    cap_add:
      - NET_ADMIN
      - NET_RAW
    depends_on:
      - librenms
      - redis
    ports:
      - target: 162
        published: 162
        protocol: tcp
      - target: 162
        published: 162
        protocol: udp
    volumes:
      - "./librenms:/data"
    env_file:
      - "./librenms.env"
    environment:
      - "TZ=${TZ}"
      - "PUID=${PUID}"
      - "PGID=${PGID}"
      - "DB_HOST=db"
      - "DB_NAME=${MYSQL_DATABASE}"
      - "DB_USER=${MYSQL_USER}"
      - "DB_PASSWORD=${MYSQL_PASSWORD}"
      - "DB_TIMEOUT=60"
      - "SIDECAR_SNMPTRAPD=1"
    restart: always

⑧ 启动docker compose

docker /opt/librenms/docker-master/examples/compose/compose up -d

四、Nginx安装

LibreNMS 默认提供 HTTP 服务,请求内容在网络上传输时是明文的,账号密码被抓包看得清清楚楚。

为了避免这种风险,我在前面再挂一层 Nginx + TLS,把整个访问过程加密。

① 创建 Nginx 目录结构

主要包含:证书目录 + 配置目录

mkdir -p /opt/librenms/docker-master/examples/compose/librenms_nginx/certs
cd /opt/librenms/docker-master/examples/compose/librenms_nginx/certs

② 生成自签证书(可用 10 年)

openssl req -x509 -nodes -days 3650 -newkey rsa:2048
    -keyout librenms.key
    -out librenms.crt
   -subj "/C=CN/ST=Shanghai/L=Shanghai/O=LibreNMS/OU=IT/CN=librenms.local"

生成后会得到:

  • librenms.key(私钥)
  • librenms.crt(证书)

③ 创建 Nginx 配置目录与配置文件

mkdir -p /opt/librenms/docker-master/examples/compose/librenms_nginx/conf
nano /opt/librenms/docker-master/examples/compose/librenms_nginx/conf/librenms.conf

填入以下配置(反向代理到 LibreNMS 容器的 8000 端口):

server {
    listen 18000 ssl;
    server_name localhost;

    ssl_certificate /etc/nginx/certs/librenms.crt;
    ssl_certificate_key /etc/nginx/certs/librenms.key;

    location / {
        proxy_pass http://librenms:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 18000;
        proxy_redirect off;
    }
}

④ 查看默认网络名称(很重要)

⑤ 创建 Nginx 的 docker-compose.yml

nano /opt/librenms/docker-master/examples/compose/librenms_nginx/docker-compose.yml

填入以下配置:

version: '3.9'

services:
  nginx:
    image: nginx:latest
    container_name: librenms_nginx
    restart: always
    ports:
      - "18000:18000"
    environment:
      TZ: Asia/Shanghai

    volumes:
      - /opt/librenms/docker-master/examples/compose/librenms_nginx/conf:/etc/nginx/conf.d
      - /opt/librenms/docker-master/examples/compose/librenms_nginx/certs:/etc/nginx/certs

    networks:
      - librenms_default

networks:
  librenms_default:
    external: true
  • 18000 → HTTPS 访问入口
  • 加入 librenms_default 网络 才能 proxy_pass 到 LibreNMS

⑥ 启动 Nginx 容器

docker compose -f /opt/librenms/docker-master/examples/compose/librenms_nginx/docker-compose.yml up -d

五、LibreNMS登录

启动成功后,即可通过:https://192.168.X.X:18000

这些命令我已经多次测试过,在正常环境中执行后,不应该出现报错,登录即可直接使用。如果有不完善的地方,也欢迎指出,系统层面我比较菜鸡,我会继续努力。

已复制到剪贴板