mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 09:25:41 +08:00
unix, udp: fixed nat issue (#194)
This commit is contained in:
parent
539f604e37
commit
10b7f2d5e6
@ -52,7 +52,7 @@ we can set up local listeners as proxy servers, and forward requests to internet
|
|||||||
|Trojan |√|√|√|√|client & server
|
|Trojan |√|√|√|√|client & server
|
||||||
|Trojanc |√|√|√|√|trojan cleartext(without tls)
|
|Trojanc |√|√|√|√|trojan cleartext(without tls)
|
||||||
|VLESS |√|√|√|√|client & server
|
|VLESS |√|√|√|√|client & server
|
||||||
|VMess | | |√| |client only
|
|VMess | | |√|√|client only
|
||||||
|SSR | | |√| |client only
|
|SSR | | |√| |client only
|
||||||
|SSH | | |√| |client only
|
|SSH | | |√| |client only
|
||||||
|SOCKS4 | | |√| |client only
|
|SOCKS4 | | |√| |client only
|
||||||
|
6
go.mod
6
go.mod
@ -16,9 +16,9 @@ require (
|
|||||||
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/mod v0.4.0 // indirect
|
golang.org/x/mod v0.4.0 // indirect
|
||||||
golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7 // indirect
|
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb // indirect
|
||||||
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3 // indirect
|
golang.org/x/sys v0.0.0-20201202213521-69691e467435 // indirect
|
||||||
golang.org/x/tools v0.0.0-20201202100533-7534955ac86b // indirect
|
golang.org/x/tools v0.0.0-20201202200335-bef1c476418a // indirect
|
||||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
|
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
12
go.sum
12
go.sum
@ -109,8 +109,8 @@ golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwY
|
|||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME=
|
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME=
|
||||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7 h1:3uJsdck53FDIpWwLeAXlia9p4C8j0BO2xZrqzKpL0D8=
|
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U=
|
||||||
golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@ -132,8 +132,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-20201201145000-ef89a241ccb3 h1:kzM6+9dur93BcC2kVlYl34cHU+TYZLanmpSJHVMmL64=
|
golang.org/x/sys v0.0.0-20201202213521-69691e467435 h1:25AvDqqB9PrNqj1FLf2/70I4W0L19qqoaFq3gjNwbKk=
|
||||||
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201202213521-69691e467435/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=
|
||||||
@ -145,8 +145,8 @@ golang.org/x/tools v0.0.0-20200425043458-8463f397d07c/go.mod h1:EkVYQZoAsY45+roY
|
|||||||
golang.org/x/tools v0.0.0-20200808161706-5bf02b21f123/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
golang.org/x/tools v0.0.0-20200808161706-5bf02b21f123/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174 h1:0rx0F4EjJNbxTuzWe0KjKcIzs+3VEb/Mrs/d1ciNz1c=
|
golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174 h1:0rx0F4EjJNbxTuzWe0KjKcIzs+3VEb/Mrs/d1ciNz1c=
|
||||||
golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.0.0-20201202100533-7534955ac86b h1:nOM4+lFhnC6uxSrRnxjZ4Azu1bF9DQz5rAsb3LUErhc=
|
golang.org/x/tools v0.0.0-20201202200335-bef1c476418a h1:TYqOq/v+Ri5aADpldxXOj6PmvcPMOJbLjdALzZDQT2M=
|
||||||
golang.org/x/tools v0.0.0-20201202100533-7534955ac86b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201202200335-bef1c476418a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
@ -97,7 +97,7 @@ func (d *Direct) DialUDP(network, addr string) (net.PacketConn, net.Addr, error)
|
|||||||
// TODO: support specifying local interface
|
// TODO: support specifying local interface
|
||||||
var la string
|
var la string
|
||||||
if d.ip != nil {
|
if d.ip != nil {
|
||||||
la = d.ip.String() + ":0"
|
la = net.JoinHostPort(d.ip.String(), "0")
|
||||||
}
|
}
|
||||||
|
|
||||||
pc, err := net.ListenPacket(network, la)
|
pc, err := net.ListenPacket(network, la)
|
||||||
|
@ -71,21 +71,19 @@ func (s *UDP) ListenAndServe() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
var raddr net.Addr
|
var session *natEntry
|
||||||
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 {
|
||||||
// we know we are creating an udp tunnel, so the dial addr is meaningless,
|
// we know we are creating an udp tunnel, so the dial addr is meaningless,
|
||||||
// we use lraddr here to help the unix client to identify the source socket.
|
// we use lraddr here to help the unix client to identify the source socket.
|
||||||
pc, dialer, raddr, err = s.proxy.DialUDP("udp", lraddr.String())
|
pc, _, raddr, err := s.proxy.DialUDP("udp", lraddr.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.F("[udp] remote dial error: %v", err)
|
log.F("[udp] remote dial error: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
nm.Store(lraddr.String(), pc)
|
session = newNatEntry(pc, raddr)
|
||||||
|
nm.Store(lraddr.String(), session)
|
||||||
|
|
||||||
go func(c, pc net.PacketConn, lraddr net.Addr) {
|
go func(c, pc net.PacketConn, lraddr net.Addr) {
|
||||||
proxy.RelayUDP(c, lraddr, pc, 2*time.Minute)
|
proxy.RelayUDP(c, lraddr, pc, 2*time.Minute)
|
||||||
@ -93,23 +91,30 @@ func (s *UDP) ListenAndServe() {
|
|||||||
nm.Delete(lraddr.String())
|
nm.Delete(lraddr.String())
|
||||||
}(c, pc, lraddr)
|
}(c, pc, lraddr)
|
||||||
|
|
||||||
|
log.F("[udp] %s <-> %s", lraddr, raddr)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
pc = v.(net.PacketConn)
|
session = v.(*natEntry)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = pc.WriteTo(buf[:n], raddr)
|
_, err = session.WriteTo(buf[:n], session.raddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.F("[udp] remote write error: %v", err)
|
log.F("[udp] remote write error: %v, raddr: %s", err, session.raddr)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if dialer != nil {
|
|
||||||
log.F("[udp] %s <-> %s", lraddr, dialer.Addr())
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type natEntry struct {
|
||||||
|
net.PacketConn
|
||||||
|
raddr net.Addr
|
||||||
|
}
|
||||||
|
|
||||||
|
func newNatEntry(pc net.PacketConn, raddr net.Addr) *natEntry {
|
||||||
|
return &natEntry{PacketConn: pc, raddr: raddr}
|
||||||
|
}
|
||||||
|
|
||||||
// Serve serves a connection.
|
// Serve serves a connection.
|
||||||
func (s *UDP) Serve(c net.Conn) {
|
func (s *UDP) Serve(c net.Conn) {
|
||||||
log.F("[udp] func Serve: can not be called directly")
|
log.F("[udp] func Serve: can not be called directly")
|
||||||
|
@ -113,19 +113,17 @@ func (s *Unix) ListenAndServeUDP() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
var raddr net.Addr
|
var session *natEntry
|
||||||
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, dialer, raddr, err = s.proxy.DialUDP("udp", "")
|
pc, _, raddr, err := s.proxy.DialUDP("udp", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.F("[unix] remote dial error: %v", err)
|
log.F("[unix] remote dial error: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
nm.Store(lraddr.String(), pc)
|
session = newNatEntry(pc, raddr)
|
||||||
|
nm.Store(lraddr.String(), session)
|
||||||
|
|
||||||
go func(c, pc net.PacketConn, lraddr net.Addr) {
|
go func(c, pc net.PacketConn, lraddr net.Addr) {
|
||||||
proxy.RelayUDP(c, lraddr, pc, 2*time.Minute)
|
proxy.RelayUDP(c, lraddr, pc, 2*time.Minute)
|
||||||
@ -133,19 +131,26 @@ func (s *Unix) ListenAndServeUDP() {
|
|||||||
nm.Delete(lraddr.String())
|
nm.Delete(lraddr.String())
|
||||||
}(c, pc, lraddr)
|
}(c, pc, lraddr)
|
||||||
|
|
||||||
|
log.F("[unix] %s <-> %s", lraddr, raddr)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
pc = v.(net.PacketConn)
|
session = v.(*natEntry)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = pc.WriteTo(buf[:n], raddr)
|
_, err = session.WriteTo(buf[:n], session.raddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.F("[unix] remote write error: %v", err)
|
log.F("[unix] remote write error: %v, raddr: %s", err, session.raddr)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if dialer != nil {
|
|
||||||
log.F("[unix] %s <-> %s", s.addru, dialer.Addr())
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type natEntry struct {
|
||||||
|
net.PacketConn
|
||||||
|
raddr net.Addr
|
||||||
|
}
|
||||||
|
|
||||||
|
func newNatEntry(pc net.PacketConn, raddr net.Addr) *natEntry {
|
||||||
|
return &natEntry{PacketConn: pc, raddr: raddr}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user