fix socks5 udp
This commit is contained in:
parent
277dfb4315
commit
7ce6fa537b
@ -41,6 +41,7 @@ func sshTunnelServer() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
log.Println("server listen on", laddr)
|
||||||
log.Fatal(s.Serve(ln))
|
log.Fatal(s.Serve(ln))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -613,10 +613,15 @@ func (h *socks5Handler) handleUDPRelay(conn net.Conn, req *gosocks5.Request) {
|
|||||||
log.Logf("[socks5-udp] %s -> %s : %s", conn.RemoteAddr(), socksAddr, err)
|
log.Logf("[socks5-udp] %s -> %s : %s", conn.RemoteAddr(), socksAddr, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// forward udp local <-> tunnel
|
// forward udp local <-> tunnel
|
||||||
defer cc.Close()
|
defer cc.Close()
|
||||||
|
|
||||||
|
cc, err = socks5Handshake(cc, h.options.Chain.LastNode().User)
|
||||||
|
if err != nil {
|
||||||
|
log.Logf("[socks5-udp] %s -> %s : %s", conn.RemoteAddr(), socksAddr, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
cc.SetWriteDeadline(time.Now().Add(WriteTimeout))
|
cc.SetWriteDeadline(time.Now().Add(WriteTimeout))
|
||||||
r := gosocks5.NewRequest(CmdUDPTun, nil)
|
r := gosocks5.NewRequest(CmdUDPTun, nil)
|
||||||
if err := r.Write(cc); err != nil {
|
if err := r.Write(cc); err != nil {
|
||||||
|
18
gost/ssh.go
18
gost/ssh.go
@ -147,9 +147,6 @@ func (tr *sshTunnelTransporter) Dial(addr string, options ...DialOption) (conn n
|
|||||||
|
|
||||||
session, ok := tr.sessions[addr]
|
session, ok := tr.sessions[addr]
|
||||||
if !ok || session.Closed() {
|
if !ok || session.Closed() {
|
||||||
if session != nil {
|
|
||||||
session.client.Close()
|
|
||||||
}
|
|
||||||
if opts.Chain == nil {
|
if opts.Chain == nil {
|
||||||
conn, err = net.DialTimeout("tcp", addr, opts.Timeout)
|
conn, err = net.DialTimeout("tcp", addr, opts.Timeout)
|
||||||
} else {
|
} else {
|
||||||
@ -210,11 +207,11 @@ func (tr *sshTunnelTransporter) Handshake(conn net.Conn, options ...HandshakeOpt
|
|||||||
}
|
}
|
||||||
tr.sessions[opts.Addr] = session
|
tr.sessions[opts.Addr] = session
|
||||||
go session.Ping(opts.Interval, 1)
|
go session.Ping(opts.Interval, 1)
|
||||||
go session.Wait()
|
go session.waitServer()
|
||||||
|
go session.waitClose()
|
||||||
}
|
}
|
||||||
|
|
||||||
if session.Closed() {
|
if session.Closed() {
|
||||||
session.client.Close()
|
|
||||||
delete(tr.sessions, opts.Addr)
|
delete(tr.sessions, opts.Addr)
|
||||||
return nil, ErrSessionDead
|
return nil, ErrSessionDead
|
||||||
}
|
}
|
||||||
@ -289,11 +286,20 @@ func (s *sshSession) sendPing() <-chan error {
|
|||||||
return ch
|
return ch
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *sshSession) Wait() error {
|
func (s *sshSession) waitServer() error {
|
||||||
defer close(s.closed)
|
defer close(s.closed)
|
||||||
return s.client.Wait()
|
return s.client.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *sshSession) waitClose() {
|
||||||
|
defer s.client.Close()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-s.deaded:
|
||||||
|
case <-s.closed:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (s *sshSession) Closed() bool {
|
func (s *sshSession) Closed() bool {
|
||||||
select {
|
select {
|
||||||
case <-s.deaded:
|
case <-s.deaded:
|
||||||
|
Loading…
Reference in New Issue
Block a user