Skip to content

Instantly share code, notes, and snippets.

@mosajjal
Last active April 26, 2023 15:36
Show Gist options
  • Select an option

  • Save mosajjal/ce828eb228678ef8e522df8a327009fc to your computer and use it in GitHub Desktop.

Select an option

Save mosajjal/ce828eb228678ef8e522df8a327009fc to your computer and use it in GitHub Desktop.
package main
import (
"context"
"fmt"
"log"
"net"
"os"
"strconv"
"syscall"
"github.com/spf13/pflag"
"tailscale.com/net/socks5"
)
var SEG_SIZE int
func dial(ctx context.Context, network, addr string) (net.Conn, error) {
// create a low level connection and set the TCP Max segment size
fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_TCP)
if err != nil {
return nil, err
}
err = syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, syscall.TCP_MAXSEG, SEG_SIZE)
if err != nil {
return nil, err
}
// get the new seg size and print
// r, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_TCP, syscall.TCP_MAXSEG)
// if err != nil {
// log.Println(err)
// } else {
// fmt.Println(r)
// }
// addr is in ip:port format, need to convert it back and extract port
var ipBytes net.IP
serverAddr, serverPortStr, err := net.SplitHostPort(addr)
if err != nil {
return nil, err
}
serverPort, _ := strconv.Atoi(serverPortStr)
if ip := net.ParseIP(serverAddr); ip != nil {
if ip.To4() != nil {
ipBytes = ip.To4()
} else {
return nil, fmt.Errorf("ipv6 is not yet supported")
}
} else {
return nil, fmt.Errorf("fqdn is not yet supported")
}
// connect to remote host
sockAddr := syscall.SockaddrInet4{
Port: serverPort,
Addr: [4]byte{ipBytes[0], ipBytes[1], ipBytes[2], ipBytes[3]},
}
err = syscall.Connect(fd, &sockAddr)
defer syscall.Close(fd)
if err != nil {
return nil, err
}
// convert the fd back to a connection
f := os.NewFile(uintptr(fd), "")
return net.FileConn(f)
}
func main() {
listen := pflag.StringP("listen", "l", "127.0.0.1:1080", "Address to listen on")
segmentSize := pflag.IntP("size", "s", 250, "Segment size")
pflag.Parse()
SEG_SIZE = *segmentSize
l, err := net.Listen("tcp", *listen)
if err != nil {
log.Fatal(err)
}
mySocks := socks5.Server{
Dialer: dial,
}
log.Println("Started SOCKS on 1080")
log.Fatal(mySocks.Serve(l))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment