Created
September 30, 2022 13:21
-
-
Save leonjza/35193696797fb58869d332a025bec784 to your computer and use it in GitHub Desktop.
tun2socks debug patch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh | |
index 78571d9..765b13f 100644 | |
--- a/docker/entrypoint.sh | |
+++ b/docker/entrypoint.sh | |
@@ -1,55 +1,28 @@ | |
#!/bin/sh | |
+# Modified version of | |
+# https://github.com/xjasonlyu/tun2socks/blob/main/docker/entrypoint.sh | |
+ | |
TUN="${TUN:-tun0}" | |
ADDR="${ADDR:-198.18.0.1/15}" | |
LOGLEVEL="${LOGLEVEL:-info}" | |
-# default values | |
-TABLE="${TABLE:-0x22b}" | |
-FWMARK="${FWMARK:-0x22b}" | |
-CLONE_MAIN="${CLONE_MAIN:-1}" | |
- | |
create_tun() { | |
- # create tun device | |
ip tuntap add mode tun dev "$TUN" | |
ip addr add "$ADDR" dev "$TUN" | |
ip link set dev "$TUN" up | |
} | |
-create_table() { | |
- if [ "$CLONE_MAIN" -ne 0 ]; then | |
- # clone main route table | |
- ip route show table main | | |
- while read -r route; do | |
- ip route add ${route%linkdown*} table "$TABLE" | |
- done | |
- # replace default route | |
- ip route replace default dev "$TUN" table "$TABLE" | |
- else | |
- # just add default route | |
- ip route add default dev "$TUN" table "$TABLE" | |
- fi | |
-} | |
- | |
config_route() { | |
- # policy routing | |
- ip rule add not fwmark "$FWMARK" table "$TABLE" | |
- ip rule add fwmark "$FWMARK" to "$ADDR" prohibit | |
- | |
- # add tun included routes | |
for addr in $(echo "$TUN_INCLUDED_ROUTES" | tr ',' '\n'); do | |
- ip rule add to "$addr" table "$TABLE" | |
- done | |
- | |
- # add tun excluded routes | |
- for addr in $(echo "$TUN_EXCLUDED_ROUTES" | tr ',' '\n'); do | |
- ip rule add to "$addr" table main | |
+ ip route add $addr dev $TUN | |
done | |
} | |
+ | |
run() { | |
+ | |
create_tun | |
- create_table | |
config_route | |
# execute extra commands | |
@@ -83,10 +56,9 @@ run() { | |
exec tun2socks \ | |
--loglevel "$LOGLEVEL" \ | |
- --fwmark "$FWMARK" \ | |
--device "$TUN" \ | |
--proxy "$PROXY" \ | |
$ARGS | |
} | |
-run || exit 1 | |
+run || exit 1 | |
\ No newline at end of file | |
diff --git a/proxy/socks5.go b/proxy/socks5.go | |
index d169994..f9329da 100644 | |
--- a/proxy/socks5.go | |
+++ b/proxy/socks5.go | |
@@ -182,3 +182,31 @@ func (pc *socksPacketConn) Close() error { | |
func serializeSocksAddr(m *M.Metadata) socks5.Addr { | |
return socks5.SerializeAddr("", m.DstIP, m.DstPort) | |
} | |
+ | |
+func dumpByteSlice(b []byte) { | |
+ var a [16]byte | |
+ n := (len(b) + 15) &^ 15 | |
+ for i := 0; i < n; i++ { | |
+ if i%16 == 0 { | |
+ fmt.Printf("%4d", i) | |
+ } | |
+ if i%8 == 0 { | |
+ fmt.Print(" ") | |
+ } | |
+ if i < len(b) { | |
+ fmt.Printf(" %02X", b[i]) | |
+ } else { | |
+ fmt.Print(" ") | |
+ } | |
+ if i >= len(b) { | |
+ a[i%16] = ' ' | |
+ } else if b[i] < 32 || b[i] > 126 { | |
+ a[i%16] = '.' | |
+ } else { | |
+ a[i%16] = b[i] | |
+ } | |
+ if i%16 == 15 { | |
+ fmt.Printf(" %s\n", string(a[:])) | |
+ } | |
+ } | |
+} | |
diff --git a/transport/socks5/socks5.go b/transport/socks5/socks5.go | |
index b2bf676..3201688 100644 | |
--- a/transport/socks5/socks5.go | |
+++ b/transport/socks5/socks5.go | |
@@ -139,6 +139,7 @@ func (a Addr) UDPAddr() *net.UDPAddr { | |
var port int | |
switch a[0] { | |
case AtypDomainName /* unsupported */ : | |
+ fmt.Printf("[transport|socks5] UDPAddr() has type AtypDomainName (unsupported) \n") | |
return nil | |
case AtypIPv4: | |
ip = make([]byte, net.IPv4len) | |
@@ -179,6 +180,9 @@ func ClientHandshake(rw io.ReadWriter, addr Addr, command Command, user *User) ( | |
return nil, err | |
} | |
+ //fmt.Printf("[transport|socks5] ClientHandshake() response buf\n") | |
+ //dumpByteSlice(buf[:MaxAddrLen]) | |
+ | |
if buf[0] != Version { | |
return nil, errors.New("socks version mismatched") | |
} | |
@@ -230,6 +234,9 @@ func ClientHandshake(rw io.ReadWriter, addr Addr, command Command, user *User) ( | |
return nil, fmt.Errorf("%s: %s", command, rep) | |
} | |
+ fmt.Printf("[transport|socks5] ClientHandshake() response buf\n") | |
+ dumpByteSlice(buf[:MaxAddrLen]) | |
+ | |
return ReadAddr(rw, buf) | |
} | |
@@ -381,6 +388,10 @@ func DecodeUDPPacket(packet []byte) (addr Addr, payload []byte, err error) { | |
} | |
payload = packet[3+len(addr):] | |
+ | |
+ fmt.Printf("[transport|socks5] DecodeUDPPacket() buf\n") | |
+ dumpByteSlice(payload) | |
+ | |
return | |
} | |
@@ -389,5 +400,37 @@ func EncodeUDPPacket(addr Addr, payload []byte) (packet []byte, err error) { | |
return nil, errors.New("address is invalid") | |
} | |
packet = bytes.Join([][]byte{{0x00, 0x00, 0x00}, addr, payload}, nil) | |
+ | |
+ fmt.Printf("[transport|socks5] EncodeUDPPacket() buf\n") | |
+ dumpByteSlice(payload) | |
+ | |
return | |
} | |
+ | |
+func dumpByteSlice(b []byte) { | |
+ var a [16]byte | |
+ n := (len(b) + 15) &^ 15 | |
+ for i := 0; i < n; i++ { | |
+ if i%16 == 0 { | |
+ fmt.Printf("%4d", i) | |
+ } | |
+ if i%8 == 0 { | |
+ fmt.Print(" ") | |
+ } | |
+ if i < len(b) { | |
+ fmt.Printf(" %02X", b[i]) | |
+ } else { | |
+ fmt.Print(" ") | |
+ } | |
+ if i >= len(b) { | |
+ a[i%16] = ' ' | |
+ } else if b[i] < 32 || b[i] > 126 { | |
+ a[i%16] = '.' | |
+ } else { | |
+ a[i%16] = b[i] | |
+ } | |
+ if i%16 == 15 { | |
+ fmt.Printf(" %s\n", string(a[:])) | |
+ } | |
+ } | |
+} | |
diff --git a/tunnel/udp.go b/tunnel/udp.go | |
index 8b9c780..9f1aa6f 100644 | |
--- a/tunnel/udp.go | |
+++ b/tunnel/udp.go | |
@@ -5,6 +5,7 @@ import ( | |
"net" | |
"sync" | |
"time" | |
+ "fmt" | |
"github.com/xjasonlyu/tun2socks/v2/common/pool" | |
"github.com/xjasonlyu/tun2socks/v2/core/adapter" | |
@@ -58,6 +59,7 @@ func handleUDPConn(uc adapter.UDPConn) { | |
log.Infof("[UDP] %s <-> %s", metadata.SourceAddress(), metadata.DestinationAddress()) | |
relayPacket(uc, pc, remote) | |
+ log.Infof("[UDP] done relayPacket()") | |
} | |
func relayPacket(left net.PacketConn, right net.PacketConn, to net.Addr) { | |
@@ -66,6 +68,7 @@ func relayPacket(left net.PacketConn, right net.PacketConn, to net.Addr) { | |
go func() { | |
defer wg.Done() | |
+ log.Infof("[UDP] calling copyPacketBuffer(right, left, ...)") | |
if err := copyPacketBuffer(right, left, to, _udpSessionTimeout); err != nil { | |
log.Warnf("[UDP] %v", err) | |
} | |
@@ -73,6 +76,7 @@ func relayPacket(left net.PacketConn, right net.PacketConn, to net.Addr) { | |
go func() { | |
defer wg.Done() | |
+ log.Infof("[UDP] calling copyPacketBuffer(left, right, ...)") | |
if err := copyPacketBuffer(left, right, nil, _udpSessionTimeout); err != nil { | |
log.Warnf("[UDP] %v", err) | |
} | |
@@ -88,14 +92,20 @@ func copyPacketBuffer(dst net.PacketConn, src net.PacketConn, to net.Addr, timeo | |
for { | |
src.SetReadDeadline(time.Now().Add(timeout)) | |
n, _, err := src.ReadFrom(buf) | |
+ log.Infof("[UDP] src.ReadFrom(buf) read %d packets", n) | |
if ne, ok := err.(net.Error); ok && ne.Timeout() { | |
+ log.Infof("[UDP] ne.Timeout() reached") | |
return nil /* ignore I/O timeout */ | |
} else if err == io.EOF { | |
+ log.Infof("[UDP] io.EOF reached") | |
return nil /* ignore EOF */ | |
} else if err != nil { | |
return err | |
} | |
+ //log.Infof("[UDP] have buffer %#v", buf[:n]) | |
+ dumpByteSlice(buf[:n]) | |
+ | |
if _, err = dst.WriteTo(buf[:n], to); err != nil { | |
return err | |
} | |
@@ -129,3 +139,31 @@ func (pc *symmetricNATPacketConn) ReadFrom(p []byte) (int, net.Addr, error) { | |
return n, from, err | |
} | |
} | |
+ | |
+func dumpByteSlice(b []byte) { | |
+ var a [16]byte | |
+ n := (len(b) + 15) &^ 15 | |
+ for i := 0; i < n; i++ { | |
+ if i%16 == 0 { | |
+ fmt.Printf("%4d", i) | |
+ } | |
+ if i%8 == 0 { | |
+ fmt.Print(" ") | |
+ } | |
+ if i < len(b) { | |
+ fmt.Printf(" %02X", b[i]) | |
+ } else { | |
+ fmt.Print(" ") | |
+ } | |
+ if i >= len(b) { | |
+ a[i%16] = ' ' | |
+ } else if b[i] < 32 || b[i] > 126 { | |
+ a[i%16] = '.' | |
+ } else { | |
+ a[i%16] = b[i] | |
+ } | |
+ if i%16 == 15 { | |
+ fmt.Printf(" %s\n", string(a[:])) | |
+ } | |
+ } | |
+} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment