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

View File

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