Commit 01040ca1 authored by ginuerzh's avatar ginuerzh

socks5 udp tunnel

parent c4a1b96b
...@@ -15,6 +15,7 @@ import ( ...@@ -15,6 +15,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"sync/atomic" "sync/atomic"
"time"
) )
var ( var (
...@@ -204,7 +205,7 @@ func Connect(addr string) (conn net.Conn, err error) { ...@@ -204,7 +205,7 @@ func Connect(addr string) (conn net.Conn, err error) {
addr += ":80" addr += ":80"
} }
if len(forwardArgs) == 0 { if len(forwardArgs) == 0 {
return net.Dial("tcp", addr) return net.DialTimeout("tcp", addr, time.Second*30)
} }
var end Args var end Args
...@@ -224,7 +225,7 @@ func Connect(addr string) (conn net.Conn, err error) { ...@@ -224,7 +225,7 @@ func Connect(addr string) (conn net.Conn, err error) {
func forwardChain(chain ...Args) (conn net.Conn, end Args, err error) { func forwardChain(chain ...Args) (conn net.Conn, end Args, err error) {
end = chain[0] end = chain[0]
if conn, err = net.Dial("tcp", end.Addr); err != nil { if conn, err = net.DialTimeout("tcp", end.Addr, time.Second*30); err != nil {
return return
} }
c, err := forward(conn, end) c, err := forward(conn, end)
......
...@@ -9,6 +9,7 @@ import ( ...@@ -9,6 +9,7 @@ import (
"io" "io"
"net" "net"
"strconv" "strconv"
"time"
) )
const ( const (
...@@ -235,18 +236,18 @@ func handleSocks5Request(req *gosocks5.Request, conn net.Conn) { ...@@ -235,18 +236,18 @@ func handleSocks5Request(req *gosocks5.Request, conn net.Conn) {
return return
} }
if err = sc.WriteUDP(dgram); err != nil { if err = sc.WriteUDPTimeout(dgram, time.Second*30); err != nil {
glog.V(LWARNING).Infoln("socks5 udp:", err) glog.V(LWARNING).Infoln("socks5 udp:", err)
return return
} }
dgram, err = sc.ReadUDP() dgram, err = sc.ReadUDPTimeout(time.Second * 30)
if err != nil { if err != nil {
glog.V(LWARNING).Infoln("socks5 udp:", err) glog.V(LWARNING).Infoln("socks5 udp:", err)
return return
} }
glog.V(LDEBUG).Infof("[udp] from %s, length %d", dgram.Header.Addr, len(dgram.Data)) glog.V(LDEBUG).Infof("[udp] from %s, length %d", dgram.Header.Addr, len(dgram.Data))
if err = cc.WriteUDP(dgram); err != nil { if err = cc.WriteUDPTimeout(dgram, time.Second*30); err != nil {
glog.V(LWARNING).Infoln("socks5 udp:", err) glog.V(LWARNING).Infoln("socks5 udp:", err)
return return
} }
...@@ -468,7 +469,7 @@ func PipeUDP(src, dst *UDPConn, ch chan<- error) { ...@@ -468,7 +469,7 @@ func PipeUDP(src, dst *UDPConn, ch chan<- error) {
if err != nil { if err != nil {
break break
} }
glog.V(LDEBUG).Infof("[udp] addr %s, length %d", dgram.Header.Addr, len(dgram.Data)) // glog.V(LDEBUG).Infof("[udp] addr %s, length %d", dgram.Header.Addr, len(dgram.Data))
if err = dst.WriteUDP(dgram); err != nil { if err = dst.WriteUDP(dgram); err != nil {
break break
......
...@@ -49,6 +49,20 @@ func (c *UDPConn) ReadUDP() (*gosocks5.UDPDatagram, error) { ...@@ -49,6 +49,20 @@ func (c *UDPConn) ReadUDP() (*gosocks5.UDPDatagram, error) {
return c.readUDPServer() return c.readUDPServer()
} }
func (c *UDPConn) ReadUDPTimeout(timeout time.Duration) (*gosocks5.UDPDatagram, error) {
if c.udp != nil {
c.udp.SetReadDeadline(time.Now().Add(timeout))
defer c.udp.SetReadDeadline(time.Time{})
} else {
c.tcp.SetReadDeadline(time.Now().Add(timeout))
defer c.tcp.SetReadDeadline(time.Time{})
}
if c.isClient {
return c.readUDPClient()
}
return c.readUDPServer()
}
func (c *UDPConn) readUDPClient() (*gosocks5.UDPDatagram, error) { func (c *UDPConn) readUDPClient() (*gosocks5.UDPDatagram, error) {
if c.udp != nil { if c.udp != nil {
return gosocks5.ReadUDPDatagram(c.udp) return gosocks5.ReadUDPDatagram(c.udp)
...@@ -59,7 +73,7 @@ func (c *UDPConn) readUDPClient() (*gosocks5.UDPDatagram, error) { ...@@ -59,7 +73,7 @@ func (c *UDPConn) readUDPClient() (*gosocks5.UDPDatagram, error) {
func (c *UDPConn) readUDPServer() (*gosocks5.UDPDatagram, error) { func (c *UDPConn) readUDPServer() (*gosocks5.UDPDatagram, error) {
if c.udp != nil { if c.udp != nil {
b := make([]byte, 65535) b := make([]byte, 65535)
n, addr, err := c.udp.ReadFromUDP(b) n, addr, err := c.udp.ReadFrom(b)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -67,7 +81,6 @@ func (c *UDPConn) readUDPServer() (*gosocks5.UDPDatagram, error) { ...@@ -67,7 +81,6 @@ func (c *UDPConn) readUDPServer() (*gosocks5.UDPDatagram, error) {
gosocks5.NewUDPHeader(0, 0, ToSocksAddr(addr)), b[:n]) gosocks5.NewUDPHeader(0, 0, ToSocksAddr(addr)), b[:n])
return dgram, nil return dgram, nil
} }
return gosocks5.ReadUDPDatagram(c.tcp) return gosocks5.ReadUDPDatagram(c.tcp)
} }
...@@ -78,6 +91,20 @@ func (c *UDPConn) WriteUDP(dgram *gosocks5.UDPDatagram) error { ...@@ -78,6 +91,20 @@ func (c *UDPConn) WriteUDP(dgram *gosocks5.UDPDatagram) error {
return c.writeUDPServer(dgram) return c.writeUDPServer(dgram)
} }
func (c *UDPConn) WriteUDPTimeout(dgram *gosocks5.UDPDatagram, timeout time.Duration) error {
if c.udp != nil {
c.udp.SetWriteDeadline(time.Now().Add(timeout))
defer c.udp.SetWriteDeadline(time.Time{})
} else {
c.tcp.SetWriteDeadline(time.Now().Add(timeout))
defer c.tcp.SetWriteDeadline(time.Time{})
}
if c.isClient {
return c.writeUDPClient(dgram)
}
return c.writeUDPServer(dgram)
}
func (c *UDPConn) writeUDPClient(dgram *gosocks5.UDPDatagram) error { func (c *UDPConn) writeUDPClient(dgram *gosocks5.UDPDatagram) error {
if c.udp != nil { if c.udp != nil {
dgram.Header.Rsv = 0 dgram.Header.Rsv = 0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment