Skip to content

Instantly share code, notes, and snippets.

@ahmetozer
Created September 22, 2020 00:16
Show Gist options
  • Save ahmetozer/68bdce6e501e4cc8e15084e58a4f2059 to your computer and use it in GitHub Desktop.
Save ahmetozer/68bdce6e501e4cc8e15084e58a4f2059 to your computer and use it in GitHub Desktop.
Demo of tcp connection proxy with golang.
package main
import (
"io"
"log"
"net"
"os"
)
func forward(conn net.Conn) {
forward, err := net.Dial("tcp", os.Args[2])
if err != nil {
log.Printf("Dial failed to target: %v\n", err)
} else {
log.Printf("Connected to target %v:%v\n", forward.RemoteAddr().(*net.TCPAddr).IP, forward.RemoteAddr().(*net.TCPAddr).Port)
go func() {
defer forward.Close()
defer conn.Close()
io.Copy(forward, conn)
}()
go func() {
defer forward.Close()
defer conn.Close()
io.Copy(conn, forward)
}()
}
}
func main() {
if len(os.Args) != 3 {
log.Fatalf("Usage %s listen:port target:port\n", os.Args[0])
return
}
listen, err := net.Listen("tcp", os.Args[1])
if err != nil {
log.Fatalf("Failed to create a forward : %v", err)
}
for {
conn, err := listen.Accept()
if err != nil {
log.Fatalf("ERROR: failed to accept forward: %v", err)
}
log.Printf("Accepted incoming connection %v:%v\n", conn.RemoteAddr().(*net.TCPAddr).IP, conn.RemoteAddr().(*net.TCPAddr).Port)
go forward(conn)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment