From 8774e8cd67486f7ca070a46837ec277fc0f9c28d Mon Sep 17 00:00:00 2001 From: john xu Date: Wed, 11 Sep 2024 10:47:48 +0800 Subject: [PATCH 1/2] fix: close when `createWsConn` failed --- cmd/cmd.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index f1af1f7..f7c9773 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -3,7 +3,6 @@ package cmd import ( "encoding/json" "fmt" - "github.com/fatih/color" "log" "net" "os" @@ -12,6 +11,8 @@ import ( "strings" "time" + "github.com/fatih/color" + "github.com/akamensky/argparse" "github.com/nxtrace/NTrace-core/config" fastTrace "github.com/nxtrace/NTrace-core/fast_trace" @@ -114,7 +115,7 @@ func Excute() { Timeout: time.Duration(*timeout) * time.Millisecond, File: *file, DontFragment: *dontFragment, - Dot: *dot, + Dot: *dot, } fastTrace.FastTest(*tcp, *output, paramsFastTrace) @@ -186,7 +187,9 @@ func Excute() { w.Interrupt = make(chan os.Signal, 1) signal.Notify(w.Interrupt, os.Interrupt) defer func() { - w.Conn.Close() + if w.Conn != nil { + w.Conn.Close() + } }() } } From b0c0f8d3ce7ed9e7f588f7748b2a79cba1e513b5 Mon Sep 17 00:00:00 2001 From: tsosunchia <59512455+tsosunchia@users.noreply.github.com> Date: Sun, 6 Oct 2024 10:50:11 +0800 Subject: [PATCH 2/2] =?UTF-8?q?macOS=E4=B8=8B=E7=BC=96=E8=AF=91=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=97=A0=E8=AE=BAuid=3D=3D0=EF=BC=8CicmpPktListen?= =?UTF-8?q?=E5=9D=87=E4=BD=BF=E7=94=A8fakeboboliu=E7=9A=84=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- trace/icmp_ipv4.go | 2 +- trace/internal/icmp_darwin.go | 114 +++++++++++++++++----------------- trace/tcp_ipv6.go | 2 +- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/trace/icmp_ipv4.go b/trace/icmp_ipv4.go index f253c8e..59d3d0f 100644 --- a/trace/icmp_ipv4.go +++ b/trace/icmp_ipv4.go @@ -69,7 +69,7 @@ func (t *ICMPTracer) Execute() (*Result, error) { var err error - t.icmpListen, err = internal.ListenICMP("ip4:1", t.SrcAddr) + t.icmpListen, err = internal.ListenICMP("ip4:icmp", t.SrcAddr) if err != nil { return &t.res, err } diff --git a/trace/internal/icmp_darwin.go b/trace/internal/icmp_darwin.go index 2605f3c..ab39e6c 100644 --- a/trace/internal/icmp_darwin.go +++ b/trace/internal/icmp_darwin.go @@ -6,7 +6,6 @@ import ( "context" "errors" "net" - "os" "syscall" "unsafe" ) @@ -30,68 +29,69 @@ var ( ) func ListenICMP(network string, laddr string) (net.PacketConn, error) { - if os.Getuid() == 0 { // root - return net.ListenPacket(network, laddr) - } else { - if nw, ok := networkMap[network]; ok { - proto := syscall.IPPROTO_ICMP - if nw == "udp6" { - proto = syscall.IPPROTO_ICMPV6 - } + // 为兼容NE,需要注释掉 + //if os.Getuid() == 0 { // root + // return net.ListenPacket(network, laddr) + //} else { + if nw, ok := networkMap[network]; ok { + proto := syscall.IPPROTO_ICMP + if nw == "udp6" { + proto = syscall.IPPROTO_ICMPV6 + } - var ifIndex = -1 - if laddr != "" { - la := net.ParseIP(laddr) - if ifaces, err := net.Interfaces(); err == nil { - for _, iface := range ifaces { - addrs, err := iface.Addrs() - if err != nil { - continue - } - for _, addr := range addrs { - if ipnet, ok := addr.(*net.IPNet); ok { - if ipnet.IP.Equal(la) { - ifIndex = iface.Index - break - } + var ifIndex = -1 + if laddr != "" { + la := net.ParseIP(laddr) + if ifaces, err := net.Interfaces(); err == nil { + for _, iface := range ifaces { + addrs, err := iface.Addrs() + if err != nil { + continue + } + for _, addr := range addrs { + if ipnet, ok := addr.(*net.IPNet); ok { + if ipnet.IP.Equal(la) { + ifIndex = iface.Index + break } } } - if ifIndex == -1 { - return nil, errUnknownIface - } - } else { - return nil, err } + if ifIndex == -1 { + return nil, errUnknownIface + } + } else { + return nil, err } - - isock, err := internetSocket(context.Background(), nw, nil, nil, syscall.SOCK_DGRAM, proto, "listen", - func(ctx context.Context, network, address string, c syscall.RawConn) error { - if ifIndex != -1 { - if proto == syscall.IPPROTO_ICMP { - return c.Control(func(fd uintptr) { - err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_BOUND_IF, ifIndex) - if err != nil { - return - } - }) - } else { - return c.Control(func(fd uintptr) { - err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IPV6, syscall.IPV6_BOUND_IF, ifIndex) - if err != nil { - return - } - }) - } - } - return nil - }) - if err != nil { - panic(err) - } - return newIPConn(isock), nil - } else { - return nil, errUnknownNetwork } + + isock, err := internetSocket(context.Background(), nw, nil, nil, syscall.SOCK_DGRAM, proto, "listen", + func(ctx context.Context, network, address string, c syscall.RawConn) error { + if ifIndex != -1 { + if proto == syscall.IPPROTO_ICMP { + return c.Control(func(fd uintptr) { + err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_BOUND_IF, ifIndex) + if err != nil { + return + } + }) + } else { + return c.Control(func(fd uintptr) { + err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IPV6, syscall.IPV6_BOUND_IF, ifIndex) + if err != nil { + return + } + }) + } + } + return nil + }) + if err != nil { + panic(err) + } + return newIPConn(isock), nil + } else { + return nil, errUnknownNetwork } + //} } diff --git a/trace/tcp_ipv6.go b/trace/tcp_ipv6.go index f622a41..811a26a 100644 --- a/trace/tcp_ipv6.go +++ b/trace/tcp_ipv6.go @@ -47,7 +47,7 @@ func (t *TCPTracerv6) Execute() (*Result, error) { if err != nil { return nil, err } - t.icmp, err = icmp.ListenPacket("ip6:58", "::") + t.icmp, err = icmp.ListenPacket("ip6:ipv6-icmp", "::") if err != nil { return &t.res, err }