From 5ddf5b600f572634b4ef79428ade8c0949484b25 Mon Sep 17 00:00:00 2001 From: coyove Date: Thu, 27 Sep 2018 15:31:42 +0800 Subject: [PATCH] Fix IPv6 bug on android --- .gitignore | 1 + cmd/goflyway/main.go | 59 ++++++++++++++++++++++++++---------------- makefile | 2 +- proxy/ssvpn_interop.go | 10 ++++++- 4 files changed, 48 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index f77ee75..ac8b46b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ launch.json *.exe *.dll *.a +*.csv.* .vscode build/ .DS_Store diff --git a/cmd/goflyway/main.go b/cmd/goflyway/main.go index d04ee32..0c4f69f 100644 --- a/cmd/goflyway/main.go +++ b/cmd/goflyway/main.go @@ -95,11 +95,7 @@ var ( _ = flag.Bool("fast-open", true, "-- Placeholder --") ) -func loadConfig() { - if *cmdSection == "" { - return - } - +func loadConfig() error { path := *cmdConfig if path == "" { if runtime.GOOS == "windows" { @@ -110,22 +106,18 @@ func loadConfig() { } if _, err := os.Stat(path); err != nil { - return + return nil } buf, err := ioutil.ReadFile(path) if err != nil { - logger.L("Config", "Error", err) - return + return err } if strings.Contains(path, "shadowsocks.conf") { - logger.L("Config", "Shadowsocks") - cmds := make(map[string]interface{}) if err := json.Unmarshal(buf, &cmds); err != nil { - logger.L("Config", "Parse", err) - return + return err } *cmdKey = cmds["password"].(string) @@ -134,10 +126,6 @@ func loadConfig() { switch (*cmdKey)[1] { case 'w': *cmdUpstream = "ws://" + *cmdUpstream - case 's': - *cmdUnderlay = "https" - // case 'k': - // *cmdUnderlay = "kcp" case 'c': *cmdUpstream = "ws://" + *cmdUpstream + "/" + (*cmdKey)[2:] } @@ -146,16 +134,18 @@ func loadConfig() { *cmdLogLevel = "dbg" *cmdVPN = true *cmdGlobal = true - return + return nil + } + + if *cmdSection == "" { + return nil } cf, err := config.ParseConf(string(buf)) if err != nil { - logger.L("Config", "Parse", err) - return + return err } - logger.L("Config", "Section", *cmdSection) func(args ...interface{}) { for i := 0; i < len(args); i += 2 { switch f, name := args[i+1], strings.TrimSpace(args[i].(string)); f.(type) { @@ -195,6 +185,8 @@ func loadConfig() { "underlay ", cmdUnderlay, "autocert ", cmdAutoCert, ) + + return nil } var logger *logg.Logger @@ -257,13 +249,21 @@ func main() { } runtime.GOMAXPROCS(runtime.NumCPU() * 4) + configerr := loadConfig() logger = &logg.Logger{} logger.SetFormats(logg.FmtLongTime, logg.FmtShortFile, logg.FmtLevel) logger.Parse(*cmdLogLevel) - logger.L("Hello", "goflyway build "+version) - loadConfig() + if *cmdSection != "" { + logger.L("Config", "Section", *cmdSection) + } + + if configerr != nil { + logger.L("Config", "Error", configerr) + } + + logger.L("Build", "goflyway "+version) if *cmdUpstream != "" { logger.L("Role", "Client") @@ -534,6 +534,21 @@ func parseAuthURL(in string) (auth string, upstream string, header string, dummy } if _, _, err := net.SplitHostPort(upstream); err != nil { + if strings.Count(upstream, ":") > 1 { + lc := strings.LastIndex(upstream, ":") + port := upstream[lc+1:] + upstream = upstream[:lc] + upip := net.ParseIP(upstream) + if bs := []byte(upip); len(bs) == net.IPv6len { + upstream = "[" + for i := 0; i < 16; i += 2 { + upstream += strconv.FormatInt(int64(bs[i])*256+int64(bs[i+1]), 16) + ":" + } + upstream = upstream[:len(upstream)-1] + "]:" + port + return + } + } + logger.F("Init", "Invalid server destination", upstream, err) } diff --git a/makefile b/makefile index ff8d445..293ce13 100644 --- a/makefile +++ b/makefile @@ -18,7 +18,7 @@ release: windows darwin linux # don't use ldflags -X release = \ sed -i -- 's/__devel__/$(VERSION)/g' $(SOURCE) && \ - GOOS=$(1) GOARCH=$(2) CGO_ENABLED=1 go build -o build/$(3) ./cmd/goflyway && \ + GOOS=$(1) GOARCH=$(2) go build -o build/$(3) ./cmd/goflyway && \ sed -i -- 's/$(VERSION)/__devel__/g' $(SOURCE) && \ cp -t build/ $(LIST) tar = cd build && tar -cvzf $(NAME)_$(1)_$(2).tar.gz $(NAME) $(LIST) && rm $(NAME) diff --git a/proxy/ssvpn_interop.go b/proxy/ssvpn_interop.go index 46317cd..edbfc55 100644 --- a/proxy/ssvpn_interop.go +++ b/proxy/ssvpn_interop.go @@ -16,7 +16,15 @@ import ( ) func vpnDial(address string) (net.Conn, error) { - sock, err := fd.Socket(syscall.AF_INET) + var family int + family = syscall.AF_INET + + if address[0] == '[' { + // naive match + family = syscall.AF_INET6 + } + + sock, err := fd.Socket(family) if err != nil { return nil, err }