使用SNMP(net-snmp)检查端口
有没有办法用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)。