Last active
August 31, 2025 18:38
-
-
Save mike-weiner/0805a38bbc4c9fcc70506476d66ea7e8 to your computer and use it in GitHub Desktop.
A very basic SSH proxy using Go to simulate a client connection sending a TCP RST.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Replace `<server-ip>` with your real endpoint. | |
| // Use `go run ssh-proxy.go` for a healthy proxy. | |
| // Use `go run ssh-proxy.go --broken` for a proxy that closes the connection. | |
| package main | |
| import ( | |
| "flag" | |
| "io" | |
| "log" | |
| "net" | |
| ) | |
| func handleConnection(clientConn net.Conn, target string, broken bool) { | |
| defer clientConn.Close() | |
| serverConn, err := net.Dial("tcp", target) | |
| if err != nil { | |
| log.Printf("Failed to connect to target: %v", err) | |
| return | |
| } | |
| defer serverConn.Close() | |
| if broken { | |
| // Broken behavior: immediately close to simulate TCP RST | |
| log.Printf("[BROKEN] Resetting connection from %s to %s", clientConn.RemoteAddr(), target) | |
| return | |
| } | |
| // Working behavior: forward traffic | |
| log.Printf("[WORKING] Forwarding connection from %s to %s", clientConn.RemoteAddr(), target) | |
| go io.Copy(serverConn, clientConn) | |
| io.Copy(clientConn, serverConn) | |
| } | |
| func main() { | |
| listenAddr := flag.String("listen", ":2222", "Proxy listen address") | |
| targetAddr := flag.String("target", "<server-ip>:22", "Target address to forward to") | |
| broken := flag.Bool("broken", false, "Start in broken mode (immediate reset)") | |
| flag.Parse() | |
| ln, err := net.Listen("tcp", *listenAddr) | |
| if err != nil { | |
| log.Fatalf("Failed to listen: %v", err) | |
| } | |
| log.Printf("Proxy listening on %s, forwarding to %s (broken=%v)", *listenAddr, *targetAddr, *broken) | |
| for { | |
| clientConn, err := ln.Accept() | |
| if err != nil { | |
| log.Printf("Accept error: %v", err) | |
| continue | |
| } | |
| go handleConnection(clientConn, *targetAddr, *broken) | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment