SNMP全稱Simple Network Management Protocol,簡單網(wǎng)絡(luò)管理協(xié)議诅病。是TCP/IP協(xié)議的一部分泄私,屬于應(yīng)用層協(xié)議重荠。SNMP協(xié)議主要用來解決網(wǎng)絡(luò)設(shè)備的管理,大多數(shù)的網(wǎng)絡(luò)管理系統(tǒng)都是基于SNMP協(xié)議挤安。通過該協(xié)議可以實現(xiàn)在被管理的設(shè)備上獲取各種參數(shù)谚殊,還可以設(shè)置修改這些參數(shù)。
SNMP系統(tǒng)的組成
一般SNMP系統(tǒng)組成大致有4個部分:
- 網(wǎng)絡(luò)管理軟件漱受,也就是客戶端络凿,網(wǎng)絡(luò)管理員或者是你和我可以通過管理軟件對網(wǎng)絡(luò)設(shè)備進(jìn)行管理。也就是相當(dāng)于我們平時使用的系統(tǒng)的后臺管理昂羡。
- 網(wǎng)絡(luò)設(shè)備,也就是被管理的設(shè)備摔踱,比如服務(wù)器虐先,路由器,交換機等網(wǎng)絡(luò)設(shè)備派敷。
- 代理程序蛹批,代理程序運行在被管理的設(shè)備中,相當(dāng)于服務(wù)器的角色篮愉。
- MIB庫腐芍,全稱Management Information Base,相當(dāng)于數(shù)據(jù)庫试躏。存儲了被監(jiān)控設(shè)備的各種參數(shù)和狀態(tài)信息等猪勇。
SNMP協(xié)議就是用在網(wǎng)絡(luò)管理軟件和被管理的網(wǎng)絡(luò)設(shè)備之間的協(xié)議,通過此協(xié)議被管理的網(wǎng)絡(luò)設(shè)備才會聽我們的話颠蕴。
一般情況下做開發(fā)泣刹,比如我是做Java開發(fā)的助析,所需要做的就是開發(fā)網(wǎng)絡(luò)管理軟件,也就是客戶端椅您;服務(wù)器端的設(shè)備運行著代理程序外冀,所有的信息都存儲在MIB庫中;我們要做的就是通過SNMP協(xié)議去讀取和設(shè)置這些MIB庫存的數(shù)據(jù)掀泳。
SNMP協(xié)議的結(jié)構(gòu)
SNMP使用UDP進(jìn)行無連接操作雪隧,主要包括SNMP報頭和協(xié)議數(shù)據(jù)單元:
- 版本標(biāo)識符
- 團(tuán)體名
- PDU
SNMP定義了五種報文,用來在管理軟件和代理程序之間進(jìn)行通信:
- get-request员舵,從代理程序處獲取信息
- get-next-request膀跌,從代理程序處獲取下一個參數(shù)值
- set-request,設(shè)置代理程序的值
- get-response固灵,代理程序返回值捅伤,上面三種請求都會使代理程序返回參數(shù)值
- trap,代理程序主動發(fā)送的報文
MIB庫簡介
Management Information Base 管理信息庫巫玻,每個被管理的設(shè)備都需要有MIB庫的存在丛忆,我們才能對設(shè)備進(jìn)行管理。
MIB庫中定義了可訪問的網(wǎng)絡(luò)設(shè)備及其屬性仍秤,通過OID熄诡,Object Identifer來區(qū)別。MIB采用分級樹形結(jié)構(gòu)诗力,以下是結(jié)構(gòu)圖:
![mib]MIB.png)
結(jié)構(gòu)類似于DNS和Unix的文件系統(tǒng)凰浮,例如1.3.6.1.2.1
就代表iso.org.dod.internet.mgmt.mib
。
net-snmp
net-snmp是一種開放源代碼的簡單網(wǎng)絡(luò)管理協(xié)議(Simple Network Management Protocol)軟件苇本,可以安裝在linux系統(tǒng)袜茧,unix以及windows上。作用就是上面提到的代理程序瓣窄。
安裝使用
本次在Centos7上面安裝使用net-snmp軟件笛厦,具體步驟如下:
安裝net-snmp:
sudo yum install net-snmp*
安裝完成之后,修改net-snmp配置文件/etc/snmp/snmpd.conf
俺夕,在下面代碼后面添加兩行:
## sec.name source community
#com2sec local localhost COMMUNITY
#com2sec mynetwork NETWORK/24 COMMUNITY
添加兩行如下:
com2sec local localhost public
com2sec mynet 192.168.0.0/24 public
上面的192.168.0.0/24
根據(jù)你的實際情況添加裳凸,我的局域網(wǎng)網(wǎng)段是192.168.1.xxx
,所以上面寫的是192.168.0.0
劝贸,后面的24
是子網(wǎng)掩碼255.255.255.0
姨谷。
修改完配置文件后,啟動net-snmp服務(wù):
systemctl start snmpd.service
啟動后可以使用以下命令查看啟動是否有錯:
systemctl status snmpd.service -l
如果沒有提示錯誤啥的映九,現(xiàn)在服務(wù)應(yīng)該就已經(jīng)起來了梦湘,可以使用以下命令測試下:
snmpwalk -v1 -c public 192.168.110.198
后面的ip寫net-snmp安裝的那臺機器的ip。回車后會輸出以下信息(不會跟我的完全一樣践叠,只是類似的就對了):
SNMPv2-MIB::sysDescr.0 = STRING: Linux localhost.localdomain 3.10.0-514.2.2.el7.x86_64 #1 SMP Tue Dec 6 23:06:41 UTC 2016 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (4549) 0:00:45.49
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: localhost.localdomain
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (4) 0:00:00.04
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
........還有很多輸出言缤,省略了......
使用SNMP4J開發(fā)
簡單的例子:
public class GetCentosSystemInformation {
private final static String REMOTE_ADDRESS = "udp:192.168.110.198/161";
public static void main(String[] args) throws IOException {
//初始化
Address remoteAddress = GenericAddress.parse(REMOTE_ADDRESS);
System.out.println("SNMP地址:" + REMOTE_ADDRESS + ";有效:" + remoteAddress.isValid());
TransportMapping transportMapping = new DefaultUdpTransportMapping();
Snmp snmp = new Snmp(transportMapping);
snmp.listen();
//構(gòu)造發(fā)送目標(biāo)
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
target.setAddress(remoteAddress);
target.setVersion(SnmpConstants.version2c);
target.setRetries(10);
target.setTimeout(1500);
//構(gòu)造發(fā)送內(nèi)容
PDU pdu = new PDU();
OID oid = new OID("1.3.6.1.2.10");
pdu.add(new VariableBinding(oid));
pdu.setType(PDU.GETNEXT);
//異步監(jiān)聽響應(yīng)
ResponseListener responseListener = new ResponseListener() {
@Override
public void onResponse(ResponseEvent event) {
((Snmp)event.getSource()).cancel(event.getRequest(),this);
PDU response = event.getResponse();
PDU request = event.getRequest();
if(response == null){
System.out.println("請求超時:" + response + "禁灼,請求的內(nèi)容:" + request);
}else {
System.out.println("獲取到信息:" + response);
}
}
};
//發(fā)送
snmp.send(pdu,target,null,responseListener);
//由于是異步獲取信息管挟,在這里需要程序不能結(jié)束運行,否則接收不到異步獲取的消息弄捕。
System.in.read();
}
}