Skip to content

Instantly share code, notes, and snippets.

@leonjza
Created September 30, 2022 13:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save leonjza/35193696797fb58869d332a025bec784 to your computer and use it in GitHub Desktop.
Save leonjza/35193696797fb58869d332a025bec784 to your computer and use it in GitHub Desktop.
tun2socks debug patch
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