String per UDP senden


#1

Hallo zusammen

Folgendes gibt mir der Befehl “tcpdump -n udp port 162” aus, wenn ich über einen potentialfreien Eingang welcher SNMP unterstützt (SNMP Trap Client) ein Signal an den Server (SNMP Trap Server) sende:

16:17:26.249255 IP 192.168.80.224.65534 > 192.168.80.112.162: C="" Trap(52) .1.3.6.1.4.1.42505.7 1
16:17:26.404109 IP 192.168.80.224.65534 > 192.168.80.112.162: C="" Trap(52) .1.3.6.1.4.1.42505.7 1
16:17:26.992613 IP 192.168.80.224.65534 > 192.168.80.112.162: C="" Trap(52) .1.3.6.1.4.1.42505.7 1
16:17:27.174966 IP 192.168.80.224.65534 > 192.168.80.112.162: C="" Trap(52) .1.3.6.1.4.1.42505.7 1
16:17:27.707526 IP 192.168.80.224.65534 > 192.168.80.112.162: C="" Trap(52) .1.3.6.1.4.1.42505.7 1
16:17:27.855432 IP 192.168.80.224.65534 > 192.168.80.112.162: C="" Trap(52) .1.3.6.1.4.1.42505.7 1
16:17:28.227059 IP 192.168.80.224.65534 > 192.168.80.112.162: C="" Trap(52) .1.3.6.1.4.1.42505.7 1
16:17:28.385072 IP 192.168.80.224.65534 > 192.168.80.112.162: C="" Trap(52) .1.3.6.1.4.1.42505.7 1

…nun wollte ich genau diesen Request nachstellen, und zwar auf Socket-Ebene (ist einfacher als die SNMP-Spezifikationen zu lernen und z.B. mit snmp4j zu arbeiten) um den potentialfreien Eingang zu simulieren.

Allerdings kriege ich es nicht hin, auf dem SNMP-Trap-Server irgendwelche Strings auszugeben.

Ständig kommt nur solches “Zeugs”:

16:22:15.408391 IP 192.168.80.122.51768 > 192.168.80.112.162: [!init SEQ]1936020336
16:23:05.777331 IP 192.168.80.122.51771 > 192.168.80.112.162: [len2<asnlen101]
16:23:10.781946 IP 192.168.80.122.51772 > 192.168.80.112.162: [len2<asnlen101]
16:29:54.163736 IP 192.168.80.122.62476 > 192.168.80.112.162: [!init SEQ]1936020336
16:31:55.249874 IP 192.168.80.122.64758 > 192.168.80.112.162: [P/U/U-0][!init SEQ]
16:32:15.561381 IP 192.168.80.122.51453 > 192.168.80.112.162: [len2<asnlen101]
16:32:30.479516 IP 192.168.80.122.51454 > 192.168.80.112.162: [len59<asnlen101]
16:33:04.714903 IP 192.168.80.122.51455 > 192.168.80.112.162: [len1<asnlen114]
16:33:18.156632 IP 192.168.80.122.51458 > 192.168.80.112.162: [len2<asnlen114]
16:38:46.469267 IP 192.168.80.122.60454 > 192.168.80.112.162: [len10<asnlen101]

16:39:58.157937 IP 192.168.80.122.57818 > 192.168.80.112.162: [len10<asnlen101]
16:40:00.829550 IP 192.168.80.122.57819 > 192.168.80.112.162: [len10<asnlen101]
16:47:29.911632 IP 192.168.80.122.58075 > 192.168.80.112.162: [len10<asnlen101]
16:48:15.618327 IP 192.168.80.122.51228 > 192.168.80.112.162: [len2<asnlen99]
16:49:05.281761 IP 192.168.80.122.54417 > 192.168.80.112.162: [P/U/Boolean][!init SEQ]_01
16:49:20.367433 IP 192.168.80.122.54420 > 192.168.80.112.162: [len2<asnlen7]
16:54:46.331938 IP 192.168.80.122.61823 > 192.168.80.112.162: [len2<asnlen101]
16:55:14.783569 IP 192.168.80.122.60603 > 192.168.80.112.162: [len2<asnlen101]
16:55:24.724894 IP 192.168.80.122.56696 > 192.168.80.112.162: [nothing to parse]
16:55:32.239052 IP 192.168.80.122.60773 > 192.168.80.112.162: [no asnlen]
16:55:45.071911 IP 192.168.80.122.57600 > 192.168.80.112.162: [len2<asnlen48]
16:55:57.825634 IP 192.168.80.122.62795 > 192.168.80.112.162: [no asnlen]
16:59:37.151974 IP 192.168.80.122.49589 > 192.168.80.112.162: [nothing to parse]
16:59:47.291543 IP 192.168.80.122.49589 > 192.168.80.112.162: [nothing to parse]
16:59:48.047585 IP 192.168.80.122.49589 > 192.168.80.112.162: [nothing to parse]
16:59:48.747090 IP 192.168.80.122.49589 > 192.168.80.112.162: [nothing to parse]
16:59:53.018105 IP 192.168.80.122.49589 > 192.168.80.112.162: [len2<asnlen101]
16:59:53.936408 IP 192.168.80.122.49589 > 192.168.80.112.162: [len2<asnlen101]
17:00:23.725296 IP 192.168.80.122.49589 > 192.168.80.112.162: [len2<asnlen101]
17:00:24.080758 IP 192.168.80.122.49589 > 192.168.80.112.162: [len2<asnlen101]
17:00:24.991732 IP 192.168.80.122.49589 > 192.168.80.112.162: [len2<asnlen101]
17:00:25.892417 IP 192.168.80.122.49589 > 192.168.80.112.162: [len2<asnlen101]
17:00:26.770260 IP 192.168.80.122.49589 > 192.168.80.112.162: [len2<asnlen101]

…sollte doch nicht soooooo schwierig sein, aber trotzdem kriege ich es nicht hin!

Weiss jemand von euch weiteres? Leider gibt’s kaum Beispiele im Netz.

Vielen Dank & Hruss,
Jan


#2

Das einzige Beispiel welches eine halbwegs vernünftige Zeile am Bildschirm ausgibt ist das: https://stackoverflow.com/questions/19737977/problems-with-udp-snmp-client-java

Aber hier werd ich auch nicht im geringsten schlau, wie ich einen beliebigen String (anstelle von "
302902010004067075626C6963A01C0204121533EA020100020100300E300C06082B060102010403000500" verwenden kann. In der Eclipse-Konsole sehe ich nur binäres, in der Ausgabe von “tcpdump” Klartext. (Jedoch nix vom ersten Beitrag)

Auch mit solchen Hacks erreiche ich nix, mit der Standardvorgehensweise von snmp4j sowieso nix:

import java.net.InetAddress;
import java.nio.ByteBuffer;

import org.snmp4j.PDU;
import org.snmp4j.asn1.BER;
import org.snmp4j.asn1.BEROutputStream;
import org.snmp4j.mp.MessageProcessingModel;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class Test {
	public static void main(String[] args) throws Exception {
		UdpAddress UDPAddress = new UdpAddress();
		InetAddress inetAddress = InetAddress
				.getByAddress(new byte[] { (byte) 192, (byte) 168, (byte) 80, (byte) 112 });
		UDPAddress.setInetAddress(inetAddress);
		UDPAddress.setPort(162);
		DefaultUdpTransportMapping defaultUDPTransportMapping = new DefaultUdpTransportMapping();
		MyMessageDispatcher test = new MyMessageDispatcher();
		BEROutputStream outgoingMessage = new BEROutputStream();
		PDU pdu = new PDU();
		pdu.setType(PDU.TRAP);
		pdu.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString("xxx")));
		OctetString community = new OctetString("public");
		Integer32 version = new Integer32(MessageProcessingModel.MPv2c);
		int length = pdu.getBERLength();
		length += community.getBERLength();
		length += version.getBERLength();
		int allocSize = length + BER.getBERLengthOfLength(length) + 1;
		ByteBuffer buf = ByteBuffer.allocate(allocSize);
		buf.put("".getBytes("utf-8"));
		System.out.println(allocSize);
		outgoingMessage.setBuffer(buf);
		BER.encodeHeader(outgoingMessage, BER.SEQUENCE, length);
		version.encodeBER(outgoingMessage);
		community.encodeBER(outgoingMessage);
		pdu.encodeBER(outgoingMessage);
		test.sendMessage(defaultUDPTransportMapping, UDPAddress, outgoingMessage.getBuffer().array(), null);
		System.out.println(new String(outgoingMessage.getBuffer().array()));
		outgoingMessage.close();
	}
}

Grüsse, Jan

[Code editiert]


#3

Wie kann ich hier Code formatieren? Gibt nix entsprechendes hier in der Toolbar oben beim Beitrag schreiben…?!?

Grüsse, Jan


#4

…unmöglich, nur schon den SNMP-Befehl mit C="" beginnen zu lassen!!

Grüsse,
Jan


#5

Das ist hier ein wenig umständlich. Am besten rückst du deinen Code in einem extra-Editor um eine Tabulatorbreite ein und kopierst ihn dann hierher. Dann wird er als Code dargestellt.

public class Test {
    // ...
}

Inline Code geht mit Backticks: int a = 42;


#6

Hallo Crian

Danke fürs Feedback.

Das verstehe ich jetzt alledings nicht ganz, was ist ein “Backtick” ?

Gruss
Jan


#7

Code oben editiert

Backtick: dieses Zeichen vor und hinter den kurzen Codestück innerhalb einer Zeile: `


#8

Alles klar, danke. Kante diese Zeichen bisher nur aus dem Französischen (bei MySQL ist es glaube ich auch verwendbar) und dort verwende ich diese Taste meist in Kombination mit Grossbuchstaben. (é, à sowie è sind bei CH-Tastaturen bereits vorhanden…)