V3.3.1
This commit is contained in:
parent
2fe99008cb
commit
ae5e8975c3
BIN
dist/livetrace-linux-amd64
vendored
BIN
dist/livetrace-linux-amd64
vendored
Binary file not shown.
BIN
dist/livetrace-windows-amd64.exe
vendored
BIN
dist/livetrace-windows-amd64.exe
vendored
Binary file not shown.
32
src/main.go
32
src/main.go
@ -233,6 +233,7 @@ type Tracer struct {
|
|||||||
// lifecycle
|
// lifecycle
|
||||||
stopCh chan struct{}
|
stopCh chan struct{}
|
||||||
started time.Time
|
started time.Time
|
||||||
|
debug bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTracer(
|
func NewTracer(
|
||||||
@ -244,6 +245,7 @@ func NewTracer(
|
|||||||
maxRounds int,
|
maxRounds int,
|
||||||
maxDur time.Duration,
|
maxDur time.Duration,
|
||||||
noDNS bool,
|
noDNS bool,
|
||||||
|
debug bool,
|
||||||
) (*Tracer, error) {
|
) (*Tracer, error) {
|
||||||
ips, err := net.LookupHost(target)
|
ips, err := net.LookupHost(target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -287,6 +289,7 @@ func NewTracer(
|
|||||||
maxActive: maxHops,
|
maxActive: maxHops,
|
||||||
stopCh: make(chan struct{}),
|
stopCh: make(chan struct{}),
|
||||||
started: time.Now(),
|
started: time.Now(),
|
||||||
|
debug: debug,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -523,8 +526,9 @@ func (t *Tracer) receiveLoop() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if t.debug {
|
||||||
fmt.Fprintf(os.Stderr, "[debug] icmp recv %d bytes from %s\n", n, peer)
|
fmt.Fprintf(os.Stderr, "[debug] icmp recv %d bytes from %s\n", n, peer)
|
||||||
|
}
|
||||||
|
|
||||||
from := peerString(peer)
|
from := peerString(peer)
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
@ -553,7 +557,7 @@ func (t *Tracer) receiveLoop() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if t.proto == "udp" {
|
if t.proto == "udp" {
|
||||||
dstPort, ok := extractOriginalUDPPort(te.Data)
|
dstPort, ok := t.extractOriginalUDPPort(te.Data)
|
||||||
if !ok {
|
if !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -580,7 +584,7 @@ func (t *Tracer) receiveLoop() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if t.proto == "udp" {
|
if t.proto == "udp" {
|
||||||
dstPort, ok := extractOriginalUDPPort(du.Data)
|
dstPort, ok := t.extractOriginalUDPPort(du.Data)
|
||||||
if !ok {
|
if !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -626,22 +630,30 @@ func extractOriginalICMP(data []byte) (seq, id int, ok bool) {
|
|||||||
|
|
||||||
// extractOriginalUDPPort reads the original UDP destination port from the
|
// extractOriginalUDPPort reads the original UDP destination port from the
|
||||||
// embedded original IP+UDP header in a Time Exceeded or Dest Unreachable reply.
|
// embedded original IP+UDP header in a Time Exceeded or Dest Unreachable reply.
|
||||||
func extractOriginalUDPPort(data []byte) (dstPort int, ok bool) {
|
func (t *Tracer) extractOriginalUDPPort(data []byte) (dstPort int, ok bool) {
|
||||||
if len(data) < 28 {
|
if len(data) < 28 {
|
||||||
fmt.Fprintf(os.Stderr, "[debug] extractUDP: too short (%d bytes)\n", len(data))
|
if t.debug {
|
||||||
|
fmt.Fprintf(os.Stderr, "[debug] extractUDP: too short (%d bytes)\n", len(data))
|
||||||
|
}
|
||||||
return 0, false
|
return 0, false
|
||||||
}
|
}
|
||||||
ihl := int(data[0]&0x0f) * 4
|
ihl := int(data[0]&0x0f) * 4
|
||||||
if ihl < 20 || len(data) < ihl+8 {
|
if ihl < 20 || len(data) < ihl+8 {
|
||||||
fmt.Fprintf(os.Stderr, "[debug] extractUDP: bad IHL (%d)\n", ihl)
|
if t.debug {
|
||||||
|
fmt.Fprintf(os.Stderr, "[debug] extractUDP: bad IHL (%d)\n", ihl)
|
||||||
|
}
|
||||||
return 0, false
|
return 0, false
|
||||||
}
|
}
|
||||||
if data[9] != 17 {
|
if data[9] != 17 {
|
||||||
fmt.Fprintf(os.Stderr, "[debug] extractUDP: proto=%d (not UDP)\n", data[9])
|
if t.debug {
|
||||||
|
fmt.Fprintf(os.Stderr, "[debug] extractUDP: proto=%d (not UDP)\n", data[9])
|
||||||
|
}
|
||||||
return 0, false
|
return 0, false
|
||||||
}
|
}
|
||||||
dstPort = int(binary.BigEndian.Uint16(data[ihl+2 : ihl+4]))
|
dstPort = int(binary.BigEndian.Uint16(data[ihl+2 : ihl+4]))
|
||||||
fmt.Fprintf(os.Stderr, "[debug] extractUDP: dstPort=%d\n", dstPort)
|
if t.debug {
|
||||||
|
fmt.Fprintf(os.Stderr, "[debug] extractUDP: dstPort=%d\n", dstPort)
|
||||||
|
}
|
||||||
return dstPort, true
|
return dstPort, true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -921,6 +933,7 @@ func main() {
|
|||||||
noDNS := flag.Bool("n", false, "disable reverse DNS (show numeric IPs only)")
|
noDNS := flag.Bool("n", false, "disable reverse DNS (show numeric IPs only)")
|
||||||
count := flag.Int("count", 0, "stop after N complete probe rounds (0 = run forever)")
|
count := flag.Int("count", 0, "stop after N complete probe rounds (0 = run forever)")
|
||||||
dur := flag.Duration("duration", 0, "stop after this duration, e.g. 30s, 5m (0 = run forever)")
|
dur := flag.Duration("duration", 0, "stop after this duration, e.g. 30s, 5m (0 = run forever)")
|
||||||
|
debug := flag.Bool("debug", false, "enable debug output")
|
||||||
|
|
||||||
flag.Usage = func() {
|
flag.Usage = func() {
|
||||||
fmt.Fprintf(os.Stderr, `Usage: livetrace [options] <target>
|
fmt.Fprintf(os.Stderr, `Usage: livetrace [options] <target>
|
||||||
@ -968,6 +981,7 @@ if p == "winapi" && runtime.GOOS != "windows" {
|
|||||||
*count,
|
*count,
|
||||||
*dur,
|
*dur,
|
||||||
*noDNS,
|
*noDNS,
|
||||||
|
*debug,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "Error:", err)
|
fmt.Fprintln(os.Stderr, "Error:", err)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user