Skip to content

Instantly share code, notes, and snippets.

@lenew
Created October 11, 2017 10:19
Show Gist options
  • Save lenew/94dbf6dfe98423851104af764b9c94de to your computer and use it in GitHub Desktop.
Save lenew/94dbf6dfe98423851104af764b9c94de to your computer and use it in GitHub Desktop.
socks5-forward
//simple tool can forward a 'listen:port' to 'forward:port' though a 'socks5://server:port'
//usage socks5-forward listen:port forward:port socksurl
package main
import (
"io"
"log"
"net"
"os"
"net/url"
"golang.org/x/net/proxy"
)
func forward(conn net.Conn, proxyURL* url.URL) {
//client, err := net.Dial("tcp", os.Args[2])
proxy, err := proxy.FromURL(proxyURL, proxy.Direct)
if err != nil {
log.Fatalf("Proxy failed: %v", err)
}
client, err := proxy.Dial("tcp", os.Args[2])
if err != nil {
log.Fatalf("Dial failed: %v", err)
}
log.Printf("Connected to localhost %v\n", conn)
go func() {
defer client.Close()
defer conn.Close()
io.Copy(client, conn)
}()
go func() {
defer client.Close()
defer conn.Close()
io.Copy(conn, client)
}()
}
func main() {
if len(os.Args) != 4 {
log.Fatalf("Usage %s listen:port forward:port socksurl\n", os.Args[0]);
return
}
listener, err := net.Listen("tcp", os.Args[1])
if err != nil {
log.Fatalf("Failed to setup listener: %v", err)
}
proxyURL, err := url.Parse(os.Args[3])
if err != nil {
log.Fatalf("Proxy url invalid: %v", err)
}
for {
conn, err := listener.Accept()
log.Printf("new income")
if err != nil {
log.Fatalf("ERROR: failed to accept listener: %v", err)
}
log.Printf("Accepted connection %v\n", conn)
go forward(conn, proxyURL)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment