diff --git a/CHANGELOG.md b/CHANGELOG.md index f304379..5c7a25a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v0.0.7 + +* udp dialer support network "udp" or "udp4" or "udp6" +* tcp dialer support network "tcp" or "tcp4" or "tcp6" + # v0.0.6 * udp listener support network "udp" or "udp4" or "udp6" diff --git a/bin/example/udp.jsonnet b/bin/example/udp.jsonnet index 7c520a0..7fa93f6 100644 --- a/bin/example/udp.jsonnet +++ b/bin/example/udp.jsonnet @@ -20,6 +20,8 @@ listen: ':1053', // remote target addr to: '8.8.8.8:53', + // "udp" "udp4" "udp6" + toNetwork:"udp", // udp max frame length, default 1024*2 size: 1500, // udp timeout, default 3m diff --git a/config/udp_forward.go b/config/udp_forward.go index baa7275..d01f620 100644 --- a/config/udp_forward.go +++ b/config/udp_forward.go @@ -9,6 +9,8 @@ type UDPForward struct { Listen string `json:"listen"` // remote target addr To string `json:"to"` + // "udp" "udp4" "udp6" + ToNetwork string `json:"toNetwork"` // udp max frame length, default 1024*2 Size int `json:"size"` // udp timeout, default 3m diff --git a/dialer/dialer.go b/dialer/dialer.go index 2cba5b2..163d600 100644 --- a/dialer/dialer.go +++ b/dialer/dialer.go @@ -49,7 +49,7 @@ func New(nk *network.Network, log *slog.Logger, pool *pool.Pool, opts *config.Di case HttpTls: dialer, e = newHttpDialer(nk, log, opts, u, true) case Basic: - if opts.Network == `udp` { + if opts.Network == `udp` || opts.Network == `udp4` || opts.Network == `udp6` { dialer, e = newUdpDialer(nk, log, opts, u, pool) } else { dialer, e = newBasicDialer(nk, log, opts, u, false) diff --git a/dialer/udp.go b/dialer/udp.go index 527b324..6a0fd4c 100644 --- a/dialer/udp.go +++ b/dialer/udp.go @@ -53,7 +53,7 @@ func newUdpDialer( } var ( - network = `tcp` + network = `udp` addr = u.Host query url.Values ) @@ -109,11 +109,11 @@ func (u *udpDialer) Tag() string { return u.remoteAddr.Dialer } func (u *udpDialer) Connect(ctx context.Context) (conn *Conn, e error) { - addr, e := net.ResolveUDPAddr(`udp`, u.remoteAddr.Addr) + addr, e := net.ResolveUDPAddr(u.remoteAddr.Network, u.remoteAddr.Addr) if e != nil { return } - c, e := net.DialUDP("udp", nil, addr) + c, e := net.DialUDP(u.remoteAddr.Network, nil, addr) if e != nil { return } diff --git a/internal/network/network.go b/internal/network/network.go index fd3a439..e6e9eb4 100644 --- a/internal/network/network.go +++ b/internal/network/network.go @@ -126,6 +126,8 @@ func (n *Network) Dialer(network string, addr string, cfg *tls.Config) (dialer D n.pipeList.PushBack(dialer) return case `tcp`: + case `tcp4`: + case `tcp6`: case `unix`: if runtime.GOOS != `linux` { e = ErrNetworkUnix diff --git a/internal/udp/udp.go b/internal/udp/udp.go index c794d40..96b7cad 100644 --- a/internal/udp/udp.go +++ b/internal/udp/udp.go @@ -1,6 +1,7 @@ package udp import ( + "errors" "log/slog" "net" "sync" @@ -11,10 +12,12 @@ import ( ) type UDP struct { - tag string - listen string - c *net.UDPConn - to *net.UDPAddr + tag string + listen string + c *net.UDPConn + toNetwork string + to string + timeout time.Duration size int mutex sync.Mutex @@ -31,9 +34,19 @@ func New(log *slog.Logger, opts *config.UDPForward) (u *UDP, e error) { network := opts.Network if network == `` { network = `udp` + } else if network != `udp` && network != `udp4` && network != `udp6` { + e = errors.New(`network not supported: ` + network) + return + } + toNetwork := opts.ToNetwork + if toNetwork == `` { + toNetwork = `udp` + } else if toNetwork != `udp` && toNetwork != `udp4` && toNetwork != `udp6` { + e = errors.New(`network not supported: ` + toNetwork) + return } if tag == `` { - tag = network + ` ` + opts.Listen + ` -> ` + opts.To + tag = network + ` ` + opts.Listen + ` -> ` + toNetwork + ` ` + opts.To } log = log.With( `tag`, tag, @@ -49,11 +62,6 @@ func New(log *slog.Logger, opts *config.UDPForward) (u *UDP, e error) { log.Error(`listen udp fial`, `error`, e) return } - to, e := net.ResolveUDPAddr(`udp`, opts.To) - if e != nil { - log.Error(`listen udp fial`, `error`, e) - return - } var timeout time.Duration if opts.Timeout == `` { timeout = time.Minute * 3 @@ -70,15 +78,16 @@ func New(log *slog.Logger, opts *config.UDPForward) (u *UDP, e error) { } log.Info(`udp forward`, `timeout`, timeout, `size`, size) u = &UDP{ - tag: tag, - c: c, - listen: opts.Listen, - to: to, - timeout: timeout, - size: size, - keys: make(map[string]*remoteConn), - done: make(chan struct{}), - log: log, + tag: tag, + c: c, + listen: opts.Listen, + to: opts.To, + toNetwork: opts.ToNetwork, + timeout: timeout, + size: size, + keys: make(map[string]*remoteConn), + done: make(chan struct{}), + log: log, } return } @@ -86,7 +95,7 @@ func (u *UDP) Info() any { return map[string]any{ `tag`: u.tag, `listen`: u.listen, - `to`: u.to.String(), + `to`: u.to, `timeout`: u.timeout.String(), `size`: u.size, } @@ -100,6 +109,7 @@ func (u *UDP) Serve() (e error) { c *remoteConn ok bool conn *net.UDPConn + to *net.UDPAddr ) for { n, addr, e = u.c.ReadFromUDP(b) @@ -115,7 +125,12 @@ func (u *UDP) Serve() (e error) { continue } } else { - conn, e = net.DialUDP(`udp`, nil, u.to) + to, e = net.ResolveUDPAddr(u.toNetwork, u.to) + if e != nil { + u.log.Warn("ResolveUDPAddr fail", `error`, e) + continue + } + conn, e = net.DialUDP(u.toNetwork, nil, to) if e != nil { u.log.Warn("DialUDP fail", `error`, e) continue diff --git a/script/conf.sh b/script/conf.sh index 581d908..d605baa 100644 --- a/script/conf.sh +++ b/script/conf.sh @@ -1,7 +1,7 @@ Target="streamf" Docker="king011/streamf" Dir=$(cd "$(dirname $BASH_SOURCE)/.." && pwd) -Version="v0.0.6" +Version="v0.0.7" Platforms=( darwin/amd64 windows/amd64