fix udp tunnel
This commit is contained in:
parent
8d30eb1a72
commit
d0aca83181
21
client.go
21
client.go
@ -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)
|
||||||
|
11
server.go
11
server.go
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user