mirror of
https://github.com/tuxdotrs/trok.git
synced 2026-09-19 15:09:03 +05:30
Compare commits
7 Commits
v0.0.3
...
6c13858d46
| Author | SHA1 | Date | |
|---|---|---|---|
|
6c13858d46
|
|||
|
ad3792139d
|
|||
|
c1ba1e55d0
|
|||
|
a616409ee0
|
|||
|
3cceda5835
|
|||
|
e451f17df0
|
|||
|
f586506180
|
@@ -90,7 +90,7 @@ trok = {
|
||||
inputs.trok.nixosModules.default
|
||||
];
|
||||
|
||||
tux.services.trok = {
|
||||
services.trok = {
|
||||
enable = true;
|
||||
host = "0.0.0.0";
|
||||
port = 1337;
|
||||
|
||||
10
cmd/tcp.go
10
cmd/tcp.go
@@ -16,18 +16,24 @@ var tcpCmd = &cobra.Command{
|
||||
Short: "Start TCP proxy",
|
||||
Args: cobra.ExactArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
port := args[0]
|
||||
localPort := args[0]
|
||||
|
||||
serverAddr, err := cmd.Flags().GetString("server")
|
||||
if err != nil {
|
||||
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() {
|
||||
rootCmd.AddCommand(tcpCmd)
|
||||
tcpCmd.Flags().StringP("server", "s", "trok.cloud:1337", "Remote server address")
|
||||
tcpCmd.Flags().StringP("port", "p", "0", "port on the remote server")
|
||||
}
|
||||
|
||||
16
flake.nix
16
flake.nix
@@ -2,10 +2,12 @@
|
||||
description = "Simple tunneler in Go that exposes local ports to the internet";
|
||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
|
||||
outputs = {
|
||||
outputs =
|
||||
{
|
||||
self,
|
||||
nixpkgs,
|
||||
}: let
|
||||
}:
|
||||
let
|
||||
systems = [
|
||||
"x86_64-linux"
|
||||
"aarch64-linux"
|
||||
@@ -13,17 +15,19 @@
|
||||
"aarch64-darwin"
|
||||
];
|
||||
|
||||
forAllSystems = function: nixpkgs.lib.genAttrs systems (system: function nixpkgs.legacyPackages.${system});
|
||||
in {
|
||||
forAllSystems =
|
||||
function: nixpkgs.lib.genAttrs systems (system: function nixpkgs.legacyPackages.${system});
|
||||
in
|
||||
{
|
||||
packages = forAllSystems (pkgs: rec {
|
||||
default = trok;
|
||||
trok = pkgs.callPackage ./default.nix {};
|
||||
trok = pkgs.callPackage ./package.nix { };
|
||||
});
|
||||
|
||||
nixosModules.default = ./module.nix;
|
||||
|
||||
devShells = forAllSystems (pkgs: {
|
||||
default = pkgs.callPackage ./shell.nix {};
|
||||
default = pkgs.callPackage ./shell.nix { };
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@ import (
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func Start(serverAddr, localAddr string) {
|
||||
trok, err := NewTrokClient(serverAddr, localAddr)
|
||||
func Start(serverAddr, localAddr, remotePort string) {
|
||||
trok, err := NewTrokClient(serverAddr, localAddr, remotePort)
|
||||
if err != nil {
|
||||
log.Fatal().Msgf("failed init trok %v", err)
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
@@ -18,15 +19,17 @@ type Trok struct {
|
||||
controlClient *TCPClient
|
||||
serverAddr 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")
|
||||
|
||||
return &Trok{
|
||||
controlClient: controlClient,
|
||||
serverAddr: serverAddr,
|
||||
localAddr: localAddr,
|
||||
remotePort: remotePort,
|
||||
}, err
|
||||
}
|
||||
|
||||
@@ -45,7 +48,7 @@ func (t *Trok) Stop() {
|
||||
func (t *Trok) ControlConnHandler(conn net.Conn) {
|
||||
p := lib.InitProtocolHandler(conn)
|
||||
|
||||
p.WriteMessage(&lib.Message{CMD: "HELO", ARG: "Trok"})
|
||||
p.WriteMessage(&lib.Message{CMD: "HELO", ARG: t.remotePort})
|
||||
|
||||
for {
|
||||
m, err := p.ReadMessage()
|
||||
@@ -61,18 +64,21 @@ func (t *Trok) ControlConnHandler(conn net.Conn) {
|
||||
switch m.CMD {
|
||||
|
||||
case "EHLO":
|
||||
go t.hanldeCMDEHLO(m)
|
||||
go t.handleCMDEHLO(m)
|
||||
|
||||
case "CNCT":
|
||||
go t.handleCMDCNCT(m)
|
||||
|
||||
case "ERR":
|
||||
go t.handleCMDERR(m, conn)
|
||||
|
||||
default:
|
||||
log.Info().Msgf("invalid command")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Trok) hanldeCMDEHLO(m *lib.Message) {
|
||||
func (t *Trok) handleCMDEHLO(m *lib.Message) {
|
||||
parts := strings.Split(t.serverAddr, ":")
|
||||
log.Info().Msgf("[CMD] %s [ARG] %s:%s", m.CMD, parts[0], m.ARG)
|
||||
}
|
||||
@@ -96,3 +102,9 @@ func (t *Trok) handleCMDCNCT(m *lib.Message) {
|
||||
go io.Copy(upStream.conn, downStream.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)
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ type Trok struct {
|
||||
|
||||
func (t *Trok) Init(addr string) error {
|
||||
t.publicConns = make(map[string]Conn)
|
||||
t.webServer = NewTrokWeb(":443")
|
||||
t.webServer = NewTrokWeb(":1338")
|
||||
err := t.controlServer.Init(addr, "Controller")
|
||||
return err
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
var s TCPServer
|
||||
err := s.Init(":", "Handler")
|
||||
err := s.Init(fmt.Sprintf(":%s", m.ARG), "Handler")
|
||||
if err != nil {
|
||||
log.Error().Msgf("error handling HELO cmd: %v", err)
|
||||
p.WriteMessage(&lib.Message{CMD: "ERR", ARG: "ADDRESS_UNAVAILABLE"})
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/tuxdotrs/trok/internal/web"
|
||||
"golang.org/x/crypto/acme/autocert"
|
||||
)
|
||||
|
||||
type TrokWeb struct {
|
||||
@@ -36,29 +34,7 @@ func (t *TrokWeb) Start() {
|
||||
Browse: true,
|
||||
}))
|
||||
|
||||
cfg := t.GetTLSCert()
|
||||
|
||||
ln, err := tls.Listen("tcp", t.addr, cfg)
|
||||
if err != nil {
|
||||
log.Panic().Msgf("unable to start trok webserver: %v", err)
|
||||
}
|
||||
|
||||
t.app.Listener(ln)
|
||||
}
|
||||
|
||||
func (t *TrokWeb) GetTLSCert() *tls.Config {
|
||||
m := &autocert.Manager{
|
||||
Prompt: autocert.AcceptTOS,
|
||||
HostPolicy: autocert.HostWhitelist("trok.cloud"),
|
||||
Cache: autocert.DirCache("./certs"),
|
||||
}
|
||||
|
||||
return &tls.Config{
|
||||
GetCertificate: m.GetCertificate,
|
||||
NextProtos: []string{
|
||||
"http/1.1", "acme-tls/1",
|
||||
},
|
||||
}
|
||||
log.Panic().Err(t.app.Listen(t.addr)).Msg("unable to start trok webserver")
|
||||
}
|
||||
|
||||
func (t *TrokWeb) Stop() {
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.tux.services.trok;
|
||||
cfg = config.services.trok;
|
||||
in {
|
||||
options.tux.services.trok = {
|
||||
options.services.trok = {
|
||||
enable = mkEnableOption "Enable trok";
|
||||
|
||||
host = mkOption {
|
||||
|
||||
@@ -11,7 +11,7 @@ buildGoModule {
|
||||
|
||||
meta = {
|
||||
license = lib.licenses.mit;
|
||||
maintainers = with lib.maintainers; [tuxdotrs];
|
||||
maintainers = with lib.maintainers; [ tuxdotrs ];
|
||||
mainProgram = "trok";
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user