This commit is contained in:
rui.zheng 2015-03-27 18:12:25 +08:00
parent 302767f68a
commit 8d30eb1a72
2 changed files with 43 additions and 33 deletions

View File

@ -128,6 +128,7 @@ func handleSocks5(conn net.Conn, sconn net.Conn) {
if err != nil { if err != nil {
return return
} }
log.Println(req)
switch req.Cmd { switch req.Cmd {
case gosocks5.CmdConnect, gosocks5.CmdBind: case gosocks5.CmdConnect, gosocks5.CmdBind:
@ -162,29 +163,35 @@ func handleSocks5(conn net.Conn, sconn net.Conn) {
return return
} }
addr.Port = req.Addr.Port cliTunnelUDP(uconn, conn)
raddr, err := net.ResolveUDPAddr("udp", addr.String())
if err != nil {
return
}
cliTunnelUDP(raddr, uconn, conn)
} }
} }
func cliTunnelUDP(raddr net.Addr, uconn *net.UDPConn, conn net.Conn) { func cliTunnelUDP(uconn *net.UDPConn, conn net.Conn) {
var raddr *net.UDPAddr
go func() { go func() {
udp, err := gosocks5.ReadUDPDatagram(uconn) b := make([]byte, 65797)
for {
n, addr, err := uconn.ReadFromUDP(b)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return
} }
raddr = addr
r := bytes.NewBuffer(b[:n])
udp, err := gosocks5.ReadUDPDatagram(r)
if err != nil {
return
}
udp.Header.Rsv = uint16(len(udp.Data)) udp.Header.Rsv = uint16(len(udp.Data))
log.Println("r", raddr.String(), udp.Header)
if err := udp.Write(conn); err != nil { if err := udp.Write(conn); err != nil {
log.Println(err) log.Println(err)
return return
} }
}
}() }()
for { for {
@ -193,10 +200,10 @@ func cliTunnelUDP(raddr net.Addr, uconn *net.UDPConn, conn net.Conn) {
log.Println(err) log.Println(err)
return return
} }
log.Println("w", udp.Header)
udp.Header.Rsv = 0 udp.Header.Rsv = 0
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
udp.Write(buf) udp.Write(buf)
if _, err := uconn.WriteTo(buf.Bytes(), raddr); err != nil { if _, err := uconn.WriteTo(buf.Bytes(), raddr); err != nil {
log.Println(err) log.Println(err)
return return

View File

@ -115,6 +115,7 @@ func srvHandle(conn net.Conn, method uint8) {
func srvTunnelUDP(conn net.Conn, uconn *net.UDPConn) { func srvTunnelUDP(conn net.Conn, uconn *net.UDPConn) {
go func() { go func() {
b := make([]byte, 65535) b := make([]byte, 65535)
for {
n, addr, err := uconn.ReadFromUDP(b) n, addr, err := uconn.ReadFromUDP(b)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
@ -123,26 +124,28 @@ func srvTunnelUDP(conn net.Conn, uconn *net.UDPConn) {
udp := gosocks5.NewUDPDatagram( udp := gosocks5.NewUDPDatagram(
gosocks5.NewUDPHeader(uint16(n), 0, ToSocksAddr(addr)), b[:n]) gosocks5.NewUDPHeader(uint16(n), 0, ToSocksAddr(addr)), b[:n])
log.Println("r", udp.Header)
if err := udp.Write(conn); err != nil { if err := udp.Write(conn); err != nil {
log.Println(err) log.Println(err)
return return
} }
}
}() }()
for { for {
ud, err := gosocks5.ReadUDPDatagram(conn) udp, err := gosocks5.ReadUDPDatagram(conn)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return
} }
log.Println("w", udp.Header)
addr, err := net.ResolveUDPAddr("udp", ud.Header.Addr.String()) addr, err := net.ResolveUDPAddr("udp", udp.Header.Addr.String())
if err != nil { if err != nil {
log.Println(err) log.Println(err)
continue // drop silently continue // drop silently
} }
if _, err := uconn.WriteToUDP(ud.Data, addr); err != nil { if _, err := uconn.WriteToUDP(udp.Data, addr); err != nil {
log.Println(err) log.Println(err)
return return
} }