From bbbb2377e173516293c0b82f728b6cb4db4826f7 Mon Sep 17 00:00:00 2001 From: sjlleo Date: Fri, 3 Jun 2022 19:28:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BD=93=E6=9C=89=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E8=B7=9F=E8=B8=AA=E5=AE=9E=E4=BE=8B=EF=BC=8C?= =?UTF-8?q?=E4=B8=94=E8=B7=9F=E8=B8=AA=E9=80=9A=E4=B8=80=E4=B8=AAIP?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E7=9A=84=E5=B9=B2=E6=89=B0=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- trace/icmp_ipv4.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/trace/icmp_ipv4.go b/trace/icmp_ipv4.go index 62c0a764..8ba96fd8 100644 --- a/trace/icmp_ipv4.go +++ b/trace/icmp_ipv4.go @@ -1,6 +1,7 @@ package trace import ( + "encoding/binary" "log" "net" "os" @@ -74,8 +75,14 @@ func (t *ICMPTracer) listenICMP() { if msg.N == nil { continue } - // 抢在ICMP解析包之前先判断是否和目的地IP一致 - // Leo 注释:我是伞兵,traceroute 居然忘了做包校验... + + if binary.BigEndian.Uint16(msg.Msg[32:34]) != uint16(os.Getpid()&0xffff) { + // 如果类型为应答消息,且应答消息包的进程ID与主进程相同时不跳过 + if msg.Msg[0] != 0 || binary.BigEndian.Uint16(msg.Msg[4:6]) != uint16(os.Getpid()&0xffff) { + continue + } + } + dstip := net.IP(msg.Msg[24:28]) if dstip.Equal(t.DestIP) || dstip.Equal(net.IPv4zero) { // 匹配再继续解析包,否则直接丢弃