fix udp tunnel

This commit is contained in:
ginuerzh 2015-03-27 20:27:52 +08:00
parent 8d30eb1a72
commit d0aca83181
2 changed files with 18 additions and 14 deletions

View File

@ -6,6 +6,7 @@ import (
"github.com/ginuerzh/gosocks5" "github.com/ginuerzh/gosocks5"
"github.com/shadowsocks/shadowsocks-go/shadowsocks" "github.com/shadowsocks/shadowsocks-go/shadowsocks"
"io" "io"
"io/ioutil"
"log" "log"
"net" "net"
"net/http" "net/http"
@ -128,7 +129,7 @@ func handleSocks5(conn net.Conn, sconn net.Conn) {
if err != nil { if err != nil {
return return
} }
log.Println(req) //log.Println(req)
switch req.Cmd { switch req.Cmd {
case gosocks5.CmdConnect, gosocks5.CmdBind: case gosocks5.CmdConnect, gosocks5.CmdBind:
@ -155,7 +156,7 @@ func handleSocks5(conn net.Conn, sconn net.Conn) {
addr := ToSocksAddr(uconn.LocalAddr()) addr := ToSocksAddr(uconn.LocalAddr())
addr.Host, _, _ = net.SplitHostPort(conn.LocalAddr().String()) addr.Host, _, _ = net.SplitHostPort(conn.LocalAddr().String())
log.Println("udp:", addr) //log.Println("udp:", addr)
rep = gosocks5.NewReply(Succeeded, addr) rep = gosocks5.NewReply(Succeeded, addr)
if err := rep.Write(conn); err != nil { if err := rep.Write(conn); err != nil {
@ -163,15 +164,17 @@ func handleSocks5(conn net.Conn, sconn net.Conn) {
return return
} }
cliTunnelUDP(uconn, conn) go cliTunnelUDP(uconn, sconn)
ioutil.ReadAll(conn)
} }
} }
func cliTunnelUDP(uconn *net.UDPConn, conn net.Conn) { func cliTunnelUDP(uconn *net.UDPConn, sconn net.Conn) {
var raddr *net.UDPAddr var raddr *net.UDPAddr
go func() { go func() {
b := make([]byte, 65797) b := make([]byte, 65535)
for { for {
n, addr, err := uconn.ReadFromUDP(b) n, addr, err := uconn.ReadFromUDP(b)
if err != nil { if err != nil {
@ -185,9 +188,9 @@ func cliTunnelUDP(uconn *net.UDPConn, conn net.Conn) {
return return
} }
udp.Header.Rsv = uint16(len(udp.Data)) udp.Header.Rsv = uint16(len(udp.Data))
log.Println("r", raddr.String(), udp.Header) //log.Println("r", raddr.String(), udp.Header)
if err := udp.Write(conn); err != nil { if err := udp.Write(sconn); err != nil {
log.Println(err) log.Println(err)
return return
} }
@ -195,12 +198,12 @@ func cliTunnelUDP(uconn *net.UDPConn, conn net.Conn) {
}() }()
for { for {
udp, err := gosocks5.ReadUDPDatagram(conn) udp, err := gosocks5.ReadUDPDatagram(sconn)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return
} }
log.Println("w", udp.Header) //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)

View File

@ -41,7 +41,7 @@ func srvHandle(conn net.Conn, method uint8) {
switch req.Cmd { switch req.Cmd {
case gosocks5.CmdConnect: case gosocks5.CmdConnect:
log.Println("connect", req.Addr.String()) //log.Println("connect", req.Addr.String())
tconn, err := Connect(req.Addr.String(), Proxy) tconn, err := Connect(req.Addr.String(), Proxy)
if err != nil { if err != nil {
gosocks5.NewReply(gosocks5.HostUnreachable, nil).Write(conn) gosocks5.NewReply(gosocks5.HostUnreachable, nil).Write(conn)
@ -66,7 +66,7 @@ func srvHandle(conn net.Conn, method uint8) {
addr := ToSocksAddr(l.Addr()) addr := ToSocksAddr(l.Addr())
addr.Host, _, _ = net.SplitHostPort(conn.LocalAddr().String()) addr.Host, _, _ = net.SplitHostPort(conn.LocalAddr().String())
log.Println("bind:", addr) //log.Println("bind:", addr)
rep := gosocks5.NewReply(gosocks5.Succeeded, addr) rep := gosocks5.NewReply(gosocks5.Succeeded, addr)
if err := rep.Write(conn); err != nil { if err := rep.Write(conn); err != nil {
return return
@ -82,6 +82,7 @@ func srvHandle(conn net.Conn, method uint8) {
l.Close() l.Close()
addr = ToSocksAddr(tconn.RemoteAddr()) addr = ToSocksAddr(tconn.RemoteAddr())
log.Println("accept peer:", addr.String())
rep = gosocks5.NewReply(gosocks5.Succeeded, addr) rep = gosocks5.NewReply(gosocks5.Succeeded, addr)
if err := rep.Write(conn); err != nil { if err := rep.Write(conn); err != nil {
log.Println(err) log.Println(err)
@ -102,7 +103,7 @@ func srvHandle(conn net.Conn, method uint8) {
addr := ToSocksAddr(uconn.LocalAddr()) addr := ToSocksAddr(uconn.LocalAddr())
addr.Host, _, _ = net.SplitHostPort(conn.LocalAddr().String()) addr.Host, _, _ = net.SplitHostPort(conn.LocalAddr().String())
log.Println("udp:", addr) //log.Println("udp:", addr)
rep := gosocks5.NewReply(Succeeded, addr) rep := gosocks5.NewReply(Succeeded, addr)
if err := rep.Write(conn); err != nil { if err := rep.Write(conn); err != nil {
log.Println(err) log.Println(err)
@ -124,7 +125,7 @@ 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) //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
@ -138,7 +139,7 @@ func srvTunnelUDP(conn net.Conn, uconn *net.UDPConn) {
log.Println(err) log.Println(err)
return return
} }
log.Println("w", udp.Header) //log.Println("w", udp.Header)
addr, err := net.ResolveUDPAddr("udp", udp.Header.Addr.String()) addr, err := net.ResolveUDPAddr("udp", udp.Header.Addr.String())
if err != nil { if err != nil {
log.Println(err) log.Println(err)