From 84b709de447bbd9f4acf6d51f91d158055000546 Mon Sep 17 00:00:00 2001 From: tsosunchia <59512455+tsosunchia@users.noreply.github.com> Date: Wed, 29 May 2024 22:39:12 +0800 Subject: [PATCH] =?UTF-8?q?udptrace=20pktsize=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E4=B8=94=E9=BB=98=E8=AE=A4=E5=8F=91=E5=8C=85=E9=97=B4?= =?UTF-8?q?=E9=9A=94=E8=B0=83=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/cmd.go | 4 +-- trace/udp.go | 72 +++++++++++++++++++++++++++++----------------------- 2 files changed, 42 insertions(+), 34 deletions(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index 41aff3d..32ec6be 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -61,8 +61,8 @@ func Excute() { srcAddr := parser.String("s", "source", &argparse.Options{Help: "Use source src_addr for outgoing packets"}) srcDev := parser.String("D", "dev", &argparse.Options{Help: "Use the following Network Devices as the source address in outgoing packets"}) //router := parser.Flag("R", "route", &argparse.Options{Help: "Show Routing Table [Provided By BGP.Tools]"}) - packetInterval := parser.Int("z", "send-time", &argparse.Options{Default: 100, Help: "Set how many [milliseconds] between sending each packet.. Useful when some routers use rate-limit for ICMP messages"}) - ttlInterval := parser.Int("i", "ttl-time", &argparse.Options{Default: 500, Help: "Set how many [milliseconds] between sending packets groups by TTL. Useful when some routers use rate-limit for ICMP messages"}) + packetInterval := parser.Int("z", "send-time", &argparse.Options{Default: 50, Help: "Set how many [milliseconds] between sending each packet.. Useful when some routers use rate-limit for ICMP messages"}) + ttlInterval := parser.Int("i", "ttl-time", &argparse.Options{Default: 50, Help: "Set how many [milliseconds] between sending packets groups by TTL. Useful when some routers use rate-limit for ICMP messages"}) timeout := parser.Int("", "timeout", &argparse.Options{Default: 1000, Help: "The number of [milliseconds] to keep probe sockets open before giving up on the connection."}) packetSize := parser.Int("", "psize", &argparse.Options{Default: 52, Help: "Set the packet size (payload size)"}) str := parser.StringPositional(&argparse.Options{Help: "IP Address or domain name"}) diff --git a/trace/udp.go b/trace/udp.go index eaf09d3..e3d2dcf 100644 --- a/trace/udp.go +++ b/trace/udp.go @@ -2,6 +2,7 @@ package trace import ( "log" + "math/rand" "net" "sync" "time" @@ -169,46 +170,53 @@ func (t *UDPTracer) send(ttl int) error { srcIP, srcPort, udpConn := t.getUDPConn(0) defer udpConn.Close() - var payload []byte - if t.Quic { - payload = GenerateQuicPayloadWithRandomIds() - } else { - ipHeader := &layers.IPv4{ - SrcIP: srcIP, - DstIP: t.DestIP, - Protocol: layers.IPProtocolUDP, - TTL: uint8(ttl), - } - - udpHeader := &layers.UDP{ - SrcPort: layers.UDPPort(srcPort), - DstPort: layers.UDPPort(t.DestPort), - } - _ = udpHeader.SetNetworkLayerForChecksum(ipHeader) - buf := gopacket.NewSerializeBuffer() - opts := gopacket.SerializeOptions{ - ComputeChecksums: true, - FixLengths: true, - } - - desiredPayloadSize := t.Config.PktSize - payload := make([]byte, desiredPayloadSize) - copy(buf.Bytes(), payload) - - if err := gopacket.SerializeLayers(buf, opts, udpHeader); err != nil { - return err - } - - payload = buf.Bytes() + //var payload []byte + //if t.Quic { + // payload = GenerateQuicPayloadWithRandomIds() + //} else { + ipHeader := &layers.IPv4{ + SrcIP: srcIP, + DstIP: t.DestIP, + Protocol: layers.IPProtocolUDP, + TTL: uint8(ttl), } + udpHeader := &layers.UDP{ + SrcPort: layers.UDPPort(srcPort), + DstPort: layers.UDPPort(t.DestPort), + } + _ = udpHeader.SetNetworkLayerForChecksum(ipHeader) + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{ + ComputeChecksums: true, + FixLengths: true, + } + + desiredPayloadSize := t.Config.PktSize + payload := make([]byte, desiredPayloadSize) + // 设置随机种子 + rand.Seed(time.Now().UnixNano()) + + // 填充随机数 + for i := range payload { + payload[i] = byte(rand.Intn(256)) + } + //copy(buf.Bytes(), payload) + + if err := gopacket.SerializeLayers(buf, opts, udpHeader, gopacket.Payload(payload)); err != nil { + return err + } + + //payload = buf.Bytes() + //} + err = ipv4.NewPacketConn(udpConn).SetTTL(ttl) if err != nil { return err } start := time.Now() - if _, err := udpConn.WriteTo(payload, &net.UDPAddr{IP: t.DestIP, Port: t.DestPort}); err != nil { + if _, err := udpConn.WriteTo(buf.Bytes(), &net.UDPAddr{IP: t.DestIP, Port: t.DestPort}); err != nil { return err }