From c21a7d8c4dc04ab7f6078f53b4a0b66e75a534ae Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Sat, 18 Aug 2018 23:59:21 +0800 Subject: [PATCH] forawrder: change localip to interface --- README.md | 2 +- proxy/direct.go | 30 +++++++++++++++++++++++++----- proxy/forwarder.go | 6 +++--- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 48c2488..53bd636 100644 --- a/README.md +++ b/README.md @@ -217,7 +217,7 @@ Available forward strategies: Forwarder option scheme: FORWARD_URL#OPTIONS priority: set the priority of that forwarder, default:0 - localip: set local ip address which will be used to connect remote forwarder + interface: set local interface or ip address used to connect remote forwarder - Examples: socks5://1.1.1.1:1080#priority=100 diff --git a/proxy/direct.go b/proxy/direct.go index bf553eb..ed2e295 100644 --- a/proxy/direct.go +++ b/proxy/direct.go @@ -9,18 +9,38 @@ import ( // Direct proxy type Direct struct { *net.Dialer + addr net.Addr } // Default dialer var Default = &Direct{Dialer: &net.Dialer{}} // NewDirect returns a Direct dialer -func NewDirect(localip string) *Direct { - d := &net.Dialer{LocalAddr: &net.TCPAddr{ - IP: net.ParseIP(localip), +func NewDirect(intface string) *Direct { + d := &Direct{} + dialer := &net.Dialer{} + + ip := net.ParseIP(intface) + if ip == nil { + iface, err := net.InterfaceByName(intface) + if err != nil { + return nil + } + + addrs, err := iface.Addrs() + if err != nil { + d.addr = addrs[0] + } + } + + d.addr = &net.TCPAddr{ + IP: ip, Port: 0, - }} - return &Direct{Dialer: d} + } + + dialer.LocalAddr = d.addr + + return d } // Addr returns forwarder's address diff --git a/proxy/forwarder.go b/proxy/forwarder.go index 6249d65..5ec7b33 100644 --- a/proxy/forwarder.go +++ b/proxy/forwarder.go @@ -19,7 +19,7 @@ type Forwarder struct { failures uint32 MaxFailures uint32 //maxfailures to set to Disabled latency int64 - localip string // local ip address + intface string // local interface or ip address } // ForwarderFromURL parses `forward=` command value and returns a new forwarder @@ -31,7 +31,7 @@ func ForwarderFromURL(s string) (f *Forwarder, err error) { err = f.parseOption(ss[1]) } - var d Dialer = NewDirect(f.localip) + var d Dialer = NewDirect(f.intface) for _, url := range strings.Split(ss[0], ",") { d, err = DialerFromURL(url, d) if err != nil { @@ -58,7 +58,7 @@ func (f *Forwarder) parseOption(option string) error { } f.Priority = int(priority) - f.localip = query.Get("localip") + f.intface = query.Get("interface") return err }