Browse Source

fix socks5 udp

pull/133/head
rui.zheng 9 years ago
parent
commit
7ce6fa537b
  1. 1
      gost/examples/ssh/sshd.go
  2. 7
      gost/socks.go
  3. 18
      gost/ssh.go

1
gost/examples/ssh/sshd.go

@ -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))
} }

7
gost/socks.go

@ -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

@ -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…
Cancel
Save