pysnmp не может получать ловушки с другой машины - PullRequest
0 голосов
/ 08 мая 2018

Вместо локального IP-адреса у меня есть ip виртуальной машины (eth0-192.168.12.20) для получения уведомления о прерываниях, я не получаю никаких прерываний, если генерирую один извне виртуальной машины (я использую команду snmptrap с другого компьютера), но я я могу видеть данные SNMP, когда я делаю tcpdump на интерфейсе виртуальной машины eth0. Если я генерирую ловушку с того же компьютера с помощью команды snmptrap, я могу видеть данные ловушки через скрипт приемника ловушек PySNMP.

Опция опробована: 1. Попытался привязать порт к 0.0.0.0 для получения ловушки с любой машины 2. Включена опция отладки в pysnmp, чтобы получить представление о том, как решить проблему. При отправке snmptrap с внешнего компьютера информация не генерируется

Ближайший сценарий , похожий на мой вопрос, присутствует в следующей ссылке, которая не имеет окончательного решения.

Код: SNMP v1 и v2c:

from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher
from pysnmp.carrier.asynsock.dgram import udp, udp6
from pyasn1.codec.ber import decoder
from pysnmp.proto import api
from pysnmp.entity import engine, config
from pysnmp.entity.rfc3413 import ntfrcv

from pysnmp import debug
debug.setLogger(debug.Debug("all"))

### SNMPv2c/SNMPv1 setup
### Callback function for receiving notifications
def v2cv1CallBackFunc(snmpEngine, stateReference, contextEngineId, contextName,
                      varBinds, cbCtx):
    transportDomain, transportAddress = snmpEngine.msgAndPduDsp.getTransportInfo(stateReference)
    print transportDomain, transportAddress
    # Get an execution context...
    execContext = snmpEngine.observer.getExecutionContext(
        'rfc3412.receiveMessage:request'
    )

    # ... and use inner SNMP engine data to figure out peer address
    print('Notification from %s, ContextEngineId "%s", ContextName "%s"'
                          %('@'.join([str(x) for x in execContext['transportAddress']]),
                            contextEngineId.prettyPrint(), contextName.prettyPrint()))

    for name, val in varBinds:
        print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))


# Create SNMP engine with autogenernated engineID and pre-bound
# to socket transport dispatcher
snmpEngine = engine.SnmpEngine()

# SNMPv1/2c setup
# SecurityName <-> CommunityName mapping
config.addV1System(snmpEngine, 'my-area', "public")

# Specify security settings per SecurityName (SNMPv2c -> 1)
config.addTargetParams(snmpEngine, 'my-creds', 'my-area', 'noAuthNoPriv', 1)

# Transport setup
# UDP over IPv4, first listening interface/port
config.addSocketTransport(
    snmpEngine,
    udp.domainName + (1, ),
    udp.UdpSocketTransport().openServerMode(('0.0.0.0', 162))
)

# Register SNMP Application at the SNMP engine
ntfrcv.NotificationReceiver(snmpEngine, v2cv1CallBackFunc)

snmpEngine.transportDispatcher.jobStarted(1)  # this job would never finish

# Run I/O dispatcher which would receive queries and send confirmations
try:
    snmpEngine.transportDispatcher.runDispatcher()
except:
    snmpEngine.transportDispatcher.closeDispatcher()
    raise

Заранее спасибо

1 Ответ

0 голосов
/ 16 мая 2018

Я нашел проблему с помощью моей ИТ-команды.В основном, API работает отлично.

Приложение firewalld не разрешает проходить пакетам.Поэтому после добавления порта SNMP в список исключений брандмауэра мой код заработал.

Команды, которые я использовал:

  • sudo firewall-cmd --add-port = 161-162/ udp --zone = public --permanent
  • перезагрузить сеть sudo systemctl
  • перезагрузить sudo systemctl firewalld
...