Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

snmp config for udp6 and port 16100 #83

Open
tushar-umbarkar opened this issue Aug 18, 2020 · 18 comments
Open

snmp config for udp6 and port 16100 #83

tushar-umbarkar opened this issue Aug 18, 2020 · 18 comments
Assignees
Labels
enhancement New feature or request invalid This doesn't seem right

Comments

@tushar-umbarkar
Copy link

tushar-umbarkar commented Aug 18, 2020

Hi ,

The snmp is running with udp6 protocol and port 16100

I configured snmp input plugin logstash as -
input {
snmp {
walk => ["1.3.6.1.4.1.19808.2.1.14"]
hosts => [{host => "udp6:host ip/16100" community => "public"}]
}
}
its giving me the error -

:ConfigurationError: invalid format for host option 'udp6:host ip/16100'>,

Here it looks like udp6 is not supported here.

Then I tried with udp instead of udp6 -
input {
snmp {
walk => ["1.3.6.1.4.1.19808.2.1.14"]
hosts => [{host => "udp:host ip/16100" community => "public"}]
}
}

Then got below error -
[INFO ] 2020-08-18 15:53:11.963 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
java.io.IOException: Only 32bit unsigned integers are supported at position 237
at org.snmp4j.asn1.BER.decodeUnsignedInteger(BER.java:762)
at org.snmp4j.smi.UnsignedInteger32.decodeBER(UnsignedInteger32.java:83)
at org.snmp4j.smi.AbstractVariable.createFromBER(AbstractVariable.java:173)
at org.snmp4j.smi.VariableBinding.decodeBER(VariableBinding.java:191)
at org.snmp4j.PDU.decodeBER(PDU.java:584)
at org.snmp4j.mp.MPv2c.prepareDataElements(MPv2c.java:201)
at org.snmp4j.MessageDispatcherImpl.dispatchMessage(MessageDispatcherImpl.java:278)
at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:387)
at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:347)
at org.snmp4j.transport.AbstractTransportMapping.fireProcessMessage(AbstractTransportMapping.java:76)
at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(DefaultUdpTransportMapping.java:430)
at java.lang.Thread.run(Thread.java:748)
java.io.IOException: Only 32bit unsigned integers are supported at position 237
at org.snmp4j.asn1.BER.decodeUnsignedInteger(BER.java:762)
at org.snmp4j.smi.UnsignedInteger32.decodeBER(UnsignedInteger32.java:83)
at org.snmp4j.smi.AbstractVariable.createFromBER(AbstractVariable.java:173)
at org.snmp4j.smi.VariableBinding.decodeBER(VariableBinding.java:191)
at org.snmp4j.PDU.decodeBER(PDU.java:584)
at org.snmp4j.mp.MPv2c.prepareDataElements(MPv2c.java:201)
at org.snmp4j.MessageDispatcherImpl.dispatchMessage(MessageDispatcherImpl.java:278)
at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:387)
at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:347)
at org.snmp4j.transport.AbstractTransportMapping.fireProcessMessage(AbstractTransportMapping.java:76)
at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(DefaultUdpTransportMapping.java:430)
at java.lang.Thread.run(Thread.java:748)
[ERROR] 2020-08-18 15:53:14.788 [[main]<snmp] snmp - error invoking walk operation on OID: 1.3.6.1.4.1.19808.2.1.14, ignoring {:exception=>#<LogStash::SnmpClientError: error sending snmp walk request to target host ip/16100: Request timed out.>,

Any Idea how this can be fixed ?
Thanks and Regards,
Tushar

@jsvd
Copy link
Member

jsvd commented Aug 25, 2020

To add on this issue, using udp6 fails silently (notice the :backtrace=>nil) :

❯ bin/logstash -e "input { snmp { walk => ['1.3.6.1.4.1.19808.2.1.14'] hosts => [{'host' => 'udp6:[::1]/16100' 'community' => 'public'}]}}"
Sending Logstash logs to /tmp/logstash-7.9.0/logs which is now configured via log4j2.properties
[2020-08-25T11:11:00,534][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"7.9.0", "jruby.version"=>"jruby 9.2.12.0 (2.5.7) 2020-07-01 db01a49ba6 OpenJDK 64-Bit Server VM 11.0.5+10 on 11.0.5+10 +indy +jit [darwin-x86_64]"}
[2020-08-25T11:11:00,710][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-08-25T11:11:01,871][INFO ][org.reflections.Reflections] Reflections took 27 ms to scan 1 urls, producing 22 keys and 45 values 
[2020-08-25T11:11:02,291][INFO ][logstash.javapipeline    ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>8, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>1000, "pipeline.sources"=>["config string"], :thread=>"#<Thread:0x2950bb01 run>"}
[2020-08-25T11:11:02,870][INFO ][logstash.javapipeline    ][main] Pipeline Java execution initialization time {"seconds"=>0.57}
[2020-08-25T11:11:02,895][INFO ][logstash.inputs.snmp     ][main] using plugin provided MIB path /private/tmp/logstash-7.9.0/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/mibs/logstash
[2020-08-25T11:11:02,912][INFO ][logstash.inputs.snmp     ][main] using plugin provided MIB path /private/tmp/logstash-7.9.0/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/mibs/ietf
[2020-08-25T11:11:04,640][ERROR][logstash.agent           ] Failed to execute action {:id=>:main, :action_type=>LogStash::ConvergeResult::FailedAction, :message=>"Could not execute action: PipelineAction::Create<main>, action_result: false", :backtrace=>nil}
[2020-08-25T11:11:04,790][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
[2020-08-25T11:11:09,901][INFO ][logstash.runner          ] Logstash shut down.
[2020-08-25T11:11:09,917][ERROR][org.logstash.Logstash    ] java.lang.IllegalStateException: Logstash stopped processing because of an error: (SystemExit) exit

I believe this is due to the HOST_REGEX that parses the hosts:

  HOST_REGEX = /^(?<host_protocol>udp|tcp):(?<host_address>.+)\/(?<host_port>\d+)$/i

which should be something like:

  HOST_REGEX = /^(?<host_protocol>(:?udp|tcp)[46]?):(?<host_address>.+)\/(?<host_port>\d+)$/i

@tushar-umbarkar any change you can change this line in your snmp.rb to check that your first example works?

input {
  snmp {
    walk => ["1.3.6.1.4.1.19808.2.1.14"]
    hosts => [{host => "udp6:host ip/16100" community => "public"}]
  }
}

@tushar-umbarkar
Copy link
Author

tushar-umbarkar commented Aug 25, 2020

Modified the regex pattern for HOST and host_details from ?:udp|tcp to (:?udp|tcp)[46]?

Then got below error -

[ERROR] 2020-08-25 18:08:54.305 [[main]-pipeline-manager] javapipeline - Pipeline aborted due to error {:pipeline_id=>"main", :exception=>#<LogStash::SnmpClientError: invalid transport protocol specified 'udp6', expecting 'udp' or 'tcp'>, :backtrace=>["/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp/base_client.rb:32:in initialize'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp/client.rb:19:in initialize'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb:158:in block in register'", "org/jruby/RubyArray.java:1814:in each'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb:123:in register'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:200:in block in register_plugins'", "org/jruby/RubyArray.java:1814:in each'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:199:in register_plugins'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:310:in start_inputs'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:270:in start_workers'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:154:in run'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:109:in block in start'"], "pipeline.sources"=>["/etc/logstash/conf.d/logstash_snmp.conf"], :thread=>"#<Thread:0xbbcea13 run>"}
[ERROR] 2020-08-25 18:08:54.338 [Converge PipelineAction::Create

] agent - Failed to execute action {:id=>:main, :action_type=>LogStash::ConvergeResult::FailedAction, :message=>"Could not execute action: PipelineAction::Create, action_result: false", :backtrace=>nil}
[INFO ] 2020-08-25 18:08:54.563 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
[INFO ] 2020-08-25 18:08:59.621 [LogStash::Runner] runner - Logstash shut down.
[root@ip-10-5-99-101 conf.d]# vi /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb
[root@ip-10-5-99-101 conf.d]#

@jsvd
Copy link
Member

jsvd commented Sep 2, 2020

right, you can change the code in https://github.com/logstash-plugins/logstash-input-snmp/blob/v1.2.2/lib/logstash/inputs/snmp/base_client.rb#L26-L33 to:

      transport = case protocol.to_s
      when "udp", "udp6"
        DefaultUdpTransportMapping.new
      when "tcp"
        DefaultTcpTransportMapping.new
      else
        raise(SnmpClientError, "invalid transport protocol specified '#{protocol.to_s}', expecting 'udp', 'udp6' or 'tcp'")
      end

@jsvd
Copy link
Member

jsvd commented Sep 2, 2020

I have created a preliminary PR to add udp6 support, but I need to find a way to test this #88

@colinsurprenant
Copy link
Contributor

#87 should help with the testing!

@colinsurprenant colinsurprenant added the enhancement New feature or request label Sep 2, 2020
@tushar-umbarkar
Copy link
Author

Modified the file https://github.com/logstash-plugins/logstash-input-snmp/blob/v1.2.2/lib/logstash/inputs/snmp/base_client.rb#L26-L33 as per the changes you suggested.

Got new error -

[2020-09-07T07:25:40,091][ERROR][logstash.javapipeline ][pipeline_1] Pipeline aborted due to error {:pipeline_id=>"pipeline_1", :exception=>java.lang.IllegalArgumentException: Address type udp6 unknown, :backtrace=>["org.snmp4j.smi.GenericAddress.parse(org/snmp4j/smi/GenericAddress.java:213)", "java.lang.reflect.Method.invoke(java/lang/reflect/Method.java:498)", "org.jruby.javasupport.JavaMethod.invokeDirectWithExceptionHandling(org/jruby/javasupport/JavaMethod.java:426)", "org.jruby.javasupport.JavaMethod.invokeStaticDirect(org/jruby/javasupport/JavaMethod.java:358)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_input_minus_snmp_minus_1_dot_2_dot_2.lib.logstash.inputs.snmp.client.build_target(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp/client.rb:39)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_input_minus_snmp_minus_1_dot_2_dot_2.lib.logstash.inputs.snmp.client.RUBY$method$build_target$0$VARARGS(usr/share/logstash/vendor/bundle/jruby/$2_dot_5_dot_0/gems/logstash_minus_input_minus_snmp_minus_1_dot_2_dot_2/lib/logstash/inputs/snmp//usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp/client.rb)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_input_minus_snmp_minus_1_dot_2_dot_2.lib.logstash.inputs.snmp.client.initialize(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp/client.rb:21)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_input_minus_snmp_minus_1_dot_2_dot_2.lib.logstash.inputs.snmp.client.RUBY$method$initialize$0$VARARGS(usr/share/logstash/vendor/bundle/jruby/$2_dot_5_dot_0/gems/logstash_minus_input_minus_snmp_minus_1_dot_2_dot_2/lib/logstash/inputs/snmp//usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp/client.rb)", "org.jruby.RubyClass.newInstance(org/jruby/RubyClass.java:915)", "org.jruby.RubyClass$INVOKER$i$newInstance.call(org/jruby/RubyClass$INVOKER$i$newInstance.gen)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_input_minus_snmp_minus_1_dot_2_dot_2.lib.logstash.inputs.snmp.register(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib logstash/inputs/snmp.rb:158)", "org.jruby.RubyArray.each(org/jruby/RubyArray.java:1814)", "org.jruby.RubyArray$INVOKER$i$0$0$each.call(org/jruby/RubyArray$INVOKER$i$0$0$each.gen)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_input_minus_snmp_minus_1_dot_2_dot_2.lib.logstash.inputs.snmp.register(/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb:123)", "usr.share.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.logstash_minus_input_minus_snmp_minus_1_dot_2_dot_2.lib.logstash.inputs.snmp.RUBY$method$register$0$VARARGS(usr/share/logstash/vendor/bundle/jruby/$2_dot_5_dot_0/gems/logstash_minus_input_minus_snmp_minus_1_dot_2_dot_2/lib/logstash/inputs//usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.register_plugins(/usr/share logstash/logstash-core/lib/logstash/java_pipeline.rb:200)", "org.jruby.RubyArray.each(org/jruby/RubyArray.java:1814)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.register_plugins(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:199)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.RUBY$method$register_plugins$0$VARARGS(usr/share/logstash/logstash_minus_core/lib/logstash//usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.start_inputs(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:310)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.RUBY$method$start_inputs$0$VARARGS(usr/share/logstash/logstash_minus_core/lib/logstash//usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.start_workers(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:270)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.RUBY$method$start_workers$0$VARARGS(usr/share/logstash/logstash_minus_core/lib/logstash//usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.run(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:154)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.RUBY$method$run$0$VARARGS(usr/share/logstash/logstash_minus_core/lib/logstash//usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb)", "usr.share.logstash.logstash_minus_core.lib.logstash.java_pipeline.start(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:109)", "org.jruby.RubyProc.call(org/jruby/RubyProc.java:274)", "java.lang.Thread.run(java/lang/Thread.java:748)"], "pipeline.sources"=>["/etc/logstash/conf.d/logstash_snmp.conf"], :thread=>"#<Thread:0x701bd66e run>"}

@kares
Copy link
Contributor

kares commented Sep 9, 2020

looking at org.snmp4j.smi.GenericAddress.parse only tcp udp (and ip, tls) adress types are supported - no udp6

so I believe udp:ip6host/port is to be used and we're back to the initial error message and the un-patched plugin code :

Then I tried with udp instead of udp6 - hosts => [{host => "udp:host ip/16100" community => "public"}]

java.io.IOException: Only 32bit unsigned integers are supported at position 237
at org.snmp4j.asn1.BER.decodeUnsignedInteger(BER.java:762)
at org.snmp4j.smi.UnsignedInteger32.decodeBER(UnsignedInteger32.java:83)
at org.snmp4j.smi.AbstractVariable.createFromBER(AbstractVariable.java:173)
at org.snmp4j.smi.VariableBinding.decodeBER(VariableBinding.java:191)
at org.snmp4j.PDU.decodeBER(PDU.java:584)
at org.snmp4j.mp.MPv2c.prepareDataElements(MPv2c.java:201)
at org.snmp4j.MessageDispatcherImpl.dispatchMessage(MessageDispatcherImpl.java:278)
at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:387)
at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:347)
at org.snmp4j.transport.AbstractTransportMapping.fireProcessMessage(AbstractTransportMapping.java:76)
at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(DefaultUdpTransportMapping.java:430)
at java.lang.Thread.run(Thread.java:748)

[ERROR] 2020-08-18 15:53:14.788 [[main]<snmp] snmp - error invoking walk operation on OID: 1.3.6.1.4.1.19808.2.1.14, ignoring {:exception=>#<LogStash::SnmpClientError: error sending snmp walk request to target host ip/16100: Request timed out.>,

please undo any plugin changes and use udp prefix

@kares
Copy link
Contributor

kares commented Sep 9, 2020

@tushar-umbarkar if I was to guess based on your original stack-trace (mentioned above ^^^)
it seems like invalid SNMP data - could you check what version you're using (the default used is SNMP v2c)?

I am no way near being a SNMP expert, but if we're stuck here the next step will be to enable logging so we can attempt to decode the payload. if you could somehow capture the udp payload coming in externally please share the bits here.

@tushar-umbarkar
Copy link
Author

We are using SNMP 2c.

I have captured the udp dump. Please find the attached file.
udp_dump_snmp_logstash.txt

Thanks and Regards,
Tushar

@jsvd
Copy link
Member

jsvd commented Sep 14, 2020

I've locally tried connecting to a local snmp server through udp over ipv6, and using the notation mentioned by @kares, it all seems to work well:

Started snmp server from a docker image:

docker run -p 161:161/udp tandrup/snmpsim
❯ bin/logstash -w 1 -b 1 -e "input { snmp { walk => ['1.3.6.1.6.1'] hosts => [{'host' => 'udp:[::1]/161' 'community' => 'demo'}]}} output { stdout {} }" 

I can see request/responses over ipv6 on wireshark:

Screen Shot 2020-09-14 at 17 33 46

@kares
Copy link
Contributor

kares commented Sep 14, 2020

have also tried a setup as I had a concern for potentially the IPv6 encoded addresses being problematic (beyond [::1]), but all seems fine e.g. with: snmp { hosts => [ {'host' => 'udp:[fe80::18c5:5e66:9d04:1055]/161' } ... ]}

@kares
Copy link
Contributor

kares commented Sep 14, 2020

also I've tried walking walk => ['1.3.6.1.4.1.19808.2.1.14'] but I do not yet have any specific (JVM) data to deliver,
still LS is waiting properly for anything to become available on the wire - which leads me to confirm the theory that the problem is with the payload returned.

@tushar-umbarkar
Copy link
Author

I tried walking walk => ['1.3.6.1.4.1.19808.2.1.14'] its failing with error -
[ERROR] 2020-09-15 07:32:14.788 [[main]<snmp] snmp - error invoking walk operation on OID: 1.3.6.1.4.1.19808.2.1.14, ignoring {:exception=>#<LogStash::SnmpClientError: error sending snmp walk request to target host ip/16100: Request timed out.>,

Then I tried walking for walk => ['1.3.6.1.4.1.19808.2.1.10'] its working fine.

But interestingly normal snmpwalk command is working for both the OIDS 1.3.6.1.4.1.19808.2.1.14 and 1.3.6.1.4.1.19808.2.1.10

so the latest status is like -

  • snmpwalk command is working for both OIDs 1.3.6.1.4.1.19808.2.1.14 and 1.3.6.1.4.1.19808.2.1.10
  • snmp walk via logstash plugin is failing for OID 1.3.6.1.4.1.19808.2.1.14

@jsvd
Copy link
Member

jsvd commented Sep 15, 2020

I wonder if data for that tree takes too long to process/send over, and if increasing the timeout from 1000 ms (1 second) to 10000 ms (10 seconds) would help:

    hosts => [{host => "udp:[ipv6]/161" community => "public" version => "2c"  retries => 2  timeout => 10000}]

@tushar-umbarkar
Copy link
Author

Tried with timeout => 10000, and 30000 still getting same request timed out error.

@kares
Copy link
Contributor

kares commented Sep 15, 2020

@tushar-umbarkar than something changed about the setup since the original report - you want to get back here:

Then I tried with udp instead of udp6 -
input {
snmp {
walk => ["1.3.6.1.4.1.19808.2.1.14"]
hosts => [{host => "udp:host ip/16100" community => "public"}]
}
}

Then got below error -
[INFO ] 2020-08-18 15:53:11.963 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
java.io.IOException: Only 32bit unsigned integers are supported at position 237

@kares
Copy link
Contributor

kares commented Sep 15, 2020

I've looked into the original issue we hit - went ahead and started decoding the SNMP packet manually and it seems valid
till a 32-bit value is to be decoded from the value: 00ffffffffffffffff which is clearly out-of-bounds so I think the behaviour is "correct" and I was able to reproduce the failure using another (Ruby SNMP) library which is completely different from the one LS uses.

here's the packet I managed to decode (the last one), from:

I have captured the udp dump. Please find the attached file.
udp_dump_snmp_logstash.txt

	0x0000:  4500 01a7 6e28 4000 ff11 3149 0a05 6365  E...n(@...1I..ce
	0x0010:  0a05 6365 3ee4 8d22 0193 dc78 3082 0187  ..ce>.."...x0...
	0x0020:  0201 0104 0670 7562 6c69 63a2 8201 7802  .....public...x.
	0x0030:  0409 08f0 2802 0100 0201 0030 8201 6830  ....(......0..h0
	0x0040:  2606 1e2b 0601 0401 819a 6002 010e 0201  &..+......`.....
	0x0050:  0747 6172 6261 6765 436f 6c6c 6563 746f  .GarbageCollecto
	0x0060:  7242 0407 4180 0030 2006 182b 0601 0401  rB..A..0...+....
	0x0070:  819a 6002 010e 0201 074d 656d 6f72 7950  ..`......MemoryP
	0x0080:  6f6f 6c42 0407 4180 0030 1b06 142b 0601  oolB..A..0...+..
	0x0090:  0401 819a 6002 010e 0201 0828 726f 6f74  ....`......(root
	0x00a0:  2942 0327 0000 3025 061e 2b06 0104 0181  )B.'..0%..+.....
	0x00b0:  9a60 0201 0e02 0108 4761 7262 6167 6543  .`......GarbageC
	0x00c0:  6f6c 6c65 6374 6f72 4203 2700 0030 1f06  ollectorB.'..0..
	0x00d0:  182b 0601 0401 819a 6002 010e 0201 084d  .+......`......M
	0x00e0:  656d 6f72 7950 6f6f 6c42 0327 0000 3021  emoryPoolB.'..0!
	0x00f0:  0614 2b06 0104 0181 9a60 0201 0e02 0109  ..+......`......
	0x0100:  2872 6f6f 7429 4209 00ff ffff ffff ffff  (root)B.........
	0x0110:  ff30 2b06 1e2b 0601 0401 819a 6002 010e  .0+..+......`...
	0x0120:  0201 0947 6172 6261 6765 436f 6c6c 6563  ...GarbageCollec
	0x0130:  746f 7242 0900 ffff ffff ffff ffff 3025  torB..........0%
	0x0140:  0618 2b06 0104 0181 9a60 0201 0e02 0109  ..+......`......
	0x0150:  4d65 6d6f 7279 506f 6f6c 4209 00ff ffff  MemoryPoolB.....
	0x0160:  ffff ffff ff30 1a06 142b 0601 0401 819a  .....0...+......
	0x0170:  6002 010e 0201 0a28 726f 6f74 2942 0233  `......(root)B.3
	0x0180:  f830 2406 1e2b 0601 0401 819a 6002 010e  .0$..+......`...
	0x0190:  0201 0a47 6172 6261 6765 436f 6c6c 6563  ...GarbageCollec
	0x01a0:  746f 7242 0233 f8                        torB.3.

it's proper SNMP v2c data with community = public the PDU (tag: 162) indicates a SNMP response.
the actual PDU data (of length 162):

"\x02\x04\t\b\xF0(\x02\x01\x00\x02\x01\x000\x82\x01h0&\x06\x1E+\x06\x01\x04\x01\x81\x9A`\x02\x01\x0E\x02\x01\aGarbageCollectorB\x04\aA\x80\x000 \x06\x18+\x06\x01\x04\x01\x81\x9A`\x02\x01\x0E\x02\x01\aMemoryPoolB\x04\aA\x80\x000\e\x06\x14+\x06\x01\x04\x01\x81\x9A`\x02\x01\x0E\x02\x01\b(root)B\x03'\x00\x000%\x06\x1E+\x06\x01\x04\x01\x81\x9A`\x02\x01\x0E\x02\x01\bGarbageCollectorB\x03'\x00\x000\x1F\x06\x18+\x06\x01\x04\x01\x81\x9A`\x02\x01\x0E\x02\x01\bMemoryPoolB\x03'\x00\x000!\x06\x14+\x06\x01\x04\x01\x81\x9A`\x02\x01\x0E\x02\x01\t(root)B\t\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF0+\x06\x1E+\x06\x01\x04\x01\x81\x9A`\x02\x01\x0E\x02\x01\tGarbageCollectorB\t\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF0%\x06\x18+\x06\x01\x04\x01\x81\x9A`\x02\x01\x0E\x02\x01\tMemoryPoolB\t\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF0\x1A\x06\x14+\x06\x01\x04\x01\x81\x9A`\x02\x01\x0E\x02\x01\n(root)B\x023\xF80$\x06\x1E+\x06\x01\x04\x01\x81\x9A`\x02\x01\x0E\x02\x01\nGarbageCollectorB\x023\xF8"

there's the requestid: 151580712 and a list of variables properly encoded:

1.3.6.1.4.1.19808.2.1.14.2.1.7.77.101.109.111.114.121.80.111.111.108, value=121733120
1.3.6.1.4.1.19808.2.1.14.2.1.8.40.114.111.111.116.41, value=2555904
1.3.6.1.4.1.19808.2.1.14.2.1.8.71.97.114.98.97.103.101.67.111.108.108.101.99.116.111.114, value=2555904
1.3.6.1.4.1.19808.2.1.14.2.1.8.77.101.109.111.114.121.80.111.111.108, value=2555904

before hitting the problematic 5th one:

1.3.6.1.4.1.19808.2.1.14.2.1.9.40.114.111.111.116.41, ...

where the encoded value ("B\t\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF") is clearly out of uint32 range


the SNMP v2 specification list these types :

   IpAddress ::= [APPLICATION 0] IMPLICIT OCTET STRING (SIZE (4))

   Counter32 ::= [APPLICATION 1] IMPLICIT INTEGER (0..4294967295)

   Unsigned32 ::= [APPLICATION 2] IMPLICIT INTEGER (0..4294967295)

   Gauge32 ::= Unsigned32

   TimeTicks ::= [APPLICATION 3] IMPLICIT INTEGER (0..4294967295)

   Opaque ::= [APPLICATION 4] IMPLICIT OCTET STRING

   Counter64 ::= [APPLICATION 6]
                 IMPLICIT INTEGER (0..18446744073709551615)

the tag for the problematic variable indicates a Gauge32/Unsigned32 value the value is 64-bit (\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF).

the working snmpwalk means it's likely taking the value as is without proper validation for the 32-bit integer.

for LS disabling the validation would be problematic as that would mean maintaining a fork of the underlying library, and since using a separate SNMP library proved to hit the same issue I do not think the problem is on LS's end.
would recommend consulting the SNMP server documentation and potentially configuration whether undefined/null gauge 32-bit values need to be returned as 0xFFFFFFFFFFFFFFFF.

p.s. sorry for not sharing a better SNMP decoding experience but I did the whole manually as I failed to use some of the decoders tried.


also maybe to be slightly concerned by the SNMP server side are the following warnings:
ip-**-**-**-**.eu-west-2.compute.internal.36130: [bad udp cksum 0xdc78 -> 0xa643!] UDP, length 395

@kares kares added the invalid This doesn't seem right label Sep 15, 2020
@tushar-umbarkar
Copy link
Author

@kares I think the setup and error is same

Configuration
input {
snmp {
walk => ["1.3.6.1.4.1.19808.2.1.14"]
hosts => [{host => "udp:host ip/16100" community => "public"}]
}
}

ERROR -

Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: [2020-09-15T14:40:22,117][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: java.io.IOException: Only 32bit unsigned integers are supported at position 237
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.asn1.BER.decodeUnsignedInteger(BER.java:762)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.UnsignedInteger32.decodeBER(UnsignedInteger32.java:83)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.AbstractVariable.createFromBER(AbstractVariable.java:173)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.VariableBinding.decodeBER(VariableBinding.java:191)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.PDU.decodeBER(PDU.java:584)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.mp.MPv2c.prepareDataElements(MPv2c.java:201)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.dispatchMessage(MessageDispatcherImpl.java:278)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:387)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:347)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.transport.AbstractTransportMapping.fireProcessMessage(AbstractTransportMapping.java:76)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(DefaultUdpTransportMapping.java:430)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at java.lang.Thread.run(Thread.java:748)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: java.io.IOException: Only 32bit unsigned integers are supported at position 237
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.asn1.BER.decodeUnsignedInteger(BER.java:762)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.UnsignedInteger32.decodeBER(UnsignedInteger32.java:83)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.AbstractVariable.createFromBER(AbstractVariable.java:173)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.VariableBinding.decodeBER(VariableBinding.java:191)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.PDU.decodeBER(PDU.java:584)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.mp.MPv2c.prepareDataElements(MPv2c.java:201)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.dispatchMessage(MessageDispatcherImpl.java:278)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:387)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:347)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.transport.AbstractTransportMapping.fireProcessMessage(AbstractTransportMapping.java:76)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(DefaultUdpTransportMapping.java:430)
Sep 15 14:40:22 poc.gmv.dispc.rhino2.er1 logstash[21097]: at java.lang.Thread.run(Thread.java:748)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: java.io.IOException: Only 32bit unsigned integers are supported at position 237
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.asn1.BER.decodeUnsignedInteger(BER.java:762)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.UnsignedInteger32.decodeBER(UnsignedInteger32.java:83)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.AbstractVariable.createFromBER(AbstractVariable.java:173)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.VariableBinding.decodeBER(VariableBinding.java:191)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.PDU.decodeBER(PDU.java:584)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.mp.MPv2c.prepareDataElements(MPv2c.java:201)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.dispatchMessage(MessageDispatcherImpl.java:278)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:387)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:347)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.transport.AbstractTransportMapping.fireProcessMessage(AbstractTransportMapping.java:76)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(DefaultUdpTransportMapping.java:430)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at java.lang.Thread.run(Thread.java:748)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: java.io.IOException: Only 32bit unsigned integers are supported at position 237
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.asn1.BER.decodeUnsignedInteger(BER.java:762)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.UnsignedInteger32.decodeBER(UnsignedInteger32.java:83)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.AbstractVariable.createFromBER(AbstractVariable.java:173)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.smi.VariableBinding.decodeBER(VariableBinding.java:191)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.PDU.decodeBER(PDU.java:584)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.mp.MPv2c.prepareDataElements(MPv2c.java:201)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.dispatchMessage(MessageDispatcherImpl.java:278)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:387)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:347)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.transport.AbstractTransportMapping.fireProcessMessage(AbstractTransportMapping.java:76)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(DefaultUdpTransportMapping.java:430)
Sep 15 14:40:23 poc.gmv.dispc.rhino2.er1 logstash[21097]: at java.lang.Thread.run(Thread.java:748)
Sep 15 14:40:24 poc.gmv.dispc.rhino2.er1 logstash[21097]: [2020-09-15T14:40:24,824][ERROR][logstash.inputs.snmp ][pipeline_1] error invoking walk operation on OID: 1.3.6.1.4.1.19808.2.1.14, ignoring {:exception=>#<LogStash::SnmpClientError: error sending snmp walk request to target host ip/16100: Request timed out.>, :backtrace=>["/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp/base_client.rb:81:in block in walk'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp/base_client.rb:76:in walk'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb:179:in block in run'", "org/jruby/RubyArray.java:1814:in each'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb:177:in block in run'", "org/jruby/RubyArray.java:1814:in each'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb:167:in run'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:328:in inputworker'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:320:in block in start_input'"]} Sep 15 14:40:24 poc.gmv.dispc.rhino2.er1 logstash[21097]: [2020-09-15T14:40:24,824][ERROR][logstash.inputs.snmp ][main] error invoking walk operation on OID: 1.3.6.1.4.1.19808.2.1.14, ignoring {:exception=>#<LogStash::SnmpClientError: error sending snmp walk request to target host ip/16100: Request timed out.>, :backtrace=>["/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp/base_client.rb:81:in block in walk'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp/base_client.rb:76:in walk'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb:179:in block in run'", "org/jruby/RubyArray.java:1814:in each'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb:177:in block in run'", "org/jruby/RubyArray.java:1814:in each'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-snmp-1.2.2/lib/logstash/inputs/snmp.rb:167:in run'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:328:in inputworker'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:320:in block in start_input'"]}

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
enhancement New feature or request invalid This doesn't seem right
Projects
None yet
Development

No branches or pull requests

4 participants