From efdfd9d612e68863972611e985fad2cf84ea90f0 Mon Sep 17 00:00:00 2001 From: sjlleo Date: Fri, 3 Jun 2022 16:26:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E8=B7=AF=E7=94=B1=E8=B7=9F=E8=B8=AA?= =?UTF-8?q?=E9=94=99=E4=B9=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- trace/icmp_ipv4.go | 31 +++++++++++++++++++------------ trace/tcp_ipv4.go | 27 +++++++++++++++------------ 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/trace/icmp_ipv4.go b/trace/icmp_ipv4.go index 0d79688..62c0a76 100644 --- a/trace/icmp_ipv4.go +++ b/trace/icmp_ipv4.go @@ -74,19 +74,26 @@ func (t *ICMPTracer) listenICMP() { if msg.N == nil { continue } - rm, err := icmp.ParseMessage(1, msg.Msg[:*msg.N]) - if err != nil { - log.Println(err) - continue - } - switch rm.Type { - case ipv4.ICMPTypeTimeExceeded: - t.handleICMPMessage(msg, 0, rm.Body.(*icmp.TimeExceeded).Data) - case ipv4.ICMPTypeEchoReply: - t.handleICMPMessage(msg, 1, rm.Body.(*icmp.Echo).Data) - default: - // log.Println("received icmp message of unknown type", rm.Type) + // 抢在ICMP解析包之前先判断是否和目的地IP一致 + // Leo 注释:我是伞兵,traceroute 居然忘了做包校验... + dstip := net.IP(msg.Msg[24:28]) + if dstip.Equal(t.DestIP) || dstip.Equal(net.IPv4zero) { + // 匹配再继续解析包,否则直接丢弃 + rm, err := icmp.ParseMessage(1, msg.Msg[:*msg.N]) + if err != nil { + log.Println(err) + continue + } + switch rm.Type { + case ipv4.ICMPTypeTimeExceeded: + t.handleICMPMessage(msg, 0, rm.Body.(*icmp.TimeExceeded).Data) + case ipv4.ICMPTypeEchoReply: + t.handleICMPMessage(msg, 1, rm.Body.(*icmp.Echo).Data) + default: + // log.Println("received icmp message of unknown type", rm.Type) + } } + } } diff --git a/trace/tcp_ipv4.go b/trace/tcp_ipv4.go index be7ced1..4bb62e6 100644 --- a/trace/tcp_ipv4.go +++ b/trace/tcp_ipv4.go @@ -88,18 +88,21 @@ func (t *TCPTracer) listenICMP() { if msg.N == nil { continue } - rm, err := icmp.ParseMessage(1, msg.Msg[:*msg.N]) - if err != nil { - log.Println(err) - continue - } - switch rm.Type { - case ipv4.ICMPTypeTimeExceeded: - t.handleICMPMessage(msg, rm.Body.(*icmp.TimeExceeded).Data) - case ipv4.ICMPTypeDestinationUnreachable: - t.handleICMPMessage(msg, rm.Body.(*icmp.DstUnreach).Data) - default: - //log.Println("received icmp message of unknown type", rm.Type) + dstip := net.IP(msg.Msg[24:28]) + if dstip.Equal(t.DestIP) { + rm, err := icmp.ParseMessage(1, msg.Msg[:*msg.N]) + if err != nil { + log.Println(err) + continue + } + switch rm.Type { + case ipv4.ICMPTypeTimeExceeded: + t.handleICMPMessage(msg, rm.Body.(*icmp.TimeExceeded).Data) + case ipv4.ICMPTypeDestinationUnreachable: + t.handleICMPMessage(msg, rm.Body.(*icmp.DstUnreach).Data) + default: + //log.Println("received icmp message of unknown type", rm.Type) + } } } }