From f1dc40b0ce57d30e95d89532c749cc23cccfad00 Mon Sep 17 00:00:00 2001 From: Vladislav Yarmak Date: Mon, 26 Jun 2023 22:29:58 +0300 Subject: [PATCH] initial integration for bounded dialer in static mode --- main.go | 11 ++++++++++- utils.go | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 7d8b812..5a90672 100644 --- a/main.go +++ b/main.go @@ -72,6 +72,7 @@ type CLIArgs struct { passwdCost int positionalArgs []string proxy []string + sourceIPHints []net.IP } func parse_args() CLIArgs { @@ -101,6 +102,14 @@ func parse_args() CLIArgs { args.proxy = append(args.proxy, p) return nil }) + flag.Func("ip-hints", "a comma-separated list of addresses to use on dial attempts. Example: \"10.0.0.1,fe80::2,0.0.0.0,::\"", func(p string) error { + list, err := parseIPList(p) + if err != nil { + return err + } + args.sourceIPHints = list + return nil + }) flag.Parse() args.positionalArgs = flag.Args() return args @@ -146,7 +155,7 @@ func run() int { } defer auth.Stop() - var dialer Dialer = new(net.Dialer) + var dialer Dialer = NewBoundDialer(new(net.Dialer), args.sourceIPHints) for _, proxyURL := range args.proxy { newDialer, err := proxyDialerFromURL(proxyURL, dialer) if err != nil { diff --git a/utils.go b/utils.go index 2070019..5cbfc89 100644 --- a/utils.go +++ b/utils.go @@ -369,3 +369,19 @@ func maybeWrapWithContextDialer(d Dialer) ContextDialer { } return wrappedDialer{d} } + +func parseIPList(list string) ([]net.IP, error) { + res := make([]net.IP, 0) + for _, elem := range strings.Split(list, ",") { + elem = strings.TrimSpace(elem) + if len(elem) == 0 { + continue + } + if parsed := net.ParseIP(elem); parsed == nil { + return nil, fmt.Errorf("unable to parse IP address %q", elem) + } else { + res = append(res, parsed) + } + } + return res, nil +}