socks5 udp tunnel
This commit is contained in:
parent
c4a1b96ba2
commit
01040ca1ff
5
conn.go
5
conn.go
@ -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) {
|
|||||||
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) {
|
|||||||
|
|
||||||
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
socks.go
9
socks.go
@ -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) {
|
|||||||
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) {
|
|||||||
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
|
||||||
|
31
udp.go
31
udp.go
@ -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) {
|
|||||||
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) {
|
|||||||
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 {
|
|||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user