add: 新功能,快速路由测试

This commit is contained in:
sjlleo
2022-06-06 15:27:09 +08:00
parent 18a9eefec9
commit e4320da08d
3 changed files with 258 additions and 0 deletions

111
fast_trace/basic.go Normal file
View File

@@ -0,0 +1,111 @@
package fastTrace
type AllLocationCollection struct {
Beijing BackBoneCollection
Shanghai BackBoneCollection
Guangzhou BackBoneCollection
}
type BackBoneCollection struct {
Location string
CT163 ISPCollection
CTCN2 ISPCollection
CU169 ISPCollection
CU9929 ISPCollection
CM ISPCollection
EDU ISPCollection
}
type ISPCollection struct {
ISPName string
IP string
}
const (
CT163 string = "电信 163 AS4134"
CTCN2 string = "电信 CN2 AS4809"
CU169 string = "联通 169 AS4837"
CU9929 string = "联通 A网 AS9929"
CM string = "移动 骨干网 AS9808"
EDU string = "教育网 CERNET AS4538"
)
var TestIPsCollection = AllLocationCollection{
Beijing: Beijing,
Shanghai: Shanghai,
Guangzhou: Guangzhou,
}
var Beijing = BackBoneCollection{
Location: "北京",
CT163: ISPCollection{
ISPName: CT163,
IP: "106.37.67.1",
},
CU169: ISPCollection{
ISPName: CU169,
IP: "123.125.96.156",
},
CM: ISPCollection{
ISPName: CM,
IP: "211.136.25.153",
},
EDU: ISPCollection{
ISPName: EDU,
IP: "101.6.15.130",
},
}
var Shanghai = BackBoneCollection{
Location: "上海",
CT163: ISPCollection{
ISPName: CT163,
IP: "101.226.28.198",
},
CTCN2: ISPCollection{
ISPName: CTCN2,
IP: "58.32.4.1",
},
CU169: ISPCollection{
ISPName: CU169,
IP: "139.226.206.150",
},
CU9929: ISPCollection{
ISPName: CU9929,
IP: "210.13.86.1",
},
CM: ISPCollection{
ISPName: CM,
IP: "120.204.34.85",
},
EDU: ISPCollection{
ISPName: EDU,
IP: "202.120.58.155",
},
}
var Guangzhou = BackBoneCollection{
Location: "广州",
CT163: ISPCollection{
ISPName: CT163,
IP: "106.37.67.1",
},
CU169: ISPCollection{
ISPName: CU169,
IP: "123.125.96.156",
},
CM: ISPCollection{
ISPName: CM,
IP: "120.198.26.254",
},
}

136
fast_trace/fast_trace.go Normal file
View File

@@ -0,0 +1,136 @@
package fastTrace
import (
"fmt"
"log"
"net"
"time"
"github.com/xgadget-lab/nexttrace/config"
"github.com/xgadget-lab/nexttrace/ipgeo"
"github.com/xgadget-lab/nexttrace/printer"
"github.com/xgadget-lab/nexttrace/reporter"
"github.com/xgadget-lab/nexttrace/trace"
)
type FastTracer struct {
Preference config.Preference
TracerouteMethod trace.Method
}
func (f *FastTracer) tracert(location string, ispCollection ISPCollection) {
fmt.Printf("『%s %s 』\n", location, ispCollection.ISPName)
fmt.Printf("traceroute to %s, 30 hops max, 32 byte packets\n", ispCollection.IP)
ip := net.ParseIP(ispCollection.IP)
var conf = trace.Config{
DestIP: ip,
DestPort: 80,
MaxHops: 30,
NumMeasurements: 3,
ParallelRequests: 18,
RDns: !f.Preference.NoRDNS,
IPGeoSource: ipgeo.GetSource(f.Preference.DataOrigin),
Timeout: 1 * time.Second,
}
if f.TracerouteMethod == trace.ICMPTrace {
conf.RealtimePrinter = printer.RealtimePrinter
}
res, err := trace.Traceroute(f.TracerouteMethod, conf)
if err != nil {
log.Fatal(err)
}
if f.TracerouteMethod == trace.TCPTrace {
printer.TracerouteTablePrinter(res)
}
if f.Preference.AlwaysRoutePath {
r := reporter.New(res, ip.String())
r.Print()
}
}
func initialize() *FastTracer {
configData, err := config.Read()
// Initialize Default Config
if err != nil || configData.DataOrigin == "" {
if configData, err = config.AutoGenerate(); err != nil {
log.Fatal(err)
}
}
// Set Token from Config
ipgeo.SetToken(configData.Token)
return &FastTracer{
Preference: configData.Preference,
}
}
func (f *FastTracer) testAll() {
f.testCT()
f.testCU()
f.testCM()
f.testEDU()
}
func (f *FastTracer) testCT() {
f.tracert(TestIPsCollection.Beijing.Location, TestIPsCollection.Beijing.CT163)
f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.CT163)
f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.CTCN2)
f.tracert(TestIPsCollection.Guangzhou.Location, TestIPsCollection.Guangzhou.CT163)
}
func (f *FastTracer) testCU() {
f.tracert(TestIPsCollection.Beijing.Location, TestIPsCollection.Beijing.CU169)
f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.CU169)
f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.CU9929)
f.tracert(TestIPsCollection.Guangzhou.Location, TestIPsCollection.Guangzhou.CU169)
}
func (f *FastTracer) testCM() {
f.tracert(TestIPsCollection.Beijing.Location, TestIPsCollection.Beijing.CM)
f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.CM)
f.tracert(TestIPsCollection.Guangzhou.Location, TestIPsCollection.Guangzhou.CM)
}
func (f *FastTracer) testEDU() {
f.tracert(TestIPsCollection.Beijing.Location, TestIPsCollection.Beijing.EDU)
f.tracert(TestIPsCollection.Shanghai.Location, TestIPsCollection.Shanghai.EDU)
}
func FastTest(tm bool) {
var c string
fmt.Println("您想测试哪些ISP的路由\n1. 国内四网\n2. 电信\n3. 联通\n4. 移动\n5. 教育网")
fmt.Print("请选择选项:")
fmt.Scanln(&c)
ft := initialize()
if !tm {
ft.TracerouteMethod = trace.ICMPTrace
fmt.Println("您将默认使用ICMP协议进行路由跟踪如果您想使用TCP SYN进行路由跟踪可以加入 -T 参数")
} else {
ft.TracerouteMethod = trace.TCPTrace
}
switch c {
case "1":
ft.testAll()
case "2":
ft.testCT()
case "3":
ft.testCU()
case "4":
ft.testCM()
case "5":
ft.testEDU()
default:
ft.testAll()
}
}

11
main.go
View File

@@ -10,6 +10,7 @@ import (
"time"
"github.com/xgadget-lab/nexttrace/config"
fastTrace "github.com/xgadget-lab/nexttrace/fast_trace"
"github.com/xgadget-lab/nexttrace/ipgeo"
"github.com/xgadget-lab/nexttrace/printer"
"github.com/xgadget-lab/nexttrace/reporter"
@@ -18,6 +19,7 @@ import (
)
var fSet = flag.NewFlagSet("", flag.ExitOnError)
var fastTest = fSet.Bool("f", false, "One-Key Fast Traceroute")
var tcpSYNFlag = fSet.Bool("T", false, "Use TCP SYN for tracerouting (default port is 80)")
var udpPackageFlag = fSet.Bool("U", false, "Use UDP Package for tracerouting (default port is 53 in UDP)")
var port = fSet.Int("p", 80, "Set SYN Traceroute Port")
@@ -44,6 +46,8 @@ func flagApply() string {
if len(os.Args) < 2 {
printArgHelp()
}
// flag parse
if !strings.HasPrefix(os.Args[1], "-") {
target = os.Args[1]
fSet.Parse(os.Args[2:])
@@ -52,6 +56,7 @@ func flagApply() string {
target = fSet.Arg(0)
}
// Print Version
if *ver {
os.Exit(0)
}
@@ -64,6 +69,12 @@ func flagApply() string {
os.Exit(0)
}
// -f Fast Test
if *fastTest {
fastTrace.FastTest(*tcpSYNFlag)
os.Exit(0)
}
if target == "" {
printArgHelp()
}