From 1261e243f2f85d613c82e532651119c01f00df0a Mon Sep 17 00:00:00 2001 From: sjlleo Date: Thu, 1 Sep 2022 21:02:15 -0400 Subject: [PATCH] =?UTF-8?q?add:=20=E6=8C=87=E5=AE=9A=E7=BD=91=E5=8D=A1?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E8=B7=AF=E7=94=B1=E8=B7=9F=E8=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 15 +++++++++++++++ trace/icmp_ipv4.go | 2 +- trace/icmp_ipv6.go | 2 +- trace/tcp_ipv4.go | 9 +++++++-- trace/trace.go | 1 + trace/udp.go | 2 +- 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index 647cae6..52459b3 100644 --- a/main.go +++ b/main.go @@ -34,6 +34,8 @@ var tablePrint = fSet.Bool("table", false, "Output trace results as table") var classicPrint = fSet.Bool("classic", false, "Classic Output trace results like BestTrace") var beginHop = fSet.Int("b", 1, "Set The Begin TTL") var ver = fSet.Bool("V", false, "Print Version") +var src_addr = fSet.String("S", "", "Use the following IP address as the source address in outgoing packets") +var src_dev = fSet.String("D", "", "Use the following Network Devices as the source address in outgoing packets") func printArgHelp() { fmt.Println("\nArgs Error\nUsage : 'nexttrace [option...] HOSTNAME' or 'nexttrace HOSTNAME [option...]'\nOPTIONS: [-VTU] [-d DATAORIGIN.STR ] [ -m TTL ] [ -p PORT ] [ -q PROBES.COUNT ] [ -r PARALLELREQUESTS.COUNT ] [-rdns] [ -table ] -report") @@ -92,6 +94,18 @@ func main() { ip = util.DomainLookUp(domain, false) } + if *src_dev != "" { + dev, _ := net.InterfaceByName(*src_dev) + + if addrs, err := dev.Addrs(); err == nil { + for _, addr := range addrs { + if (addr.(*net.IPNet).IP.To4() == nil) == (ip.To4() == nil) { + *src_addr = addr.(*net.IPNet).IP.String() + } + } + } + } + if strings.ToUpper(*dataOrigin) == "LEOMOEAPI" { w := wshandle.New() w.Interrupt = make(chan os.Signal, 1) @@ -119,6 +133,7 @@ func main() { } var conf = trace.Config{ + SrcAddr: *src_addr, BeginHop: *beginHop, DestIP: ip, DestPort: *port, diff --git a/trace/icmp_ipv4.go b/trace/icmp_ipv4.go index 4eaca37..6d46e12 100644 --- a/trace/icmp_ipv4.go +++ b/trace/icmp_ipv4.go @@ -31,7 +31,7 @@ func (t *ICMPTracer) Execute() (*Result, error) { var err error - t.icmpListen, err = net.ListenPacket("ip4:1", "0.0.0.0") + t.icmpListen, err = net.ListenPacket("ip4:1", t.SrcAddr) if err != nil { return &t.res, err } diff --git a/trace/icmp_ipv6.go b/trace/icmp_ipv6.go index ca3a65c..31787ea 100644 --- a/trace/icmp_ipv6.go +++ b/trace/icmp_ipv6.go @@ -30,7 +30,7 @@ func (t *ICMPTracerv6) Execute() (*Result, error) { var err error - t.icmpListen, err = net.ListenPacket("ip6:58", "::") + t.icmpListen, err = net.ListenPacket("ip6:58", t.SrcAddr) if err != nil { return &t.res, err } diff --git a/trace/tcp_ipv4.go b/trace/tcp_ipv4.go index b0b7130..d0374db 100644 --- a/trace/tcp_ipv4.go +++ b/trace/tcp_ipv4.go @@ -42,11 +42,16 @@ func (t *TCPTracer) Execute() (*Result, error) { t.SrcIP, _ = util.LocalIPPort(t.DestIP) var err error - t.tcp, err = net.ListenPacket("ip4:tcp", t.SrcIP.String()) + if t.SrcAddr != "" { + t.tcp, err = net.ListenPacket("ip4:tcp", t.SrcAddr) + } else { + t.tcp, err = net.ListenPacket("ip4:tcp", t.SrcIP.String()) + } + if err != nil { return nil, err } - t.icmp, err = icmp.ListenPacket("ip4:icmp", "0.0.0.0") + t.icmp, err = icmp.ListenPacket("ip4:icmp", t.SrcAddr) if err != nil { return &t.res, err } diff --git a/trace/trace.go b/trace/trace.go index 4fcab44..00f33a6 100644 --- a/trace/trace.go +++ b/trace/trace.go @@ -16,6 +16,7 @@ var ( ) type Config struct { + SrcAddr string BeginHop int MaxHops int NumMeasurements int diff --git a/trace/udp.go b/trace/udp.go index e9d28a1..9e118d9 100644 --- a/trace/udp.go +++ b/trace/udp.go @@ -37,7 +37,7 @@ func (t *UDPTracer) Execute() (*Result, error) { } var err error - t.icmp, err = icmp.ListenPacket("ip4:icmp", "0.0.0.0") + t.icmp, err = icmp.ListenPacket("ip4:icmp", t.SrcAddr) if err != nil { return &t.res, err }