|
|
|
@ -14,6 +14,7 @@ import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
|
|
|
|
"log"
|
|
|
|
|
"net"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"gvisor.dev/gvisor/pkg/tcpip"
|
|
|
|
@ -30,6 +31,7 @@ import (
|
|
|
|
|
"gvisor.dev/gvisor/pkg/waiter"
|
|
|
|
|
"inet.af/netaddr"
|
|
|
|
|
"tailscale.com/net/packet"
|
|
|
|
|
"tailscale.com/net/socks5"
|
|
|
|
|
"tailscale.com/types/logger"
|
|
|
|
|
"tailscale.com/types/netmap"
|
|
|
|
|
"tailscale.com/wgengine"
|
|
|
|
@ -113,6 +115,7 @@ func (ns *Impl) Start() error {
|
|
|
|
|
ns.ipstack.SetTransportProtocolHandler(udp.ProtocolNumber, udpFwd.HandlePacket)
|
|
|
|
|
go ns.injectOutbound()
|
|
|
|
|
ns.tundev.PostFilterIn = ns.injectInbound
|
|
|
|
|
go ns.socks5Server()
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
@ -282,6 +285,21 @@ func (ns *Impl) forwardTCP(client *gonet.TCPConn, wq *waiter.Queue, address stri
|
|
|
|
|
ns.logf("[v2] netstack: forwarder connection to %s closed", address)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ns *Impl) socks5Server() {
|
|
|
|
|
ln, err := net.Listen("tcp", "localhost:1080")
|
|
|
|
|
if err != nil {
|
|
|
|
|
ns.logf("could not start SOCKS5 listener: %v", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
srv := &socks5.Server{
|
|
|
|
|
Logf: ns.logf,
|
|
|
|
|
Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) {
|
|
|
|
|
return ns.dialContextTCP(ctx, addr)
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
ns.logf("SOCKS5 server exited: %v", srv.Serve(ln))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ns *Impl) acceptUDP(r *udp.ForwarderRequest) {
|
|
|
|
|
ns.logf("[v2] UDP ForwarderRequest: %v", r)
|
|
|
|
|
var wq waiter.Queue
|
|
|
|
|