Introduction
SNMP (Simple Network Management Protocol) is an application-layer protocol for network management and monitoring. It enables administrators to manage network devices, monitor performance, and receive alerts about issues.
This comprehensive guide covers SNMP protocol mechanics, MIB structure, operations, and practical implementation.
What is SNMP?
SNMP provides a standardized framework for network monitoring and management. It uses a manager-agent model where managers query agents for information.
Key Components
Manager: NMS (Network Management System) that queries agents.
Agent: Software on network devices responding to queries.
MIB: Management Information Base - structured database of objects.
OID: Object Identifier - unique identifier for each managed object.
SNMP Versions
| Version | Security | Features |
|---|---|---|
| SNMPv1 | Community string | Basic |
| SNMPv2c | Community string | Improved |
| SNMPv3 | USM (User-based) | Authentication, Encryption |
MIB Structure
OID Tree
iso(1)
โโโ org(3)
โโโ dod(6)
โโโ internet(1)
โโโ mgmt(2)
โ โโโ mib-2(1)
โ โโโ system(1)
โ โโโ interfaces(2)
โ โโโ ...
โโโ experimental(3)
Common OIDs
| OID | Name | Description |
|---|---|---|
| .1.3.6.1.2.1.1.1.0 | sysDescr | System description |
| .1.3.6.1.2.1.1.3.0 | sysUpTime | System uptime |
| .1.3.6.1.2.1.1.5.0 | sysName | System name |
| .1.3.6.1.2.2.1.2.2 | ifEntry | Interface table |
| .1.3.6.1.2.2.1.10.4 | ifInOctets | Input octets |
| .1.3.6.1.2.2.1.16.4 | ifOutOctets | Output octets |
Operations
Get Request
from pysnmp.hlapi import *
iterator = getCmd(
SnmpEngine(),
CommunityData('public', mpModel=0),
UdpTransportTarget(('localhost', 161)),
ContextData(),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'))
)
errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
if errorIndication:
print(errorIndication)
else:
for varBind in varBinds:
print(f'{varBind[0]} = {varBind[1]}')
GetNext
# Walk OID tree
iterator = nextCmd(
SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('localhost', 161)),
ContextData(),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1')),
lexicographicMode=False
)
Set
iterator = setCmd(
SnmpEngine(),
CommunityData('private', mpModel=0),
UdpTransportTarget(('localhost', 161)),
ContextData(),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.5.0'), 'NewDeviceName')
)
Bulk Operations
iterator = bulkCmd(
SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('localhost', 161)),
ContextData(),
0, 25, # Non-repeaters, Max-repetitions
ObjectType(ObjectIdentity('1.3.6.1.2.1.1'))
)
SNMPv3 Configuration
USM Users
from pysnmp.hlapi import *
# User with authentication and encryption
iterator = getCmd(
SnmpEngine(),
UsmUserData(
'myuser',
authKey='myauthkey',
privKey='myprivkey',
authProtocol=usmHMACSHAAuthProtocol,
privProtocol=usmAesCfb128Protocol
),
UdpTransportTarget(('localhost', 161)),
ContextData(),
ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'))
)
Traps and Informs
Receiving Traps
from pysnmp.hlapi import *
def on_trap(transportDispatcher, contextAddr, vars):
for var in vars:
print(f'{var[0]} = {var[1]}')
transportDispatcher.registerRecvFunct(on_trap)
transportDispatcher.jobStarted(1)
try:
transportDispatcher.runDispatcher()
except:
transportDispatcher.closeDispatcher()
Sending Traps
iterator = sendNotification(
SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('manager.example.com', 162)),
ContextData(),
'inform',
NotificationType(
ObjectIdentity('1.3.6.1.4.1.1.1')
).addVarBinds(
ObjectType(ObjectIdentity('1.3.6.1.4.1.1.1.1.0'), 'Alert message')
)
)
Monitoring Examples
Interface Statistics
def get_interface_stats(host):
iterator = nextCmd(
SnmpEngine(),
CommunityData('public'),
UdpTransportTarget((host, 161)),
ContextData(),
ObjectType(ObjectIdentity('1.3.6.1.2.2.1.2')), # ifDescr
ObjectType(ObjectIdentity('1.3.6.1.2.2.1.10.4')), # ifInOctets
ObjectType(ObjectIdentity('1.3.6.1.2.2.1.16.4')), # ifOutOctets
ObjectType(ObjectIdentity('1.3.6.1.2.2.1.5.8')), # ifSpeed
ObjectType(ObjectIdentity('1.3.6.1.2.2.1.8')), # ifOperStatus
lexicographicMode=False
)
interfaces = []
for errorIndication, errorStatus, errorIndex, varBinds in iterator:
if errorIndication:
print(errorIndication)
break
else:
# Process interface data
pass
Best Practices
- Use SNMPv3 for security
- Restrict access with firewalls
- Use informative community strings
- Monitor polling intervals
- Configure traps for critical events
Conclusion
SNMP remains essential for network management in 2026, providing standardized monitoring and alerting capabilities.
Comments