详细介绍 Linux 系统下源码编译安装 net-snmp-5.9.1 的全流程,以及 SNMPv3 的完整配置、服务启动和功能验证方法,适配 CentOS/RHEL/Debian/Ubuntu 等主流发行版。
一、前置准备:安装依赖 + 解压源码
1. 安装编译依赖(必须)
net-snmp 编译依赖 C 编译器、OpenSSL(SNMPv3 加密必需)、Perl 等,执行对应系统命令:
bash
# CentOS/RHEL/Fedora(yum 包管理器)
yum install -y gcc gcc-c++ make libtool autoconf automake openssl-devel perl perl-devel net-tools
# Debian/Ubuntu(apt 包管理器)
apt update && apt install -y gcc g++ make libtool autoconf automake libssl-dev perl perl-dev net-tools
2. 下载并解压 net-snmp-5.9.1 源码
bash
# 方式1:官网下载(推荐,校验完整性)
wget https://sourceforge.net/projects/net-snmp/files/net-snmp/5.9.1/net-snmp-5.9.1.tar.gz
# 方式2:本地已有包,直接解压
tar -zxvf net-snmp-5.9.1.tar.gz
cd net-snmp-5.9.1 # 进入源码目录
二、编译安装:启用 SNMPv3 核心功能
1. 配置编译参数(核心:启用 SNMPv3 + OpenSSL 加密)
执行 ./configure 时必须开启 --with-openssl(SNMPv3 认证/加密依赖),推荐自定义安装路径避免覆盖系统默认:
bash
./configure \
--prefix=/usr/local/net-snmp # 安装根目录(后续所有文件在此)
--with-sys-contact="admin@example.com" # 系统联系人(自定义)
--with-sys-location="IDC-Server-Room" # 系统位置(自定义)
--with-default-snmp-version="3" # 默认 SNMP 版本为 v3
--with-openssl=/usr/local/openssl # 启用 OpenSSL,支持 SNMPv3 加密/认证(必须)
--enable-shared # 编译共享库
--enable-static # 编译静态库
--with-mib-modules="ucd-snmp/diskio" # 启用磁盘 IO 监控模块(可选)
--disable-ipv6 # 无需 IPv6 则禁用(可选)
即:./configure --prefix=/usr/local/net-snmp --with-sys-contact="admin@example.com" --with-sys-location="IDC-Server-Room" --with-default-snmp-version="3" --with-openssl=/usr/local/openssl --enable-shared --enable-static --with-mib-modules="ucd-snmp/diskio" --disable-ipv6
配置成功标志(终端输出):
---------------------------------------------------------
Net-SNMP configuration summary:
SNMP Versions Supported: 1 2c 3 # 确认包含 v3
Network transport support: Callback Unix Alias TCP UDP
SNMPv3 Security Modules: usm # USM 是 SNMPv3 认证核心
Crypto support: OpenSSL # 确认启用 OpenSSL
---------------------------------------------------------
若配置报错(如 OpenSSL not found),需检查 openssl-devel/libssl-dev 是否安装。
2. 编译 + 安装
bash
make -j $(nproc) # 多核编译($(nproc) 自动获取 CPU 核心数,加速编译)
make install # 安装到 --prefix 指定的目录
三、环境配置:让系统识别 net-snmp 命令
编译安装后,工具默认在 /usr/local/net-snmp/bin,需添加环境变量避免「命令找不到」:
bash
# 临时生效(当前会话)
export PATH=/usr/local/net-snmp/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/net-snmp/lib:$LD_LIBRARY_PATH
# 永久生效(全局所有用户)
echo "export PATH=/usr/local/net-snmp/bin:\$PATH" >> /etc/profile
echo "export LD_LIBRARY_PATH=/usr/local/net-snmp/lib:\$LD_LIBRARY_PATH" >> /etc/profile
source /etc/profile # 立即生效
四、SNMPv3 核心配置:创建用户 + 配置文件
SNMPv3 依赖「用户认证 + 加密」,需创建 SNMPv3 用户并配置 snmpd.conf(服务配置文件)。
1. 生成默认配置文件
bash
# 创建配置文件目录(若不存在)
mkdir -p /usr/local/net-snmp/etc/snmp
# 生成基础配置文件(交互式,按提示回车即可,或自定义)
/usr/local/net-snmp/bin/net-snmp-config --create-snmpd-conf > /usr/local/net-snmp/etc/snmp/snmpd.conf
2. 创建 SNMPv3 用户(关键:认证 + 加密)
使用 net-snmp-create-v3-user 工具创建 SNMPv3 用户,支持两种安全级别:
noAuthNoPriv:无认证 + 无加密(测试用,不安全);authPriv:认证 + 加密(生产推荐,需指定算法:SHA/AES 等)。
示例:创建生产级 SNMPv3 用户(authPriv 级别)
bash
# 格式:net-snmp-create-v3-user -ro(只读) -A 认证密码 -a 认证算法 -X 加密密码 -x 加密算法 用户名
/usr/local/net-snmp/bin/net-snmp-create-v3-user \
-ro \ # 只读权限(生产推荐,避免篡改)
-A "AuthPass@123" \ # 认证密码(自定义,复杂度越高越好)
-a SHA \ # 认证算法(SHA/SHA256/MD5,推荐 SHA)
-X "PrivPass@123" \ # 加密密码(自定义,可与认证密码不同)
-x AES \ # 加密算法(AES/DES,推荐 AES)
snmpv3user # 自定义用户名(如 snmpv3user)
或者
# 手动编辑 snmpd.conf 添加 SNMPv3 用户(最稳妥)
cat >> /usr/local/net-snmp/etc/snmp/snmpd.conf << EOF
# SNMPv3用户配置(authPriv级别:SHA认证 + AES加密)
createUser snmpv3user SHA "AuthPass@123" AES "PrivPass@123"
# 赋予该用户只读权限
rouser snmpv3user default -V default
EOF
执行后,工具会自动将用户信息写入 snmpd.conf,无需手动修改。
3. 调整 snmpd.conf 权限(可选,增强安全)
bash
chmod 600 /usr/local/net-snmp/etc/snmp/snmpd.conf # 仅 root 可读写
chown root:root /usr/local/net-snmp/etc/snmp/snmpd.conf
五、启动 snmpd 服务 + 设置开机自启
1. 启动 snmpd 服务
bash
# 启动命令(指定配置文件路径)
/usr/local/net-snmp/sbin/snmpd -c /usr/local/net-snmp/etc/snmp/snmpd.conf -Lsd
# 检查服务是否启动(无报错则成功)
ps -ef | grep snmpd | grep -v grep
输出示例(进程存在则正常):
root 12345 1 0 10:00 ? 00:00:00 /usr/local/net-snmp/sbin/snmpd -c /usr/local/net-snmp/etc/snmp/snmpd.conf -Lsd
2. 设置开机自启(可选,生产推荐)
bash
# 创建 systemd 服务文件
cat > /usr/lib/systemd/system/snmpd.service << EOF
[Unit]
Description=Net-SNMP SNMP Daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/net-snmp/sbin/snmpd -c /usr/local/net-snmp/etc/snmp/snmpd.conf -Lsd
ExecReload=/bin/kill -HUP \$MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 重载 systemd + 设置开机自启 + 启动服务 (实在不行就用snmp命令启动)
systemctl daemon-reload
systemctl enable snmpd
systemctl start snmpd
systemctl status snmpd # 检查状态(active (running) 则正常)
六、SNMPv3 功能验证:使用 snmpwalk 测试
通过 snmpwalk 发送 SNMPv3 请求,验证配置是否生效,核心命令格式:
bash
snmpwalk -v 3 \
-u 用户名 \ # 步骤四创建的 SNMPv3 用户名
-l 安全级别 \ # noAuthNoPriv/authPriv/authNoPriv
-a 认证算法 \ # SHA/SHA256/MD5(与创建用户时一致)
-A 认证密码 \ # 与创建用户时一致
-x 加密算法 \ # AES/DES(与创建用户时一致)
-X 加密密码 \ # 与创建用户时一致
目标IP \ # 本地测试用 127.0.0.1
系统OID # 如 1.3.6.1.2.1.1.1.0(系统描述)
即:
snmpwalk -v 3 -u snmpv3user -l authPriv -a SHA -A "AuthPass@123" -x AES -X "PrivPass@123" 127.0.0.1 1.3.6.1.2.1.1.1.0
示例1:测试 authPriv 级别(生产推荐)
bash
snmpwalk -v 3 \
-u snmpv3user \
-l authPriv \
-a SHA \
-A "AuthPass@123" \
-x AES \
-X "PrivPass@123" \
127.0.0.1 \
1.3.6.1.2.1.1.1.0 # 系统描述 OID
成功输出示例:
SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64
示例2:测试 noAuthNoPriv 级别(仅测试)
若创建用户时未指定认证/加密(net-snmp-create-v3-user -ro snmpv3test),可执行:
bash
snmpwalk -v 3 -u snmpv3test -l noAuthNoPriv 127.0.0.1 1.3.6.1.2.1.1.1.0
七、添加 SNMPv2c 配置
SNMPv2c 依赖「社区字符串(Community String)」作为简单认证(默认只读为 public,读写为 private),需先在 snmpd.conf 中添加 v2c 配置(默认可能被注释 / 缺失)。
步骤1:添加 SNMPv2c 配置到 snmpd.conf
bash
# 编辑配置文件
vi /usr/local/net-snmp/etc/snmp/snmpd.conf
# 添加以下内容(允许本地/远程访问的社区字符串)
# 格式:rocommunity 社区字符串 允许访问的IP(0.0.0.0/0 允许所有IP,生产不推荐)
rocommunity public 127.0.0.1 # 本地只读访问(推荐)
# rocommunity public 192.168.1.0/24 # 允许指定网段访问(可选)
# rwcommunity private 127.0.0.1 # 本地读写访问(谨慎开启)
步骤2:重启 snmpd 服务(加载 v2c 配置)
bash
pkill snmpd
/usr/local/net-snmp/sbin/snmpd -c /usr/local/net-snmp/etc/snmp/snmpd.conf -Lsd
执行 SNMPv2c 命令(示例)
SNMPv2c 的核心命令格式(以 snmpwalk 为例):
bash
# 基本格式:snmpwalk -v 2c -c 社区字符串 目标IP OID
snmpwalk -v 2c -c public 127.0.0.1 1.3.6.1.2.1.1.1.0
常用 SNMPv2c 命令示例:
| 功能 | 命令示例 |
|---|---|
| 查看系统描述 | snmpwalk -v 2c -c public 127.0.0.1 1.3.6.1.2.1.1.1.0 |
| 查看网络接口列表 | snmpwalk -v 2c -c public 127.0.0.1 1.3.6.1.2.1.2.2.1.1 |
| 批量获取数据(v2c专属) | snmpbulkwalk -v 2c -c public 127.0.0.1 1.3.6.1.2.1.2.2(效率比snmpwalk高) |
| 获取单个OID值 | snmpget -v 2c -c public 127.0.0.1 1.3.6.1.2.1.1.5.0(系统名称) |
执行结果示例(成功):
SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64
八、常见问题排查
1. snmpwalk 提示「Timeout」
-
检查 snmpd 服务是否启动(
systemctl status snmpd); -
检查防火墙/SELinux 是否拦截 161 端口(SNMP 服务端口):
bash# 临时关闭防火墙(测试) systemctl stop firewalld # CentOS ufw disable # Ubuntu # 永久开放 161 端口 firewall-cmd --add-port=161/udp --permanent && firewall-cmd --reload
2. 提示「Authentication failure」
- 检查用户名、认证密码、加密密码是否与创建时一致;
- 检查认证/加密算法是否匹配(如创建时用 SHA,测试时不能用 MD5)。
3. 编译时提示「Perl not found」
- 重新安装 Perl 依赖:
yum install perl perl-devel/apt install perl perl-dev。
八、核心总结
- 编译时必须开启
--with-openssl,否则 SNMPv3 加密/认证功能不可用; - SNMPv3 推荐使用
authPriv级别(认证+加密),避免noAuthNoPriv(不安全); - 生产环境中,SNMPv3 用户密码需高复杂度,且配置文件需限制权限(600);
- 常用 OID 参考:
- 系统描述:1.3.6.1.2.1.1.1.0
- 系统名称:1.3.6.1.2.1.1.5.0
- 接口流量:1.3.6.1.2.1.2.2.1.10(入流量)/ 1.3.6.1.2.1.2.2.1.16(出流量)。
最后,谢谢各位读者的耐心阅读,如有语句不通顺或者不准确的地方,还请指正!谢谢!( ^ _ ^ )