Filtering OIDs#

The SNMP Proxy Forwarder configuration described in this example is designed to hide portions of the MIB, as implemented by the agents on one side of SNMP Proxy, from SNMP managers at the other side of SNMP Proxy.

The filtering is done by configuring the oidfilter.py plugin module to pass command and notification PDUs through it thus letting the plugin to interfere and clean up unwanted OIDs in response.

You could test this configuration by running:

# this should fail
$ snmpget -v1 -c public 127.0.0.1:1161 sysDescr.0

# this should succeed
$ snmpget -v1 -c public 127.0.0.1:1161 sysLocation.0

For more information please refer to the oidfilter plugin documentation.

Server configuration#

Server is configured to:

  • listen on UDP socket at localhost

  • respond to queries performed over SNMPv2c

  • for GET/SET/GETNEXT PDUs, take blocked OIDs out of request PDU (but remember them)

  • forward all queries to snmpfwd client through an unencrypted trunk connection running in client mode

  • reconstruct original OIDs in response PDU using blocked OIDs from GET/GETNEXT/SET request PDU and allowed OIDs from response PDU

#
# SNMP forwarder: Agent part configuration
#

config-version: 2
program-name: snmpfwd-server

snmp-credentials-group {
  snmp-transport-domain: 1.3.6.1.6.1.1.100
  snmp-bind-address: 127.0.0.1:1161

  snmp-engine-id: 0x0102030405070809

  snmp-community-name: public
  snmp-security-name: public
  snmp-security-model: 2
  snmp-security-level: 1

  snmp-credentials-id: snmp-credentials
}

context-group {
  snmp-context-engine-id-pattern: .*?
  snmp-context-name-pattern: .*?

  snmp-context-id: any-context
}

content-group {
  snmp-pdu-type-pattern: (GET|SET|GETNEXT|GETBULK)
  snmp-pdu-oid-prefix-pattern-list: .*?

  snmp-content-id: any-content
}

peers-group {
  snmp-transport-domain: 1.3.6.1.6.1.1.100
  snmp-bind-address-pattern-list: .*?
  snmp-peer-address-pattern-list: .*?

  snmp-peer-id: 100
}

plugin-modules-path-list: ./plugins ${plugin-dir}

plugin-group {
  plugin-module: oidfilter
  plugin-options: config=${config-dir}/plugins/oidfilter.conf log-denials=true

  plugin-id: permit-system-branch
}

trunking-group {
  trunk-bind-address: 127.0.0.1
  trunk-peer-address: 127.0.0.1:30301
  trunk-ping-period: 60
  trunk-connection-mode: client

  trunk-id: trunk-1
}

routing-map {
  matching-snmp-context-id-list: any-context
  matching-snmp-content-id-list: any-content

  matching-snmp-credentials-id-list: snmp-credentials
  matching-snmp-peer-id-list: 100

  using-plugin-id-list: permit-system-branch
  using-trunk-id-list: trunk-1
}

Download server configuration file.

Plugin configuration#

The oidfilter plugin is configured at the server side to pass just a few specific OIDs and branches blocking the rest of the MIB tree that backend SNMP agent serve.

#
# SNMP Proxy Forwarder: oidfilter plugin configuration
#

# allow sysDescr.0
1.3.6.1.2.1.1.1 1.3.6.1.2.1.1.1.0 1.3.6.1.2.1.1.1.0

# allow a few objects at the system branch
1.3.6.1.2.1.1.3 1.3.6.1.2.1.1.3.0 1.3.6.1.2.1.1.3.0

# allow whole sysORUpTime branch
1.3.6.1.2.1.1.9.1.4 1.3.6.1.2.1.1.9.1.4.1 1.3.6.1.2.1.1.9.1.4.8

# allow if#2 of ipTable
1.3.6.1.2.1.2.2.1.1.1 1.3.6.1.2.1.2.2.1.1.2 1.3.6.1.2.1.2.2.1.1.2
1.3.6.1.2.1.2.2.1.2.1 1.3.6.1.2.1.2.2.1.2.2 1.3.6.1.2.1.2.2.1.2.2

# allow some tcpConnTable branches for local routes
1.3.6.1.2.1.6.13.1.1.127.0.0.0.65535 1.3.6.1.2.1.6.13.1.1.127.0.0.1.0 1.3.6.1.2.1.6.13.1.1.127.0.0.1.65535
1.3.6.1.2.1.6.13.1.2.127.0.0.0.65535 1.3.6.1.2.1.6.13.1.2.127.0.0.1.0 1.3.6.1.2.1.6.13.1.2.127.0.0.1.65535

Download plugin configuration file.

Client configuration#

Client is configured to:

  • listen on server-mode unencrypted trunk connection

  • process all incoming SNMP messages in the same way

  • place inbound PDUs into SNMP v2c messages and forward them to public SNMP agent running at demo.pysnmp.com

#
# SNMP forwarder: Manager part configuration
#

config-version: 2
program-name: snmpfwd-client

peers-group {
  snmp-engine-id: 0x0102030405070809

  snmp-transport-domain: 1.3.6.1.6.1.1.1
  snmp-bind-address: 0.0.0.0:0

  # time out SNMP request in 1 second
  snmp-peer-timeout: 100
  snmp-peer-retries: 0

  snmp-community-name: public
  snmp-security-name: public
  snmp-security-model: 2
  snmp-security-level: 1

  snmp-peer-address: 104.236.166.95:161
  snmp-peer-id: snmplabs
}

trunking-group {
  trunk-bind-address: 127.0.0.1:30301
  trunk-ping-period: 60
  trunk-connection-mode: server

  trunk-id: <discover>
}

original-snmp-peer-info-group {
  orig-snmp-bind-address-pattern: .*?
  orig-snmp-context-name-pattern: .*?

  orig-snmp-pdu-type-pattern: .*?
  orig-snmp-oid-prefix-pattern: .*?

  orig-snmp-engine-id-pattern: .*?
  orig-snmp-context-engine-id-pattern: .*?

  orig-snmp-transport-domain-pattern: .*?
  orig-snmp-peer-address-pattern: .*?

  orig-snmp-security-level-pattern: .*?

  orig-snmp-security-name-pattern: .*?
  orig-snmp-security-model-pattern: .*?

  orig-snmp-peer-id: manager-1
}

server-classification-group {
  server-snmp-credentials-id-pattern: .*?
  server-snmp-context-id-pattern: .*?
  server-snmp-content-id-pattern: .*?
  server-snmp-peer-id-pattern: .*?

  server-classification-id: any-classification
}

routing-map {
  matching-trunk-id-list: trunk-1
  matching-orig-snmp-peer-id-list: manager-1
  matching-server-classification-id-list: any-classification

  using-snmp-peer-id-list: snmplabs
}

Download client configuration file.