Skip to content

Instantly share code, notes, and snippets.

@lenew
Last active November 1, 2022 04:11
Show Gist options
  • Save lenew/45840907e5a5d8835c576b845406770c to your computer and use it in GitHub Desktop.
Save lenew/45840907e5a5d8835c576b845406770c to your computer and use it in GitHub Desktop.
Transparent socks5 server with route mark
package main
import (
"flag"
"fmt"
"log"
"net"
"os"
"syscall"
"github.com/armon/go-socks5"
)
func setSocketMark(fd int, value int) (e error) {
return syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_MARK, value)
}
func main() {
listenaddr := flag.String("l", ":6488", "socks5 proxy listen address")
mark := flag.Int("m", 0, "route mark")
flag.Parse()
dialer := &net.Dialer{
Control: func(_, _ string, c syscall.RawConn) error {
return c.Control(func(fd uintptr) {
ex := setSocketMark(int(fd), *mark)
if ex != nil {
fmt.Printf("net dialer set mark error: %s", ex)
}
})
},
}
// Create a SOCKS5 server
config := &socks5.Config{
Logger: log.New(os.Stdout, "SOCKS5Server", log.LstdFlags),
Dial: dialer.DialContext,
}
server, err := socks5.New(config)
if err != nil {
panic(err)
}
fmt.Printf("Listening on %s...\n", *listenaddr)
fmt.Print("Press Ctrl+C to interrupt: ")
// Create SOCKS5 proxy on localhost port 1080
if err := server.ListenAndServe("tcp", *listenaddr); err != nil {
panic(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment