Commit ccd7441a by anun

flag code

parent fe246359
No preview for this file type
...@@ -44,6 +44,7 @@ type Config struct { ...@@ -44,6 +44,7 @@ type Config struct {
TLS TLSConfig TLS TLSConfig
DialContext func(ctx context.Context, network, addr string) (net.Conn, error) DialContext func(ctx context.Context, network, addr string) (net.Conn, error)
Verbose bool Verbose bool
Code string
} }
// TLSConfig for a Client // TLSConfig for a Client
...@@ -120,7 +121,7 @@ func NewClient(c *Config) (*Client, error) { ...@@ -120,7 +121,7 @@ func NewClient(c *Config) (*Client, error) {
client.Logger.Info = true client.Logger.Info = true
p, e := getPort(c.Server+"/register") p, e := getPort(c.Server+"/register")
client.Debugf("p = %s", p) client.Debugf("---> p = %s", p)
if e != nil { if e != nil {
client.Errorf("request %s/register : %s", c.Server, e) client.Errorf("request %s/register : %s", c.Server, e)
} }
...@@ -158,13 +159,16 @@ client.Debugf("p = %s", p) ...@@ -158,13 +159,16 @@ client.Debugf("p = %s", p)
} }
client.tlsConfig = tc client.tlsConfig = tc
} }
if c.Code == "" {
c.Code = settings.RandString(16)
}
//validate remotes //validate remotes
client.Debugf("c.Remotes = %s", c.Remotes) // client.Debugf("---> c.Remotes = %s", c.Remotes)
for _, s := range c.Remotes { for _, s := range c.Remotes {
s = "R:"+string(p)+":"+s s = "R:"+string(p)+":"+s
client.Debugf("s = %s", s) client.Debugf("s = %s", s)
r, err := settings.DecodeRemote(s) r, err := settings.DecodeRemote(s)
client.Debugf("r = %s", r) client.Debugf("r = %s", r)
if err != nil { if err != nil {
return nil, fmt.Errorf("Failed to decode remote '%s': %s", s, err) return nil, fmt.Errorf("Failed to decode remote '%s': %s", s, err)
} }
...@@ -186,14 +190,15 @@ client.Debugf("r = %s", r) ...@@ -186,14 +190,15 @@ client.Debugf("r = %s", r)
} }
client.computed.Remotes = append(client.computed.Remotes, r) client.computed.Remotes = append(client.computed.Remotes, r)
} }
client.Infof("Remotes# %s", client.computed.Remotes) client.computed.Code = c.Code
client.Infof("---> Remotes client.computed# %s", client.computed)
//outbound proxy //outbound proxy
if p := c.Proxy; p != "" { if p := c.Proxy; p != "" {
client.proxyURL, err = url.Parse(p) client.proxyURL, err = url.Parse(p)
if err != nil { if err != nil {
return nil, fmt.Errorf("Invalid proxy URL (%s)", err) return nil, fmt.Errorf("Invalid proxy URL (%s)", err)
} }
client.Debugf("client.proxyURL = %s", client.proxyURL) client.Debugf("---> client.proxyURL = %s", client.proxyURL)
} }
//ssh auth and config //ssh auth and config
user, pass := settings.ParseAuth(c.Auth) user, pass := settings.ParseAuth(c.Auth)
......
...@@ -91,7 +91,6 @@ func (c *Client) connectionOnce(ctx context.Context) (connected bool, err error) ...@@ -91,7 +91,6 @@ func (c *Client) connectionOnce(ctx context.Context) (connected bool, err error)
} }
} }
//c.Infof("c.server = %s", c.server) //c.Infof("c.server = %s", c.server)
//c.Infof("c = %s", c)
wsConn, _, err := d.DialContext(ctx, c.server, c.config.Headers) wsConn, _, err := d.DialContext(ctx, c.server, c.config.Headers)
if err != nil { if err != nil {
return false, err return false, err
...@@ -115,6 +114,8 @@ func (c *Client) connectionOnce(ctx context.Context) (connected bool, err error) ...@@ -115,6 +114,8 @@ func (c *Client) connectionOnce(ctx context.Context) (connected bool, err error)
// chisel client handshake (reverse of server handshake) // chisel client handshake (reverse of server handshake)
// send configuration // send configuration
c.Debugf("Sending config") c.Debugf("Sending config")
c.Debugf("---> c.computed = %s", c.computed)
//c.Debugf("---> c = %s", c)
t0 := time.Now() t0 := time.Now()
_, configerr, err := sshConn.SendRequest( _, configerr, err := sshConn.SendRequest(
"config", "config",
...@@ -128,7 +129,7 @@ func (c *Client) connectionOnce(ctx context.Context) (connected bool, err error) ...@@ -128,7 +129,7 @@ func (c *Client) connectionOnce(ctx context.Context) (connected bool, err error)
if len(configerr) > 0 { if len(configerr) > 0 {
return false, errors.New(string(configerr)) return false, errors.New(string(configerr))
} }
//c.Infof("settings.EncodeConfig = %s", settings.EncodeConfig(c.computed)) //c.Debugf("---> settings.EncodeConfig = %s", settings.EncodeConfig(c.computed))
c.Infof("Connected (Latency %s)", time.Since(t0)) c.Infof("Connected (Latency %s)", time.Since(t0))
//connected, handover ssh connection for tunnel to use, and block //connected, handover ssh connection for tunnel to use, and block
err = c.tunnel.BindSSH(ctx, sshConn, reqs, chans) err = c.tunnel.BindSSH(ctx, sshConn, reqs, chans)
......
...@@ -416,6 +416,8 @@ var clientHelp = ` ...@@ -416,6 +416,8 @@ var clientHelp = `
--tls-cert, a path to a PEM encoded certificate matching the provided --tls-cert, a path to a PEM encoded certificate matching the provided
private key. The certificate must have client authentication private key. The certificate must have client authentication
enabled (mutual-TLS). enabled (mutual-TLS).
--code, serial number, token, text
` + commonHelp ` + commonHelp
func client(args []string) { func client(args []string) {
...@@ -432,6 +434,7 @@ func client(args []string) { ...@@ -432,6 +434,7 @@ func client(args []string) {
flags.StringVar(&config.TLS.Cert, "tls-cert", "", "") flags.StringVar(&config.TLS.Cert, "tls-cert", "", "")
flags.StringVar(&config.TLS.Key, "tls-key", "", "") flags.StringVar(&config.TLS.Key, "tls-key", "", "")
flags.Var(&headerFlags{config.Headers}, "header", "") flags.Var(&headerFlags{config.Headers}, "header", "")
flags.StringVar(&config.Code, "code", "", "")
hostname := flags.String("hostname", "", "") hostname := flags.String("hostname", "", "")
sni := flags.String("sni", "", "") sni := flags.String("sni", "", "")
pid := flags.Bool("pid", false, "") pid := flags.Bool("pid", false, "")
......
...@@ -112,6 +112,7 @@ func (s *Server) handleWebsocket(w http.ResponseWriter, req *http.Request) { ...@@ -112,6 +112,7 @@ func (s *Server) handleWebsocket(w http.ResponseWriter, req *http.Request) {
l.Debugf("Verifying configuration") l.Debugf("Verifying configuration")
// wait for request, with timeout // wait for request, with timeout
var r *ssh.Request var r *ssh.Request
// l.Debugf("---> r = %s", r)
select { select {
case r = <-reqs: case r = <-reqs:
case <-time.After(settings.EnvDuration("CONFIG_TIMEOUT", 10*time.Second)): case <-time.After(settings.EnvDuration("CONFIG_TIMEOUT", 10*time.Second)):
...@@ -127,7 +128,9 @@ func (s *Server) handleWebsocket(w http.ResponseWriter, req *http.Request) { ...@@ -127,7 +128,9 @@ func (s *Server) handleWebsocket(w http.ResponseWriter, req *http.Request) {
failed(s.Errorf("expecting config request")) failed(s.Errorf("expecting config request"))
return return
} }
l.Debugf("---> r.Payload = %s", r.Payload)
c, err := settings.DecodeConfig(r.Payload) c, err := settings.DecodeConfig(r.Payload)
l.Debugf("---> c = %s", c)
if err != nil { if err != nil {
failed(s.Errorf("invalid config")) failed(s.Errorf("invalid config"))
return return
...@@ -192,7 +195,9 @@ func (s *Server) handleWebsocket(w http.ResponseWriter, req *http.Request) { ...@@ -192,7 +195,9 @@ func (s *Server) handleWebsocket(w http.ResponseWriter, req *http.Request) {
err = eg.Wait() err = eg.Wait()
if err != nil && !strings.HasSuffix(err.Error(), "EOF") { if err != nil && !strings.HasSuffix(err.Error(), "EOF") {
l.Debugf("Closed connection (%s)", err) l.Debugf("Closed connection (%s)", err)
l.Debugf("Code (%s)", s.config)
} else { } else {
l.Debugf("Closed connection") l.Debugf("Closed connection")
l.Debugf("Code (%s)", s.config)
} }
} }
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
type Config struct { type Config struct {
Version string Version string
Remotes Remotes
Code string
} }
func DecodeConfig(b []byte) (*Config, error) { func DecodeConfig(b []byte) (*Config, error) {
......
...@@ -7,6 +7,8 @@ import ( ...@@ -7,6 +7,8 @@ import (
"regexp" "regexp"
"strconv" "strconv"
"strings" "strings"
// "log"
"math/rand"
) )
// short-hand conversions (see remote_test) // short-hand conversions (see remote_test)
...@@ -36,6 +38,7 @@ type Remote struct { ...@@ -36,6 +38,7 @@ type Remote struct {
LocalHost, LocalPort, LocalProto string LocalHost, LocalPort, LocalProto string
RemoteHost, RemotePort, RemoteProto string RemoteHost, RemotePort, RemoteProto string
Socks, Reverse, Stdio bool Socks, Reverse, Stdio bool
Code string
} }
const revPrefix = "R:" const revPrefix = "R:"
...@@ -56,6 +59,7 @@ func DecodeRemote(s string) (*Remote, error) { ...@@ -56,6 +59,7 @@ func DecodeRemote(s string) (*Remote, error) {
//to provide the defaults) //to provide the defaults)
for i := len(parts) - 1; i >= 0; i-- { for i := len(parts) - 1; i >= 0; i-- {
p := parts[i][1] p := parts[i][1]
//log.Println(r.Code)
//remote portion is socks? //remote portion is socks?
if i == len(parts)-1 && p == "socks" { if i == len(parts)-1 && p == "socks" {
r.Socks = true r.Socks = true
...@@ -66,6 +70,12 @@ func DecodeRemote(s string) (*Remote, error) { ...@@ -66,6 +70,12 @@ func DecodeRemote(s string) (*Remote, error) {
r.Stdio = true r.Stdio = true
continue continue
} }
// if i == len(parts)-1 && len(p) >= 16 && p != "socks" && p != "stdio" {
// r.Code = p
// continue
// }
p, proto := L4Proto(p) p, proto := L4Proto(p)
if proto != "" { if proto != "" {
if r.RemotePort == "" { if r.RemotePort == "" {
...@@ -273,3 +283,12 @@ func (rs Remotes) Encode() []string { ...@@ -273,3 +283,12 @@ func (rs Remotes) Encode() []string {
} }
return s return s
} }
func RandString(n int) string {
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
b := make([]byte, n)
for i := range b {
b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
return string(b)
}
...@@ -70,6 +70,7 @@ func New(c Config) *Tunnel { ...@@ -70,6 +70,7 @@ func New(c Config) *Tunnel {
//BindSSH provides an active SSH for use for tunnelling //BindSSH provides an active SSH for use for tunnelling
func (t *Tunnel) BindSSH(ctx context.Context, c ssh.Conn, reqs <-chan *ssh.Request, chans <-chan ssh.NewChannel) error { func (t *Tunnel) BindSSH(ctx context.Context, c ssh.Conn, reqs <-chan *ssh.Request, chans <-chan ssh.NewChannel) error {
//t.Debugf("reqs %s", reqs)
//link ctx to ssh-conn //link ctx to ssh-conn
go func() { go func() {
<-ctx.Done() <-ctx.Done()
...@@ -151,11 +152,14 @@ func (t *Tunnel) BindRemotes(ctx context.Context, remotes []*settings.Remote) er ...@@ -151,11 +152,14 @@ func (t *Tunnel) BindRemotes(ctx context.Context, remotes []*settings.Remote) er
} }
proxies := make([]*Proxy, len(remotes)) proxies := make([]*Proxy, len(remotes))
for i, remote := range remotes { for i, remote := range remotes {
//t.Debugf("remote = %s", remote)
//e.g. tun: remote = R:60569=>172.16.112.109:8001
p, err := NewProxy(t.Logger, t, t.proxyCount, remote) p, err := NewProxy(t.Logger, t, t.proxyCount, remote)
if err != nil { if err != nil {
return err return err
} }
proxies[i] = p proxies[i] = p
//t.Debugf("p = %s", p)
t.proxyCount++ t.proxyCount++
} }
//TODO: handle tunnel close //TODO: handle tunnel close
...@@ -169,6 +173,7 @@ func (t *Tunnel) BindRemotes(ctx context.Context, remotes []*settings.Remote) er ...@@ -169,6 +173,7 @@ func (t *Tunnel) BindRemotes(ctx context.Context, remotes []*settings.Remote) er
t.Debugf("Bound proxies") t.Debugf("Bound proxies")
err := eg.Wait() err := eg.Wait()
t.Debugf("Unbound proxies") t.Debugf("Unbound proxies")
t.Debugf("................")
return err return err
} }
......
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
"io" "io"
"net" "net"
"sync" "sync"
"log"
"dev.nexpie.com/anun/chisel/share/cio" "dev.nexpie.com/anun/chisel/share/cio"
"dev.nexpie.com/anun/chisel/share/settings" "dev.nexpie.com/anun/chisel/share/settings"
...@@ -56,6 +57,7 @@ func (p *Proxy) listen() error { ...@@ -56,6 +57,7 @@ func (p *Proxy) listen() error {
} }
p.Infof("Listening") p.Infof("Listening")
p.tcp = l p.tcp = l
// regisAddress(p.remote.Code)
} else if p.remote.LocalProto == "udp" { } else if p.remote.LocalProto == "udp" {
l, err := listenUDP(p.Logger, p.sshTun, p.remote) l, err := listenUDP(p.Logger, p.sshTun, p.remote)
if err != nil { if err != nil {
...@@ -63,6 +65,7 @@ func (p *Proxy) listen() error { ...@@ -63,6 +65,7 @@ func (p *Proxy) listen() error {
} }
p.Infof("Listening") p.Infof("Listening")
p.udp = l p.udp = l
// regisAddress(p.remote.Code)
} else { } else {
return p.Errorf("unknown local proto") return p.Errorf("unknown local proto")
} }
...@@ -148,3 +151,8 @@ func (p *Proxy) pipeRemote(ctx context.Context, src io.ReadWriteCloser) { ...@@ -148,3 +151,8 @@ func (p *Proxy) pipeRemote(ctx context.Context, src io.ReadWriteCloser) {
s, r := cio.Pipe(src, dst) s, r := cio.Pipe(src, dst)
l.Debugf("Close (sent %s received %s)", sizestr.ToString(s), sizestr.ToString(r)) l.Debugf("Close (sent %s received %s)", sizestr.ToString(s), sizestr.ToString(r))
} }
func regisAddress(c string) {
log.Printf("NEXPIE route register...")
log.Printf("p.remote.Code = %s", c)
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment