使用SNMP(net-snmp)检查端口

3 投票
3 回答
10085 浏览
提问于 2025-04-16 02:48

有没有办法用SNMP来监控服务器的端口?(我正在用net-snmp-python这个库来用Python检查这个问题)。到目前为止,我用“nc”命令检查得很简单,不过我想看看能不能用SNMP来实现。

谢谢大家的回答和耐心。

3 个回答

0

你可以试着用 nmap 来扫描你想检查的端口,但这并不一定能告诉你,那个开放端口另一边的 服务器程序 是否还在运行。

0

很难理解SNMP到底适合用在什么地方。

最好的监控方法是使用专门的协议客户端(比如,运行一个简单的查询去访问MySQL,或者用FTP获取一个测试文件等等)。

如果这样不行,你可以打开一个TCP或UDP的连接,看看有没有人回应。

4

如果你想用SNMP来查看哪些端口在监听,你可以使用以下的OIDS(对象标识符)来遍历表格。

  "1.3.6.1.2.1.6.13.1.1" tcpConnState 
  "1.3.6.1.2.1.7.5.1.1"  udpLocalAddress

使用UDP协议的话,你会得到类似这样的结果:

snmpwalk -cpublic 192.168.1.13 1.3.6.1.2.1.7.5.1.1                                                    
   UDP-MIB::udpLocalAddress.0.0.0.0.68 = IpAddress: 0.0.0.0
   UDP-MIB::udpLocalAddress.0.0.0.0.161 = IpAddress: 0.0.0.0
   UDP-MIB::udpLocalAddress.0.0.0.0.32908 = IpAddress: 0.0.0.0
   UDP-MIB::udpLocalAddress.0.0.0.0.33281 = IpAddress: 0.0.0.0
   UDP-MIB::udpLocalAddress.0.0.0.0.33795 = IpAddress: 0.0.0.0
   UDP-MIB::udpLocalAddress.0.0.0.0.34822 = IpAddress: 0.0.0.0
   UDP-MIB::udpLocalAddress.0.0.0.0.44782 = IpAddress: 0.0.0.0
   UDP-MIB::udpLocalAddress.192.168.1.13.9950 = IpAddress: 192.168.1.13

而使用TCP协议的话,结果会像这样:

snmpwalk -cpublic 192.168.1.13 1.3.6.1.2.1.6.13.1.1                                                   
   TCP-MIB::tcpConnState.0.0.0.0.21.0.0.0.0.0 = INTEGER: listen(2)
   TCP-MIB::tcpConnState.0.0.0.0.23.0.0.0.0.0 = INTEGER: listen(2)
   TCP-MIB::tcpConnState.0.0.0.0.80.0.0.0.0.0 = INTEGER: listen(2)

遍历这些表格可以让你看到哪些端口在监听,并且能提供一些信息。

如果你只是想检查你在问题中提到的特定端口是否在监听,可以使用以下的OIDS来进行检查。

ftp -- 1.3.6.1.2.1.6.13.1.1.0.0.0.0.21.0.0.0.0.0
ssh -- 1.3.6.1.2.1.6.13.1.1.0.0.0.0.22.0.0.0.0.0
http --  1.3.6.1.2.1.6.13.1.1.0.0.0.0.80.0.0.0.0.0
https -- 1.3.6.1.2.1.6.13.1.1.0.0.0.0.443.0.0.0.0.0
bind -- 1.3.6.1.2.1.7.5.1.1.0.0.0.0.53 

上面的OIDS假设服务器绑定到了默认地址(0.0.0.0)。但它们也可能只绑定到服务器的IP地址(这取决于配置)。在这种情况下,假设你的服务器IP是192.168.10.1,你会得到:

1.3.6.1.2.1.7.5.1.1.192.168.10.1.53  for bind

所以说,如果你想知道在主机192.168.10.1上,HTTP是否在默认地址上监听,使用Python的net snmp绑定,你可以这样做。

import netsnmp
oid = netsmp.Varbind('1.3.6.1.2.1.6.13.1.1.0.0.0.0.80.0.0.0.0.0')
result = netsnmp.snmp(oid,
                      Version = 2,
                      DestHost="192.168.10.1",
                      Community="public")

我不太确定Varbind是否是必需的,因为我在Python中没有做过SNMP的相关工作,有些例子有这个,有些没有。不过你可以试一下。在上面的查询中,如果服务器没有在监听,它会返回一个“没有这样的OID”的信息;如果端口是开放并且在监听,结果应该是Integer(2)。

撰写回答