add tcp client tunnel

This commit is contained in:
octeep 2022-03-11 11:40:34 +00:00 committed by octeep
parent c21133a1af
commit 9935eb6f60

75
main.go
View file

@ -192,13 +192,18 @@ func socks5Routine(config map[string]string) (*netip.Addr, func(*netstack.Net),
return nil, nil, err
}
vpnIP := net.ParseIP(vpnAddr.String())
if vpnIP == nil {
return nil, nil, errors.New("invalid ip")
}
bindAddr, ok := config["bindaddress"]
if !ok {
return nil, nil, errors.New("missing bind address")
}
routine := func(tnet *netstack.Net) {
conf := &socks5.Config{ Dial: tnet.DialContext }
conf := &socks5.Config{ Dial: tnet.DialContext, BindIP: vpnIP }
server, err := socks5.New(conf)
if err != nil {
log.Panic(err)
@ -212,6 +217,72 @@ func socks5Routine(config map[string]string) (*netip.Addr, func(*netstack.Net),
return &vpnAddr, routine, nil
}
func connForward(bufSize int, from, to net.Conn) {
buf := make([]byte, bufSize)
for {
size, err := from.Read(buf)
if err != nil {
to.Close()
return
}
_, err = to.Write(buf[:size])
if err != nil {
to.Close()
return
}
}
}
func tcpClientForward(tnet *netstack.Net, target string, conn net.Conn) {
sconn, err := tnet.Dial("tcp", target)
if err != nil {
fmt.Printf("[ERROR] TCP Client Tunnel to %s: %s\n", target, err.Error())
return
}
go connForward(1024, sconn, conn)
go connForward(1024, conn, sconn)
}
func tcpClientRoutine(config map[string]string) (*netip.Addr, func(*netstack.Net), error) {
vpnAddr, err := netip.ParseAddr(config["vpnaddress"])
if err != nil {
return nil, nil, err
}
bindAddr, ok := config["bindaddress"]
if !ok {
return nil, nil, errors.New("missing bind address")
}
bindTCPAddr, err := net.ResolveTCPAddr("tcp", bindAddr)
if err != nil {
return nil, nil, err
}
target, ok := config["target"]
if !ok {
return nil, nil, errors.New("missing target")
}
routine := func(tnet *netstack.Net) {
server, err := net.ListenTCP("tcp", bindTCPAddr)
if err != nil {
log.Panic(err)
}
for {
conn, err := server.Accept()
if err != nil {
log.Panic(err)
}
go tcpClientForward(tnet, target, conn)
}
}
return &vpnAddr, routine, nil
}
func startWireguard(request string, boundAddrs, dns []netip.Addr) (*netstack.Net, error) {
tun, tnet, err := netstack.CreateNetTUN(boundAddrs, dns, 1420)
if err != nil {
@ -249,7 +320,7 @@ func main() {
case "[socks5]":
addr, routine, err = socks5Routine(section.entries)
case "[tcpclienttunnel]":
log.Panic(errors.New("not supported yet"))
addr, routine, err = tcpClientRoutine(section.entries)
case "[tcpservertunnel]":
log.Panic(errors.New("not supported yet"))
case "ROOT":