feat: add cli option to pass custom remote port

This commit is contained in:
tux
2026-01-27 17:31:19 +05:30
parent cb31ac762c
commit f586506180
4 changed files with 26 additions and 7 deletions

View File

@@ -16,18 +16,24 @@ var tcpCmd = &cobra.Command{
Short: "Start TCP proxy", Short: "Start TCP proxy",
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
port := args[0] localPort := args[0]
serverAddr, err := cmd.Flags().GetString("server") serverAddr, err := cmd.Flags().GetString("server")
if err != nil { if err != nil {
panic(err) panic(err)
} }
client.Start(serverAddr, fmt.Sprintf(":%s", port)) remotePort, err := cmd.Flags().GetString("port")
if err != nil {
panic(err)
}
client.Start(serverAddr, fmt.Sprintf(":%s", localPort), remotePort)
}, },
} }
func init() { func init() {
rootCmd.AddCommand(tcpCmd) rootCmd.AddCommand(tcpCmd)
tcpCmd.Flags().StringP("server", "s", "trok.cloud:1337", "Remote server address") tcpCmd.Flags().StringP("server", "s", "trok.cloud:1337", "Remote server address")
tcpCmd.Flags().StringP("port", "p", "0", "port on the remote server")
} }

View File

@@ -11,8 +11,8 @@ import (
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )
func Start(serverAddr, localAddr string) { func Start(serverAddr, localAddr, remotePort string) {
trok, err := NewTrokClient(serverAddr, localAddr) trok, err := NewTrokClient(serverAddr, localAddr, remotePort)
if err != nil { if err != nil {
log.Fatal().Msgf("failed init trok %v", err) log.Fatal().Msgf("failed init trok %v", err)
} }

View File

@@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"io" "io"
"net" "net"
"os"
"strings" "strings"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
@@ -18,15 +19,17 @@ type Trok struct {
controlClient *TCPClient controlClient *TCPClient
serverAddr string serverAddr string
localAddr string localAddr string
remotePort string
} }
func NewTrokClient(serverAddr, localAddr string) (*Trok, error) { func NewTrokClient(serverAddr, localAddr, remotePort string) (*Trok, error) {
controlClient, err := NewTCPClient(serverAddr, "Controller") controlClient, err := NewTCPClient(serverAddr, "Controller")
return &Trok{ return &Trok{
controlClient: controlClient, controlClient: controlClient,
serverAddr: serverAddr, serverAddr: serverAddr,
localAddr: localAddr, localAddr: localAddr,
remotePort: remotePort,
}, err }, err
} }
@@ -45,7 +48,7 @@ func (t *Trok) Stop() {
func (t *Trok) ControlConnHandler(conn net.Conn) { func (t *Trok) ControlConnHandler(conn net.Conn) {
p := lib.InitProtocolHandler(conn) p := lib.InitProtocolHandler(conn)
p.WriteMessage(&lib.Message{CMD: "HELO", ARG: "Trok"}) p.WriteMessage(&lib.Message{CMD: "HELO", ARG: t.remotePort})
for { for {
m, err := p.ReadMessage() m, err := p.ReadMessage()
@@ -66,6 +69,9 @@ func (t *Trok) ControlConnHandler(conn net.Conn) {
case "CNCT": case "CNCT":
go t.handleCMDCNCT(m) go t.handleCMDCNCT(m)
case "ERR":
go t.handleCMDERR(m, conn)
default: default:
log.Info().Msgf("invalid command") log.Info().Msgf("invalid command")
} }
@@ -96,3 +102,9 @@ func (t *Trok) handleCMDCNCT(m *lib.Message) {
go io.Copy(upStream.conn, downStream.conn) go io.Copy(upStream.conn, downStream.conn)
io.Copy(downStream.conn, upStream.conn) io.Copy(downStream.conn, upStream.conn)
} }
func (t *Trok) handleCMDERR(m *lib.Message, conn net.Conn) {
log.Info().Msgf("[CMD] %s [ARG] %s", m.CMD, m.ARG)
conn.Close()
os.Exit(1)
}

View File

@@ -79,9 +79,10 @@ func (t *Trok) handleCMDHELO(p *lib.ProtocolHandler, m *lib.Message) {
log.Info().Msgf("[CMD] %s [ARG] %s", m.CMD, m.ARG) log.Info().Msgf("[CMD] %s [ARG] %s", m.CMD, m.ARG)
var s TCPServer var s TCPServer
err := s.Init(":", "Handler") err := s.Init(fmt.Sprintf(":%s", m.ARG), "Handler")
if err != nil { if err != nil {
log.Error().Msgf("error handling HELO cmd: %v", err) log.Error().Msgf("error handling HELO cmd: %v", err)
p.WriteMessage(&lib.Message{CMD: "ERR", ARG: "ADDRESS_UNAVAILABLE"})
return return
} }