From f24c1b71152dc6b162be1ff26d30119f5d27ed0d Mon Sep 17 00:00:00 2001
From: Frank Sauerburger <frank@sauerburger.com>
Date: Wed, 31 Jan 2024 10:03:06 +0100
Subject: [PATCH] Improve logging and connection handling

---
 Dockerfile |  3 ++-
 main.go    | 24 +++++++++++++++---------
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 01f14a9..e36fcce 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -7,4 +7,5 @@ RUN go build -ldflags="-w -s" -o /go/bin/sshway
 
 FROM alpine:3.18
 COPY --from=builder /go/bin/sshway /bin/sshway
-CMD ["/bin/sshway"]
\ No newline at end of file
+EXPOSE 2222
+CMD ["/bin/sshway"]
diff --git a/main.go b/main.go
index ce5da7a..4910ceb 100644
--- a/main.go
+++ b/main.go
@@ -67,17 +67,20 @@ func main() {
 	fmt.Printf("Listening on %s\n", localAddr)
 	defer server.Close()
 
+	client_counter := 0
+
 	for {
 		connection, err := server.Accept()
 		if err != nil {
 			log.Fatalf("Error accepting local client: %v\n", err)
 		}
-		fmt.Printf("client connected %s\n", connection.RemoteAddr().String())
-		go handleClient(connection)
+		log.Printf("%6d New connection from client: %s\n", client_counter, connection.RemoteAddr().String())
+		go handleClient(client_counter, connection)
+		client_counter++
 	}
 }
 
-func handleClient(localSock net.Conn) {
+func handleClient(client_counter int, localSock net.Conn) {
 	defer localSock.Close()
 
 	config := &ssh.ClientConfig{
@@ -92,21 +95,24 @@ func handleClient(localSock net.Conn) {
 
 	conn, err := ssh.Dial("tcp", sshHost, config)
 	if err != nil {
-		log.Printf("SSH connection failed: %v\n", err)
+		log.Printf("%6d SSH connection failed: %v\n", client_counter, err)
 		return
 	}
-	defer conn.Close()
 
 	forwardClient, err := conn.Dial("tcp", remoteAddr)
 	if err != nil {
-		log.Printf("Port forward failed: %v\n", err)
+		log.Printf("%6d Port forward failed: %v\n", client_counter, err)
+		conn.Close()
 		return
 	}
 
 	go func() {
-		io.Copy(localSock, forwardClient)
+		io.Copy(forwardClient, localSock)
+		log.Printf("%6d Local client disconnected\n", client_counter)
+		conn.Close()
 	}()
 
-	io.Copy(forwardClient, localSock)
-	log.Printf("Disconnected: %v\n", localSock)
+	io.Copy(localSock, forwardClient)
+	log.Printf("%6d Remote socket closed for local client\n", client_counter)
+	conn.Close()
 }
-- 
GitLab