mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 09:25:41 +08:00
proxy: drop tcptun
and udptun
, use tcp
and udp
instead
This commit is contained in:
parent
adfb2fb9b4
commit
c9f3c20bc1
33
README.md
33
README.md
@ -56,13 +56,13 @@ we can set up local listeners as proxy servers, and forward requests to internet
|
|||||||
|SSR | | |√| |client only
|
|SSR | | |√| |client only
|
||||||
|SSH | | |√| |client only
|
|SSH | | |√| |client only
|
||||||
|SOCKS4 | | |√| |client only
|
|SOCKS4 | | |√| |client only
|
||||||
|
|TCP |√| |√| |tcp tunnel client & server
|
||||||
|
|UDP | |√| |√|udp tunnel client & server
|
||||||
|TLS |√| |√| |transport client & server
|
|TLS |√| |√| |transport client & server
|
||||||
|KCP | |√|√| |transport client & server
|
|KCP | |√|√| |transport client & server
|
||||||
|Unix |√| |√| |transport client & server
|
|Unix |√| |√| |transport client & server
|
||||||
|Websocket |√| |√| |transport client & server
|
|Websocket |√| |√| |transport client & server
|
||||||
|Simple-Obfs | | |√| |transport client only
|
|Simple-Obfs | | |√| |transport client only
|
||||||
|TCPTun |√| | | |transport server only
|
|
||||||
|UDPTun | |√| | |transport server only
|
|
||||||
|Redir |√| | | |linux only
|
|Redir |√| | | |linux only
|
||||||
|Redir6 |√| | | |linux only(ipv6)
|
|Redir6 |√| | | |linux only(ipv6)
|
||||||
|Reject | | |√|√|reject all requests
|
|Reject | | |√|√|reject all requests
|
||||||
@ -94,7 +94,12 @@ glider -h
|
|||||||
<summary>click to see details</summary>
|
<summary>click to see details</summary>
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
glider 0.12.3 usage:
|
glider 0.13.0 usage:
|
||||||
|
-check string
|
||||||
|
check=tcp[://HOST:PORT]: tcp port connect check
|
||||||
|
check=http://HOST[:PORT][/URI][#expect=STRING_IN_RESP_LINE]
|
||||||
|
check=file://SCRIPT_PATH: run a check script, healthy when exitcode=0, environment variables: FORWARDER_ADDR
|
||||||
|
check=disable: disable health check (default "http://www.msftconnecttest.com/connecttest.txt#expect=200")
|
||||||
-checkdisabledonly
|
-checkdisabledonly
|
||||||
check disabled fowarders only
|
check disabled fowarders only
|
||||||
-checkinterval int
|
-checkinterval int
|
||||||
@ -103,8 +108,6 @@ glider 0.12.3 usage:
|
|||||||
fowarder check timeout(seconds) (default 10)
|
fowarder check timeout(seconds) (default 10)
|
||||||
-checktolerance int
|
-checktolerance int
|
||||||
fowarder check tolerance(ms), switch only when new_latency < old_latency - tolerance, only used in lha mode
|
fowarder check tolerance(ms), switch only when new_latency < old_latency - tolerance, only used in lha mode
|
||||||
-checkwebsite string
|
|
||||||
fowarder check HTTP(NOT HTTPS) website address, format: HOST[:PORT], default port: 80 (default "www.apple.com")
|
|
||||||
-config string
|
-config string
|
||||||
config file path
|
config file path
|
||||||
-dialtimeout int
|
-dialtimeout int
|
||||||
@ -149,8 +152,8 @@ glider 0.12.3 usage:
|
|||||||
verbose mode
|
verbose mode
|
||||||
|
|
||||||
Available schemes:
|
Available schemes:
|
||||||
listen: mixed ss socks5 http vless trojan trojanc redir redir6 tcptun udptun tls ws unix kcp
|
listen: mixed ss socks5 http vless trojan trojanc redir redir6 tcp udp tls ws unix kcp
|
||||||
forward: reject ss socks4 socks5 http ssr ssh vless vmess trojan trojanc tls ws unix kcp simple-obfs
|
forward: reject ss socks4 socks5 http ssr ssh vless vmess trojan trojanc tcp udp tls ws unix kcp simple-obfs
|
||||||
|
|
||||||
Socks5 scheme:
|
Socks5 scheme:
|
||||||
socks://[user:pass@]host:port
|
socks://[user:pass@]host:port
|
||||||
@ -292,26 +295,20 @@ Examples:
|
|||||||
./glider -listen redir://:1081 -forward ss://method:pass@1.1.1.1:8443
|
./glider -listen redir://:1081 -forward ss://method:pass@1.1.1.1:8443
|
||||||
-listen on :1081 as a transparent redirect server, forward all requests via remote ss server.
|
-listen on :1081 as a transparent redirect server, forward all requests via remote ss server.
|
||||||
|
|
||||||
./glider -listen redir://:1081 -forward "ssr://method:pass@1.1.1.1:8444?protocol=a&protocol_param=b&obfs=c&obfs_param=d"
|
|
||||||
-listen on :1081 as a transparent redirect server, forward all requests via remote ssr server.
|
|
||||||
|
|
||||||
./glider -listen redir://:1081 -forward "tls://abc.com:443,vmess://security:uuid@?alterID=10"
|
./glider -listen redir://:1081 -forward "tls://abc.com:443,vmess://security:uuid@?alterID=10"
|
||||||
-listen on :1081 as a transparent redirect server, forward all requests via remote tls+vmess server.
|
-listen on :1081 as a transparent redirect server, forward all requests via remote tls+vmess server.
|
||||||
|
|
||||||
./glider -listen redir://:1081 -forward "ws://1.1.1.1:80,vmess://security:uuid@?alterID=10"
|
./glider -listen tcp://:80 -forward tcp://2.2.2.2:80
|
||||||
-listen on :1081 as a transparent redirect server, forward all requests via remote ws+vmess server.
|
-tcp tunnel: listen on :80 and forward all requests to 2.2.2.2:80.
|
||||||
|
|
||||||
./glider -listen tcptun://:80=2.2.2.2:80 -forward ss://method:pass@1.1.1.1:8443
|
./glider -listen udp://:53 -forward ss://method:pass@1.1.1.1:8443,udp://8.8.8.8:53
|
||||||
-listen on :80 and forward all requests to 2.2.2.2:80 via remote ss server.
|
|
||||||
|
|
||||||
./glider -listen udptun://:53=8.8.8.8:53 -forward ss://method:pass@1.1.1.1:8443
|
|
||||||
-listen on :53 and forward all udp requests to 8.8.8.8:53 via remote ss server.
|
-listen on :53 and forward all udp requests to 8.8.8.8:53 via remote ss server.
|
||||||
|
|
||||||
./glider -listen socks5://:1080 -listen http://:8080 -forward ss://method:pass@1.1.1.1:8443
|
./glider -listen socks5://:1080 -listen http://:8080 -forward ss://method:pass@1.1.1.1:8443
|
||||||
-listen on :1080 as socks5 server, :8080 as http proxy server, forward all requests via remote ss server.
|
-listen on :1080 as socks5 server, :8080 as http proxy server, forward all requests via remote ss server.
|
||||||
|
|
||||||
./glider -listen redir://:1081 -dns=:53 -dnsserver=8.8.8.8:53 -forward ss://method:pass@server1:port1,ss://method:pass@server2:port2
|
./glider -listen redir://:1081 -dns=:53 -dnsserver=8.8.8.8:53 -forward ss://method:pass@server:port
|
||||||
-listen on :1081 as transparent redirect server, :53 as dns server, use forward chain: server1 -> server2.
|
-listen on :1081 as transparent redirect server, :53 as dns server, forward via ss server.
|
||||||
|
|
||||||
./glider -listen socks5://:1080 -forward ss://method:pass@server1:port1 -forward ss://method:pass@server2:port2 -strategy rr
|
./glider -listen socks5://:1080 -forward ss://method:pass@server1:port1 -forward ss://method:pass@server2:port2 -strategy rr
|
||||||
-listen on :1080 as socks5 server, forward requests via server1 and server2 in round robin mode.
|
-listen on :1080 as socks5 server, forward requests via server1 and server2 in round robin mode.
|
||||||
|
20
config.go
20
config.go
@ -131,8 +131,8 @@ func usage() {
|
|||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
|
|
||||||
fmt.Fprintf(w, "Available schemes:\n")
|
fmt.Fprintf(w, "Available schemes:\n")
|
||||||
fmt.Fprintf(w, " listen: mixed ss socks5 http vless trojan trojanc redir redir6 tcptun udptun tls ws unix kcp\n")
|
fmt.Fprintf(w, " listen: mixed ss socks5 http vless trojan trojanc redir redir6 tcp udp tls ws unix kcp\n")
|
||||||
fmt.Fprintf(w, " forward: reject ss socks4 socks5 http ssr ssh vless vmess trojan trojanc tls ws unix kcp simple-obfs\n")
|
fmt.Fprintf(w, " forward: reject ss socks4 socks5 http ssr ssh vless vmess trojan trojanc tcp udp tls ws unix kcp simple-obfs\n")
|
||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
|
|
||||||
fmt.Fprintf(w, "Socks5 scheme:\n")
|
fmt.Fprintf(w, "Socks5 scheme:\n")
|
||||||
@ -302,26 +302,20 @@ func usage() {
|
|||||||
fmt.Fprintf(w, " "+app+" -listen redir://:1081 -forward ss://method:pass@1.1.1.1:8443\n")
|
fmt.Fprintf(w, " "+app+" -listen redir://:1081 -forward ss://method:pass@1.1.1.1:8443\n")
|
||||||
fmt.Fprintf(w, " -listen on :1081 as a transparent redirect server, forward all requests via remote ss server.\n")
|
fmt.Fprintf(w, " -listen on :1081 as a transparent redirect server, forward all requests via remote ss server.\n")
|
||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
fmt.Fprintf(w, " "+app+" -listen redir://:1081 -forward \"ssr://method:pass@1.1.1.1:8444?protocol=a&protocol_param=b&obfs=c&obfs_param=d\"\n")
|
|
||||||
fmt.Fprintf(w, " -listen on :1081 as a transparent redirect server, forward all requests via remote ssr server.\n")
|
|
||||||
fmt.Fprintf(w, "\n")
|
|
||||||
fmt.Fprintf(w, " "+app+" -listen redir://:1081 -forward \"tls://abc.com:443,vmess://security:uuid@?alterID=10\"\n")
|
fmt.Fprintf(w, " "+app+" -listen redir://:1081 -forward \"tls://abc.com:443,vmess://security:uuid@?alterID=10\"\n")
|
||||||
fmt.Fprintf(w, " -listen on :1081 as a transparent redirect server, forward all requests via remote tls+vmess server.\n")
|
fmt.Fprintf(w, " -listen on :1081 as a transparent redirect server, forward all requests via remote tls+vmess server.\n")
|
||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
fmt.Fprintf(w, " "+app+" -listen redir://:1081 -forward \"ws://1.1.1.1:80,vmess://security:uuid@?alterID=10\"\n")
|
fmt.Fprintf(w, " "+app+" -listen tcp://:80 -forward tcp://2.2.2.2:80\n")
|
||||||
fmt.Fprintf(w, " -listen on :1081 as a transparent redirect server, forward all requests via remote ws+vmess server.\n")
|
fmt.Fprintf(w, " -tcp tunnel: listen on :80 and forward all requests to 2.2.2.2:80.\n")
|
||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
fmt.Fprintf(w, " "+app+" -listen tcptun://:80=2.2.2.2:80 -forward ss://method:pass@1.1.1.1:8443\n")
|
fmt.Fprintf(w, " "+app+" -listen udp://:53 -forward ss://method:pass@1.1.1.1:8443,udp://8.8.8.8:53\n")
|
||||||
fmt.Fprintf(w, " -listen on :80 and forward all requests to 2.2.2.2:80 via remote ss server.\n")
|
|
||||||
fmt.Fprintf(w, "\n")
|
|
||||||
fmt.Fprintf(w, " "+app+" -listen udptun://:53=8.8.8.8:53 -forward ss://method:pass@1.1.1.1:8443\n")
|
|
||||||
fmt.Fprintf(w, " -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote ss server.\n")
|
fmt.Fprintf(w, " -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote ss server.\n")
|
||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
fmt.Fprintf(w, " "+app+" -listen socks5://:1080 -listen http://:8080 -forward ss://method:pass@1.1.1.1:8443\n")
|
fmt.Fprintf(w, " "+app+" -listen socks5://:1080 -listen http://:8080 -forward ss://method:pass@1.1.1.1:8443\n")
|
||||||
fmt.Fprintf(w, " -listen on :1080 as socks5 server, :8080 as http proxy server, forward all requests via remote ss server.\n")
|
fmt.Fprintf(w, " -listen on :1080 as socks5 server, :8080 as http proxy server, forward all requests via remote ss server.\n")
|
||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
fmt.Fprintf(w, " "+app+" -listen redir://:1081 -dns=:53 -dnsserver=8.8.8.8:53 -forward ss://method:pass@server1:port1,ss://method:pass@server2:port2\n")
|
fmt.Fprintf(w, " "+app+" -listen redir://:1081 -dns=:53 -dnsserver=8.8.8.8:53 -forward ss://method:pass@server:port\n")
|
||||||
fmt.Fprintf(w, " -listen on :1081 as transparent redirect server, :53 as dns server, use forward chain: server1 -> server2.\n")
|
fmt.Fprintf(w, " -listen on :1081 as transparent redirect server, :53 as dns server, forward via ss server.\n")
|
||||||
fmt.Fprintf(w, "\n")
|
fmt.Fprintf(w, "\n")
|
||||||
fmt.Fprintf(w, " "+app+" -listen socks5://:1080 -forward ss://method:pass@server1:port1 -forward ss://method:pass@server2:port2 -strategy rr\n")
|
fmt.Fprintf(w, " "+app+" -listen socks5://:1080 -forward ss://method:pass@server1:port1 -forward ss://method:pass@server2:port2 -strategy rr\n")
|
||||||
fmt.Fprintf(w, " -listen on :1080 as socks5 server, forward requests via server1 and server2 in round robin mode.\n")
|
fmt.Fprintf(w, " -listen on :1080 as socks5 server, forward requests via server1 and server2 in round robin mode.\n")
|
||||||
|
@ -51,12 +51,6 @@ listen=socks5://:1080
|
|||||||
# listen on 1081 as a linux transparent proxy server.
|
# listen on 1081 as a linux transparent proxy server.
|
||||||
# listen=redir://:1081
|
# listen=redir://:1081
|
||||||
|
|
||||||
# listen on 1082 as a tcp tunnel, all requests to :1082 will be forward to 1.1.1.1:80
|
|
||||||
# listen=tcptun://:1082=1.1.1.1:80
|
|
||||||
|
|
||||||
# listen on 1083 as a udp tunnel, all requests to :1083 will be forward to 1.1.1.1:53
|
|
||||||
# listen=udptun://:1083=1.1.1.1:53
|
|
||||||
|
|
||||||
# http over tls (HTTPS proxy)
|
# http over tls (HTTPS proxy)
|
||||||
# listen=tls://:443?cert=crtFilePath&key=keyFilePath,http://
|
# listen=tls://:443?cert=crtFilePath&key=keyFilePath,http://
|
||||||
|
|
||||||
|
@ -22,8 +22,4 @@ import (
|
|||||||
_ "github.com/nadoo/glider/proxy/vless"
|
_ "github.com/nadoo/glider/proxy/vless"
|
||||||
_ "github.com/nadoo/glider/proxy/vmess"
|
_ "github.com/nadoo/glider/proxy/vmess"
|
||||||
_ "github.com/nadoo/glider/proxy/ws"
|
_ "github.com/nadoo/glider/proxy/ws"
|
||||||
|
|
||||||
// deprecated, to be removed.
|
|
||||||
_ "github.com/nadoo/glider/proxy/tcptun"
|
|
||||||
_ "github.com/nadoo/glider/proxy/udptun"
|
|
||||||
)
|
)
|
||||||
|
2
go.mod
2
go.mod
@ -15,7 +15,7 @@ require (
|
|||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
|
||||||
github.com/xtaci/kcp-go/v5 v5.6.1
|
github.com/xtaci/kcp-go/v5 v5.6.1
|
||||||
golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392
|
golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect
|
golang.org/x/sys v0.0.0-20201126233918-771906719818 // indirect
|
||||||
golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b // indirect
|
golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b // indirect
|
||||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
|
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
|
||||||
)
|
)
|
||||||
|
4
go.sum
4
go.sum
@ -128,8 +128,8 @@ golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY=
|
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY=
|
||||||
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
|
golang.org/x/sys v0.0.0-20201126233918-771906719818 h1:f1CIuDlJhwANEC2MM87MBEVMr3jl5bifgsfj90XAF9c=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
@ -8,7 +8,7 @@ type Proxy interface {
|
|||||||
Dial(network, addr string) (c net.Conn, dialer Dialer, err error)
|
Dial(network, addr string) (c net.Conn, dialer Dialer, err error)
|
||||||
|
|
||||||
// DialUDP connects to the given address via the proxy.
|
// DialUDP connects to the given address via the proxy.
|
||||||
DialUDP(network, addr string) (pc net.PacketConn, writeTo net.Addr, err error)
|
DialUDP(network, addr string) (pc net.PacketConn, dialer UDPDialer, writeTo net.Addr, err error)
|
||||||
|
|
||||||
// Get the dialer by dstAddr.
|
// Get the dialer by dstAddr.
|
||||||
NextDialer(dstAddr string) Dialer
|
NextDialer(dstAddr string) Dialer
|
||||||
|
@ -124,7 +124,7 @@ func (s *Socks5) ListenAndServeUDP() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
lpc, nextHop, err := s.proxy.DialUDP("udp", c.tgtAddr.String())
|
lpc, _, nextHop, err := s.proxy.DialUDP("udp", c.tgtAddr.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.F("[socks5u] remote dial error: %v", err)
|
log.F("[socks5u] remote dial error: %v", err)
|
||||||
continue
|
continue
|
||||||
|
@ -108,7 +108,7 @@ func (s *SS) ListenAndServeUDP() {
|
|||||||
var pc *PktConn
|
var pc *PktConn
|
||||||
v, ok := nm.Load(raddr.String())
|
v, ok := nm.Load(raddr.String())
|
||||||
if !ok && v == nil {
|
if !ok && v == nil {
|
||||||
lpc, nextHop, err := s.proxy.DialUDP("udp", c.tgtAddr.String())
|
lpc, _, nextHop, err := s.proxy.DialUDP("udp", c.tgtAddr.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.F("[ssu] remote dial error: %v", err)
|
log.F("[ssu] remote dial error: %v", err)
|
||||||
continue
|
continue
|
||||||
|
@ -1,99 +0,0 @@
|
|||||||
package tcptun
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"net"
|
|
||||||
"net/url"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/nadoo/glider/log"
|
|
||||||
"github.com/nadoo/glider/proxy"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TCPTun struct.
|
|
||||||
type TCPTun struct {
|
|
||||||
proxy proxy.Proxy
|
|
||||||
addr string
|
|
||||||
|
|
||||||
raddr string
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proxy.RegisterServer("tcptun", NewTCPTunServer)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewTCPTun returns a tcptun proxy.
|
|
||||||
func NewTCPTun(s string, p proxy.Proxy) (*TCPTun, error) {
|
|
||||||
u, err := url.Parse(s)
|
|
||||||
if err != nil {
|
|
||||||
log.F("[tcptun] parse err: %s", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
addr := u.Host
|
|
||||||
d := strings.Split(addr, "=")
|
|
||||||
if len(d) < 2 {
|
|
||||||
return nil, errors.New("error in strings.Split")
|
|
||||||
}
|
|
||||||
|
|
||||||
t := &TCPTun{
|
|
||||||
proxy: p,
|
|
||||||
addr: d[0],
|
|
||||||
raddr: d[1],
|
|
||||||
}
|
|
||||||
|
|
||||||
return t, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewTCPTunServer returns a udp tunnel server.
|
|
||||||
func NewTCPTunServer(s string, p proxy.Proxy) (proxy.Server, error) {
|
|
||||||
return NewTCPTun(s, p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListenAndServe listens on server's addr and serves connections.
|
|
||||||
func (s *TCPTun) ListenAndServe() {
|
|
||||||
l, err := net.Listen("tcp", s.addr)
|
|
||||||
if err != nil {
|
|
||||||
log.F("[tcptun] failed to listen on %s: %v", s.addr, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
log.F("[tcptun] listening TCP on %s", s.addr)
|
|
||||||
|
|
||||||
for {
|
|
||||||
c, err := l.Accept()
|
|
||||||
if err != nil {
|
|
||||||
log.F("[tcptun] failed to accept: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
go s.Serve(c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Serve serves a connection.
|
|
||||||
func (s *TCPTun) Serve(c net.Conn) {
|
|
||||||
defer c.Close()
|
|
||||||
|
|
||||||
if c, ok := c.(*net.TCPConn); ok {
|
|
||||||
c.SetKeepAlive(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
rc, dialer, err := s.proxy.Dial("tcp", s.raddr)
|
|
||||||
if err != nil {
|
|
||||||
log.F("[tcptun] %s <-> %s via %s, error in dial: %v", c.RemoteAddr(), s.addr, dialer.Addr(), err)
|
|
||||||
s.proxy.Record(dialer, false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer rc.Close()
|
|
||||||
|
|
||||||
log.F("[tcptun] %s <-> %s via %s", c.RemoteAddr(), s.raddr, dialer.Addr())
|
|
||||||
|
|
||||||
if err = proxy.Relay(c, rc); err != nil {
|
|
||||||
log.F("[tcptun] %s <-> %s via %s, relay error: %v", c.RemoteAddr(), s.raddr, dialer.Addr(), err)
|
|
||||||
// record remote conn failure only
|
|
||||||
if !strings.Contains(err.Error(), s.addr) {
|
|
||||||
s.proxy.Record(dialer, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -73,10 +73,11 @@ func (s *UDP) ListenAndServe() {
|
|||||||
|
|
||||||
var raddr net.Addr
|
var raddr net.Addr
|
||||||
var pc net.PacketConn
|
var pc net.PacketConn
|
||||||
|
var dialer proxy.UDPDialer
|
||||||
|
|
||||||
v, ok := nm.Load(lraddr.String())
|
v, ok := nm.Load(lraddr.String())
|
||||||
if !ok && v == nil {
|
if !ok && v == nil {
|
||||||
pc, raddr, err = s.proxy.DialUDP("udp", "")
|
pc, dialer, raddr, err = s.proxy.DialUDP("udp", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.F("[udp] remote dial error: %v", err)
|
log.F("[udp] remote dial error: %v", err)
|
||||||
continue
|
continue
|
||||||
@ -100,7 +101,7 @@ func (s *UDP) ListenAndServe() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
log.F("[udp] %s <-> %s", lraddr, raddr)
|
log.F("[udp] %s <-> %s", lraddr, dialer.Addr())
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,113 +0,0 @@
|
|||||||
package udptun
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"net"
|
|
||||||
"net/url"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/nadoo/glider/log"
|
|
||||||
"github.com/nadoo/glider/proxy"
|
|
||||||
)
|
|
||||||
|
|
||||||
// UDPTun is a base udptun struct.
|
|
||||||
type UDPTun struct {
|
|
||||||
proxy proxy.Proxy
|
|
||||||
addr string
|
|
||||||
taddr string // tunnel addr string
|
|
||||||
tuaddr *net.UDPAddr // tunnel addr
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proxy.RegisterServer("udptun", NewUDPTunServer)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewUDPTun returns a UDPTun proxy.
|
|
||||||
func NewUDPTun(s string, p proxy.Proxy) (*UDPTun, error) {
|
|
||||||
u, err := url.Parse(s)
|
|
||||||
if err != nil {
|
|
||||||
log.F("[udptun] parse err: %s", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
addr := u.Host
|
|
||||||
d := strings.Split(addr, "=")
|
|
||||||
if len(d) < 2 {
|
|
||||||
return nil, errors.New("error in strings.Split")
|
|
||||||
}
|
|
||||||
|
|
||||||
ut := &UDPTun{
|
|
||||||
proxy: p,
|
|
||||||
addr: d[0],
|
|
||||||
taddr: d[1],
|
|
||||||
}
|
|
||||||
|
|
||||||
ut.tuaddr, err = net.ResolveUDPAddr("udp", ut.taddr)
|
|
||||||
return ut, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewUDPTunServer returns a udp tunnel server.
|
|
||||||
func NewUDPTunServer(s string, p proxy.Proxy) (proxy.Server, error) {
|
|
||||||
return NewUDPTun(s, p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListenAndServe listen and serves on the given address.
|
|
||||||
func (s *UDPTun) ListenAndServe() {
|
|
||||||
c, err := net.ListenPacket("udp", s.addr)
|
|
||||||
if err != nil {
|
|
||||||
log.F("[udptun] failed to listen on %s: %v", s.addr, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer c.Close()
|
|
||||||
|
|
||||||
log.F("[udptun] listening UDP on %s", s.addr)
|
|
||||||
|
|
||||||
var nm sync.Map
|
|
||||||
buf := make([]byte, proxy.UDPBufSize)
|
|
||||||
|
|
||||||
for {
|
|
||||||
n, raddr, err := c.ReadFrom(buf)
|
|
||||||
if err != nil {
|
|
||||||
log.F("[udptun] read error: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var pc net.PacketConn
|
|
||||||
|
|
||||||
v, ok := nm.Load(raddr.String())
|
|
||||||
if !ok && v == nil {
|
|
||||||
pc, _, err = s.proxy.DialUDP("udp", s.taddr)
|
|
||||||
if err != nil {
|
|
||||||
log.F("[udptun] remote dial error: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
nm.Store(raddr.String(), pc)
|
|
||||||
|
|
||||||
go func(c, pc net.PacketConn, raddr net.Addr) {
|
|
||||||
proxy.RelayUDP(c, raddr, pc, 2*time.Minute)
|
|
||||||
pc.Close()
|
|
||||||
nm.Delete(raddr.String())
|
|
||||||
}(c, pc, raddr)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
pc = v.(net.PacketConn)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = pc.WriteTo(buf[:n], s.tuaddr)
|
|
||||||
if err != nil {
|
|
||||||
log.F("[udptun] remote write error: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
log.F("[udptun] %s <-> %s", raddr, s.taddr)
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Serve serves a net.Conn, can not be called directly.
|
|
||||||
func (s *UDPTun) Serve(c net.Conn) {
|
|
||||||
log.F("[udptun] func Serve: can not be called directly")
|
|
||||||
}
|
|
@ -48,16 +48,26 @@ func ForwarderFromURL(s, intface string, dialTimeout, relayTimeout time.Duration
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var addrs []string
|
||||||
for _, url := range strings.Split(ss[0], ",") {
|
for _, url := range strings.Split(ss[0], ",") {
|
||||||
d, err = proxy.DialerFromURL(url, d)
|
d, err = proxy.DialerFromURL(url, d)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
cnt := len(addrs)
|
||||||
|
if cnt == 0 ||
|
||||||
|
(cnt > 0 && d.Addr() != addrs[cnt-1]) {
|
||||||
|
addrs = append(addrs, d.Addr())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
f.Dialer = d
|
f.Dialer = d
|
||||||
f.addr = d.Addr()
|
f.addr = d.Addr()
|
||||||
|
|
||||||
|
if len(addrs) > 0 {
|
||||||
|
f.addr = strings.Join(addrs, ",")
|
||||||
|
}
|
||||||
|
|
||||||
// set forwarder to disabled by default
|
// set forwarder to disabled by default
|
||||||
f.Disable()
|
f.Disable()
|
||||||
|
|
||||||
@ -70,7 +80,6 @@ func DirectForwarder(intface string, dialTimeout, relayTimeout time.Duration) *F
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Forwarder{Dialer: d, addr: d.Addr()}
|
return &Forwarder{Dialer: d, addr: d.Addr()}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,6 +102,7 @@ func (f *Forwarder) parseOption(option string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Addr returns the forwarder's addr.
|
// Addr returns the forwarder's addr.
|
||||||
|
// NOTE: addr returns for chained dialers: dialer1Addr,dialer2Addr,...
|
||||||
func (f *Forwarder) Addr() string {
|
func (f *Forwarder) Addr() string {
|
||||||
return f.addr
|
return f.addr
|
||||||
}
|
}
|
||||||
@ -103,7 +113,6 @@ func (f *Forwarder) Dial(network, addr string) (c net.Conn, err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
f.IncFailures()
|
f.IncFailures()
|
||||||
}
|
}
|
||||||
|
|
||||||
return c, err
|
return c, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,8 +102,10 @@ func (p *FwdrGroup) Dial(network, addr string) (net.Conn, proxy.Dialer, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DialUDP connects to the given address.
|
// DialUDP connects to the given address.
|
||||||
func (p *FwdrGroup) DialUDP(network, addr string) (pc net.PacketConn, writeTo net.Addr, err error) {
|
func (p *FwdrGroup) DialUDP(network, addr string) (pc net.PacketConn, dialer proxy.UDPDialer, writeTo net.Addr, err error) {
|
||||||
return p.NextDialer(addr).DialUDP(network, addr)
|
nd := p.NextDialer(addr)
|
||||||
|
pc, wt, err := nd.DialUDP(network, addr)
|
||||||
|
return pc, nd, wt, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// NextDialer returns the next dialer.
|
// NextDialer returns the next dialer.
|
||||||
@ -244,6 +246,7 @@ func (p *FwdrGroup) check(fwdr *Forwarder, checker Checker) {
|
|||||||
if errors.Is(err, proxy.ErrNotSupported) {
|
if errors.Is(err, proxy.ErrNotSupported) {
|
||||||
fwdr.SetMaxFailures(0)
|
fwdr.SetMaxFailures(0)
|
||||||
log.F("[check] %s(%d), %s, stop checking", fwdr.Addr(), fwdr.Priority(), err)
|
log.F("[check] %s(%d), %s, stop checking", fwdr.Addr(), fwdr.Priority(), err)
|
||||||
|
fwdr.Enable()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,9 +261,9 @@ func (p *FwdrGroup) check(fwdr *Forwarder, checker Checker) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
wait = 1
|
wait = 1
|
||||||
fwdr.Enable()
|
|
||||||
fwdr.SetLatency(int64(elapsed))
|
fwdr.SetLatency(int64(elapsed))
|
||||||
log.F("[check] %s(%d), SUCCESS. elapsed: %s", fwdr.Addr(), fwdr.Priority(), elapsed)
|
log.F("[check] %s(%d), SUCCESS. elapsed: %s", fwdr.Addr(), fwdr.Priority(), elapsed)
|
||||||
|
fwdr.Enable()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ func (p *Proxy) Dial(network, addr string) (net.Conn, proxy.Dialer, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DialUDP connects to the given address via the proxy.
|
// DialUDP connects to the given address via the proxy.
|
||||||
func (p *Proxy) DialUDP(network, addr string) (pc net.PacketConn, writeTo net.Addr, err error) {
|
func (p *Proxy) DialUDP(network, addr string) (pc net.PacketConn, dialer proxy.UDPDialer, writeTo net.Addr, err error) {
|
||||||
return p.findDialer(addr).DialUDP(network, addr)
|
return p.findDialer(addr).DialUDP(network, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user