网络与 IP

SNMP 端口号:161 与 162 的区别、放行与排查

SNMP 使用两个 UDP 端口:161 由交换机、服务器等被监控设备上的 SNMP 代理监听,监控服务器向它发送 Get、Walk 等查询;162 由监控服务器监听,被监控设备主动把 Trap、Inform 告警发到这里。两个端口方向相反,防火墙规则要分开写。

作者 顶联产品团队发布于 5 分钟阅读

SNMP 端口号是 UDP 161 和 UDP 162。161 是被监控设备(交换机、路由器、服务器上的 snmpd、UPS 网卡等)上的 SNMP 代理监听的端口,监控服务器向它发送 Get、GetNext、GetBulk、Set 请求;162 是监控服务器上的 Trap 接收程序监听的端口,设备出现端口断开、重启、温度过高等事件时,主动把 Trap 或 Inform 发到这里。一句话记住方向:查询发往设备的 161,告警发往监控服务器的 162。所以被监控设备上不需要开放 162,监控服务器上也不需要开放 161(除非它自己也被别人监控)。

161 和 162 分别是谁在监听

端口 传输 谁在监听 谁发起 承载的报文
161 UDP 被监控设备上的 SNMP 代理 监控服务器 Get、GetNext、GetBulk、Set 请求及对应的响应
162 UDP 监控服务器上的 Trap 接收程序(如 snmptrapd、监控平台) 被监控设备 Trap、Inform,以及 Inform 的确认
10161、10162 TCP 上的 TLS,或 UDP 上的 DTLS 同上两行 同上两行 加密传输的 SNMP(RFC 6353),网络设备很少支持

一次查询和一次告警的报文走向如下,示例中监控服务器为 10.10.0.10,交换机为 10.0.0.2:

轮询(Get / Walk)
  10.10.0.10:随机高位端口  ── 请求 ──▶  10.0.0.2:161
  10.10.0.10:随机高位端口  ◀── 响应 ──  10.0.0.2:161

Trap
  10.0.0.2:随机端口        ── Trap ──▶  10.10.0.10:162

Inform
  10.0.0.2:随机端口        ── Inform ─▶  10.10.0.10:162
  10.0.0.2:随机端口        ◀── 确认 ───  10.10.0.10:162

注意两点:监控服务器发查询时用的是操作系统分配的随机源端口,不是 161;设备发 Trap 的源端口一般也是随机的,少数设备固定使用某个端口,所以防火墙规则只按目的端口写,不要依赖源端口。

SNMP 为什么用 UDP,这意味着什么

SNMP 选择 UDP,是因为它的交互是一问一答、报文很小,一台监控服务器要轮询成百上千台设备,不必为每台维持连接状态;网络拥塞时,管理流量也不会像 TCP 那样被拥塞控制压得发不出去。但 UDP 也带来了几个排查时必须知道的特点:

  1. 没有“连接被拒绝”。 TCP 端口不通时你会立刻收到拒绝或超时,能区分;SNMP 不通时几乎只有一种表现:超时。团体名错误、来源不在 ACL 里、版本没启用、端口被防火墙拦截,客户端看到的都是 Timeout: No Response。
  2. 丢包靠重试。 net-snmp 的命令行工具默认超时 1 秒、重试 5 次,一个不通的地址要等约 6 秒才报错。批量轮询几百台设备时,用 -t、-r 调整这两个值,避免一台故障设备拖慢整轮采集。
  3. Trap 可能丢。 Trap 没有确认机制,链路拥塞或监控服务器正在重启时,告警就丢了。重要设备用 Inform,或者让轮询兜底。
  4. 大响应会被分片。 GetBulk 一次返回很多行,响应包超过链路 MTU 时会在 IP 层分片,途中有设备丢弃分片的话,读单个值正常、批量读大表却超时。
  5. 端口扫描给不出确定答案。 nmap 扫 UDP 端口,没有回应时只能报 open|filtered,说不清是被过滤了还是服务没回。

防火墙怎么放行 SNMP 端口

按“谁访问谁”逐段写规则:

位置 方向 放行内容
被监控设备本机(交换机的 SNMP ACL、服务器防火墙) 入 仅监控服务器 → 本机 UDP 161
中间防火墙,监控网 → 设备网 去程 监控服务器 → 设备网段 UDP 161;有状态防火墙会自动放行响应
中间防火墙,设备网 → 监控网 去程 设备网段 → 监控服务器 UDP 162
监控服务器本机 入 设备网段 → 本机 UDP 162
无状态 ACL(不跟踪会话) 回程 设备的源端口 161 → 监控服务器的高位端口;用 Inform 时还要放行 162 的确认回程

Linux 上用 iptables:

# 被监控的 Linux 服务器:只允许监控服务器读 161
iptables -A INPUT -p udp -s 10.10.0.10 --dport 161 -j ACCEPT
iptables -A INPUT -p udp --dport 161 -j DROP

# 监控服务器:接收设备网段发来的 Trap
iptables -A INPUT -p udp -s 10.0.0.0/16 --dport 162 -j ACCEPT

使用 firewalld 的系统:

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.0.10/32" port port="161" protocol="udp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/16" port port="162" protocol="udp" accept'
firewall-cmd --reload

Windows 上的监控平台接收 Trap:

New-NetFirewallRule -DisplayName "SNMP Trap 162" -Direction Inbound -Protocol UDP -LocalPort 162 -RemoteAddress 10.0.0.0/16 -Action Allow

路由器上用的是不跟踪会话的扩展 ACL 时,回程要单独写。以思科 IOS 为例,snmp 和 snmptrap 分别是 161 和 162 的关键字:

ip access-list extended NMS-TO-DEVICES
 permit udp host 10.10.0.10 10.0.0.0 0.0.255.255 eq snmp
ip access-list extended DEVICES-TO-NMS
 permit udp 10.0.0.0 0.0.255.255 eq snmp host 10.10.0.10 gt 1023
 permit udp 10.0.0.0 0.0.255.255 host 10.10.0.10 eq snmptrap

第一条 ACL 放在朝向设备网的方向,第二条放在反方向:前一行放行查询的响应,后一行放行 Trap。

改用非标准端口怎么写

查询时指定端口,在地址后面加冒号和端口号即可:

snmpget -v2c -c 'Rd-DC1-2026' 10.0.0.2:1161 1.3.6.1.2.1.1.3.0

Linux 上的 snmpd 在 /etc/snmp/snmpd.conf 里用 agentaddress udp:1161 改监听端口;snmptrapd 在 /etc/snmp/snmptrapd.conf 里用 snmpTrapdAddr udp:1162 改接收端口。1024 以下的端口需要 root 权限或 CAP_NET_BIND_SERVICE 能力才能监听,所以容器里运行的 Trap 接收程序常常监听 1162,再由宿主机把 UDP 162 映射过去。

设备侧把 Trap 发往非标准端口,在 Trap 目标里加 udp-port:

# 华为、H3C
snmp-agent target-host trap address udp-domain 10.10.0.10 udp-port 1162 params securityname cipher Rd-DC1-2026 v2c
# 思科
snmp-server host 10.10.0.10 version 2c Rd-DC1-2026 udp-port 1162

H3C 的命令把 cipher 去掉即可。网络设备上 161 的监听端口一般不建议修改,很多型号也不提供修改入口。改端口并不能带来多少安全性,真正起作用的是来源 ACL 和 SNMPv3。

SNMP 端口不通怎么排查

按从近到远的顺序,一段一段确认:

1. 先确认走的是哪条路、用的是哪个源地址。 监控服务器有多块网卡时,ip route get 10.0.0.2 会显示去往设备的出接口和源地址,这个源地址必须在设备的 SNMP ACL 里。

2. 在监控服务器上抓包,同时发一次查询。 用 -t 2 -r 0 把超时设为 2 秒、不重试,抓包结果更干净:

tcpdump -ni any udp port 161 and host 10.0.0.2
# 另开一个终端
snmpget -v2c -c 'Rd-DC1-2026' -t 2 -r 0 10.0.0.2 1.3.6.1.2.1.1.3.0
抓包看到 说明 下一步
只有请求,没有响应 请求没到设备,或者设备收到了但不回(团体名、ACL、版本) 到设备上看 SNMP 收包计数是否随请求增加
请求之后收到 ICMP port unreachable 包到了,但 161 上没有程序在监听 SNMP 代理没开,或者只监听在别的地址、别的 VRF
请求和响应都有,客户端仍报超时 响应被本机防火墙丢弃,或设备用另一个地址回包,有状态防火墙不认为它是这次请求的响应 检查本机 INPUT 规则;看响应包的源地址
读单个值正常,snmpbulkwalk 大表超时 响应超过 MTU 被分片,分片在途中被丢弃 用 snmpbulkwalk -Cr5 减少每次返回的行数

3. 在设备侧确认请求到了没有。 华为、H3C 执行 display snmp-agent statistics,思科执行 show snmp,重复发几次查询,看收到的 SNMP 报文总数是否随之增加:不增加说明包没到设备,问题在网络或中间防火墙;增加了但没有响应,再看错误团体名、版本不符这些分项计数。

4. 被监控的是 Linux 服务器时,确认 snmpd 监听在哪。 执行 ss -ulnp | grep -w 161,如果显示的是 127.0.0.1:161,外面永远连不上。Debian、Ubuntu 的 snmpd 默认配置就只监听本机回环地址,要在 snmpd.conf 里把 agentaddress 改成 udp:161 或指定的管理网地址,再重启服务。

5. 不知道团体名时,也能测端口通不通。 nmap 的 snmp-info 脚本发送的是一个不需要凭据的 SNMPv3 探测,设备支持 v3 时会返回引擎信息:

nmap -sU -p 161 --script snmp-info 10.0.0.2

结果为 open 并带有引擎 ID 等信息,说明 UDP 161 是通的,剩下的问题出在团体名或用户配置上。反过来,没有回应并不能说明 161 不通:设备可能没有启用 v3,或者执行 nmap 的机器不在 SNMP ACL 里。UDP 扫描需要 root 权限。

Trap 收不到时

先把监控平台的 Trap 服务停掉,避免占用 162 端口,再用 snmptrapd 在前台临时接收,收到什么直接打印出来:

printf 'disableAuthorization yes\n' > /tmp/snmptrapd-test.conf
snmptrapd -f -Lo -C -c /tmp/snmptrapd-test.conf udp:162

# 在另一台机器上发一条测试 Trap(coldStart),验证到监控服务器的路径
snmptrap -v2c -c test 10.10.0.10 '' 1.3.6.1.6.3.1.1.5.1

-f 前台运行,-Lo 输出到屏幕,-C -c 表示只读取指定的配置文件,disableAuthorization yes 让它接受任何团体名,仅用于测试。测试 Trap 能收到、设备的 Trap 收不到,问题在设备侧:用 display snmp-agent target-host 或 show snmp host 确认目标地址和端口,再确认 Trap 源接口到监控服务器的路由是通的。snmptrapd 能收到、平台上却看不到,多半是平台按来源地址匹配不到设备,或者团体名与平台配置不一致。用 SNMPv3 发 Trap 时还要注意,接收端必须按发送设备的引擎 ID 建立对应的用户,否则消息会被丢弃;Inform 以接收端自己的引擎 ID 为准,接收端不需要预先知道设备的引擎 ID。

在管理系统里怎么落地

机房管理系统接入交换机时,端口规划要一并考虑配置下发和数据采集两条路径。Toplink DCIM 的交换机管理通过 SSH 或 Telnet 下发端口开关、VLAN 和限速配置,SNMP 只用于只读采集,因此交换机管理地址需要对 DCIM 采集与下发所用的地址放行 UDP 161,以及 TCP 22(使用 Telnet 时是 TCP 23),其余来源一律拒绝。交换机的管理地址建议放在独立的管理网段,并在 IP 地址管理里单独登记为内网类型的地址段,哪台交换机用哪个管理地址、ACL 里该放行哪些来源,查起来都有据可依。

常见问题

SNMP 能走 TCP 吗?

能,RFC 3430 定义了 SNMP over TCP,端口同样是 161 和 162,但网络设备基本只实现了 UDP,日常放行防火墙只需考虑 UDP 161 和 162。

Trap 和 Inform 有什么区别?

两者都由设备发往监控服务器的 UDP 162。Trap 发出去就不管了,丢了也不知道;Inform 要求接收方回一个确认,没收到确认会按设定的次数重发。Inform 更可靠,代价是设备要缓存未确认的消息,接收方的 162 端口也必须能把确认包送回去。

UDP 161 暴露在公网有什么风险?

一是团体名可以被持续猜测,猜中就能读出设备配置、路由表、ARP 表等信息;二是开放的 SNMP 会被利用做反射放大攻击,一个很小的 GetBulk 请求能换回大得多的响应,伪造源地址后流量就砸向受害者。161 只应对监控服务器开放。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88