yet more logs

This commit is contained in:
AJ ONeal 2020-07-15 03:33:23 -06:00
parent 4a566f7dca
commit 9f1985373e
9 changed files with 86 additions and 26 deletions

View File

@ -2,6 +2,7 @@ package telebit
import ( import (
"bufio" "bufio"
"fmt"
"net" "net"
"time" "time"
) )
@ -83,11 +84,13 @@ func (c *Conn) LocalAddr() net.Addr {
// LocalAddr returns the local network address. // LocalAddr returns the local network address.
func (c *Conn) LocalAddr() net.Addr { func (c *Conn) LocalAddr() net.Addr {
fmt.Println("[warn] LocalAddr() address source/target switch?")
return &c.relaySourceAddr return &c.relaySourceAddr
} }
// RemoteAddr returns the remote network address. // RemoteAddr returns the remote network address.
func (c *Conn) RemoteAddr() net.Addr { func (c *Conn) RemoteAddr() net.Addr {
fmt.Println("[warn] RemoteAddr() address source/target switch?")
return &c.relayTargetAddr return &c.relayTargetAddr
} }

View File

@ -88,11 +88,15 @@ func (c *ConnWrap) Scheme() string {
return "" return ""
} }
/* // CheckServername returns the servername without detection
func (c *ConnWrap) CheckServername() string {
return c.servername
}
// SetServername sets the servername without detection
func (c *ConnWrap) SetServername(name string) { func (c *ConnWrap) SetServername(name string) {
c.servername = name c.servername = name
} }
*/
// Servername may return Servername or Hostname as hinted by a tunnel or buffered peeking // Servername may return Servername or Hostname as hinted by a tunnel or buffered peeking
func (c *ConnWrap) Servername() string { func (c *ConnWrap) Servername() string {
@ -127,13 +131,18 @@ func (c *ConnWrap) isEncrypted() bool {
return *c.encrypted return *c.encrypted
} }
var encrypted bool
// TODO: how to allow / detect / handle protocols where the server hello happens first? // TODO: how to allow / detect / handle protocols where the server hello happens first?
c.SetDeadline(time.Now().Add(5 * time.Second)) c.SetDeadline(time.Now().Add(5 * time.Second))
n := 6 n := 6
b, _ := c.Peek(n) b, err := c.Peek(n)
fmt.Println("[debug] Peek(n)", b, string(b)) fmt.Printf("[debug] [wrap] Peek(%d): %s %s %s\n", n, b, string(b), err)
if nil != err {
// TODO return error on error?
return encrypted
}
defer c.SetDeadline(time.Time{}) defer c.SetDeadline(time.Time{})
var encrypted bool
if len(b) >= n { if len(b) >= n {
// SSL v3.x / TLS v1.x // SSL v3.x / TLS v1.x
// 0: TLS Byte // 0: TLS Byte

View File

@ -4,6 +4,7 @@ import (
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"io" "io"
"log"
) )
// Decoder handles a Reader stream containing mplexy-encoded clients // Decoder handles a Reader stream containing mplexy-encoded clients
@ -32,7 +33,7 @@ func (d *Decoder) Decode(out Router) error {
for { for {
b := make([]byte, d.bufferSize) b := make([]byte, d.bufferSize)
n, err := d.in.Read(b) n, err := d.in.Read(b)
fmt.Println("[debug] [decoder] [srv] Tunnel read", n) log.Println("[debug] [decoder] [srv] Tunnel read", n, string(b[:n]))
if n > 0 { if n > 0 {
rx <- b[:n] rx <- b[:n]
} }

View File

@ -67,12 +67,12 @@ type DNSProvider struct {
func NewDNSProvider() (*DNSProvider, error) { func NewDNSProvider() (*DNSProvider, error) {
values, err := env.Get(EnvEndpoint) values, err := env.Get(EnvEndpoint)
if err != nil { if err != nil {
return nil, fmt.Errorf("api: %w", err) return nil, fmt.Errorf("dns01 api: %w", err)
} }
endpoint, err := url.Parse(values[EnvEndpoint]) endpoint, err := url.Parse(values[EnvEndpoint])
if err != nil { if err != nil {
return nil, fmt.Errorf("api: %w", err) return nil, fmt.Errorf("dns01 api: %w", err)
} }
config := NewDefaultConfig() config := NewDefaultConfig()

View File

@ -111,7 +111,7 @@ func (enc *Encoder) Encode(rin io.Reader, src, dst Addr) error {
//fmt.Println("[debug] encode payload:", string(b)) //fmt.Println("[debug] encode payload:", string(b))
_, err = enc.write(header, b) _, err = enc.write(header, b)
fmt.Println("[debug] [encoder] [srv] Browser-to-tun write", len(header), header) fmt.Println("[debug] [encoder] [srv] Browser-to-tun write", len(header), string(header))
fmt.Println("[debug] [encoder] [srv]", len(b), hex.EncodeToString(b)) fmt.Println("[debug] [encoder] [srv]", len(b), hex.EncodeToString(b))
if nil != err { if nil != err {
fmt.Println("[debug] [encoder] [srv] Browser-to-tun write err", err) fmt.Println("[debug] [encoder] [srv] Browser-to-tun write err", err)

View File

@ -179,9 +179,9 @@ func (l *Listener) getPipe(src, dst *Addr, count int) net.Conn {
newconn.Close() newconn.Close()
pipe.Close() pipe.Close()
if nil != err { if nil != err {
fmt.Printf("a stream is done: %q\n", err) fmt.Printf("[debug] [ln-pipe] encode stream ended:\n%+v\n%+v\n%q\n", *src, *dst, err)
} else { } else {
fmt.Printf("a stream is done\n") fmt.Printf("[debug] [ln-pipe] encode stream ended gracefully:\n%+v\n%+v\n", *src, *dst)
} }
}() }()

View File

@ -18,12 +18,14 @@ type RouteMux struct {
routes []meta routes []meta
} }
// ErrNotHandled is returned when the next middleware in the stack should take over
var ErrNotHandled = errors.New("connection not handled") var ErrNotHandled = errors.New("connection not handled")
type meta struct { type meta struct {
addr string addr string
handler Handler handler Handler
terminate bool terminate bool
comment string
} }
// NewRouteMux allocates and returns a new RouteMux. // NewRouteMux allocates and returns a new RouteMux.
@ -36,6 +38,8 @@ func NewRouteMux() *RouteMux {
// Serve dispatches the connection to the handler whose selectors matches the attributes. // Serve dispatches the connection to the handler whose selectors matches the attributes.
func (m *RouteMux) Serve(client net.Conn) error { func (m *RouteMux) Serve(client net.Conn) error {
fmt.Println("\n\n[debug] mux.Serve(client)")
var wconn *ConnWrap var wconn *ConnWrap
switch conn := client.(type) { switch conn := client.(type) {
case *ConnWrap: case *ConnWrap:
@ -54,6 +58,14 @@ func (m *RouteMux) Serve(client net.Conn) error {
case *Addr: case *Addr:
servername = laddr.Hostname() servername = laddr.Hostname()
port = ":" + strconv.Itoa(laddr.Port()) port = ":" + strconv.Itoa(laddr.Port())
connServername := wconn.CheckServername()
if "" == connServername {
wconn.SetServername(servername)
} else {
fmt.Printf("Has servername: current=%s new=%s\n", connServername, servername)
wconn.SetServername(servername)
//panic(errors.New("Can't SetServername() over existing servername"))
}
default: default:
panic("impossible type switch: Addr is 'tun' but didn't match") panic("impossible type switch: Addr is 'tun' but didn't match")
} }
@ -71,7 +83,7 @@ func (m *RouteMux) Serve(client net.Conn) error {
if meta.terminate { if meta.terminate {
servername = wconn.Servername() servername = wconn.Servername()
} }
fmt.Println("Meta:", meta.addr, servername) fmt.Println("\nMeta:", meta.comment, "meta.addr="+meta.addr, "servername="+servername)
if servername == meta.addr || "*" == meta.addr || port == meta.addr { if servername == meta.addr || "*" == meta.addr || port == meta.addr {
//fmt.Println("[debug] test of route:", meta) //fmt.Println("[debug] test of route:", meta)
// Only keep trying handlers if ErrNotHandled was returned // Only keep trying handlers if ErrNotHandled was returned
@ -83,32 +95,56 @@ func (m *RouteMux) Serve(client net.Conn) error {
fmt.Println("No match found for", wconn.Scheme(), wconn.Servername()) fmt.Println("No match found for", wconn.Scheme(), wconn.Servername())
return client.Close() return client.Close()
// TODO Chi-style route handling
/*
routes := m.routes
next := func() error {
if 0 == len(routes) {
fmt.Println("No match found for", wconn.Scheme(), wconn.Servername())
return client.Close()
}
route := routes[0]
routes := routes[1:]
handled := false
handler := meta.handler(func () {
if !handled {
handled = true
next()
}
})
return handler.Serve(client)
}
return next()
*/
} }
// ForwardTCP creates and returns a connection to a local handler target. // ForwardTCP creates and returns a connection to a local handler target.
func (m *RouteMux) ForwardTCP(servername string, target string, timeout time.Duration) error { func (m *RouteMux) ForwardTCP(servername string, target string, timeout time.Duration, comment ...string) error {
// TODO check servername // TODO check servername
m.routes = append(m.routes, meta{ m.routes = append(m.routes, meta{
addr: servername, addr: servername,
terminate: false, terminate: false,
handler: NewForwarder(target, timeout), handler: NewForwarder(target, timeout),
comment: append(comment, "")[0],
}) })
return nil return nil
} }
// HandleTCP creates and returns a connection to a local handler target. // HandleTCP creates and returns a connection to a local handler target.
func (m *RouteMux) HandleTCP(servername string, handler Handler) error { func (m *RouteMux) HandleTCP(servername string, handler Handler, comment ...string) error {
// TODO check servername // TODO check servername
m.routes = append(m.routes, meta{ m.routes = append(m.routes, meta{
addr: servername, addr: servername,
terminate: false, terminate: false,
handler: handler, handler: handler,
comment: append(comment, "")[0],
}) })
return nil return nil
} }
// HandleTLS creates and returns a connection to a local handler target. // HandleTLS creates and returns a connection to a local handler target.
func (m *RouteMux) HandleTLS(servername string, acme *ACME, handler Handler) error { func (m *RouteMux) HandleTLS(servername string, acme *ACME, next Handler, comment ...string) error {
// TODO check servername // TODO check servername
m.routes = append(m.routes, meta{ m.routes = append(m.routes, meta{
addr: servername, addr: servername,
@ -123,16 +159,18 @@ func (m *RouteMux) HandleTLS(servername string, acme *ACME, handler Handler) err
} }
if !wconn.isEncrypted() { if !wconn.isEncrypted() {
fmt.Println("[debug] conn is not encrypted") fmt.Println("[debug] HandleTLS: conn is not encrypted")
// TODO handle underlying Peek() timeout error
return ErrNotHandled return ErrNotHandled
} }
fmt.Println("[debug] terminated encrypted connection") fmt.Println("[debug] HandleTLS: decrypted connection, recursing")
//NewTerminator(acme, handler)(client) //NewTerminator(acme, handler)(client)
//return handler.Serve(client) //return handler.Serve(client)
return handler.Serve(TerminateTLS(wconn, acme)) return next.Serve(TerminateTLS(wconn, acme))
}), }),
comment: append(comment, "")[0],
}) })
return nil return nil
} }

View File

@ -149,7 +149,7 @@ ForwardData:
break ForwardData break ForwardData
} }
if io.EOF != err && io.ErrClosedPipe != err && !strings.Contains(err.Error(), errNetClosing) { if io.EOF != err && io.ErrClosedPipe != err && !strings.Contains(err.Error(), errNetClosing) {
fmt.Printf("read from remote client failed: %q\n", err.Error()) fmt.Printf("error: data source (websocket client) read failed: %q\n", err.Error())
} else { } else {
fmt.Printf("Connection closed (possibly by remote client)\n") fmt.Printf("Connection closed (possibly by remote client)\n")
} }
@ -159,7 +159,7 @@ ForwardData:
break ForwardData break ForwardData
} }
if io.EOF != err && io.ErrClosedPipe != err && !strings.Contains(err.Error(), errNetClosing) { if io.EOF != err && io.ErrClosedPipe != err && !strings.Contains(err.Error(), errNetClosing) {
fmt.Printf("read from local target failed: %q\n", err.Error()) fmt.Printf("error: data sink (local target) read failed: %q\n", err.Error())
} else { } else {
fmt.Printf("Connection closed (possibly by local target)\n") fmt.Printf("Connection closed (possibly by local target)\n")
} }
@ -327,7 +327,9 @@ type Grants struct {
} }
func Inspect(authURL, token string) (*Grants, error) { func Inspect(authURL, token string) (*Grants, error) {
msg, err := Request("GET", authURL+"/inspect", token, nil) inspectURL := authURL + "/inspect"
//fmt.Fprintf(os.Stderr, "[debug] telebit.Inspect(\n\tinspectURL = %s,\n\ttoken = %s,\n)", inspectURL, token)
msg, err := Request("GET", inspectURL, token, nil)
if nil != err { if nil != err {
return nil, err return nil, err
} }

View File

@ -54,6 +54,9 @@ func DialWebsocketTunnel(ctx context.Context, relay, authz string) (net.Conn, er
sep = "&" sep = "&"
} }
wsconn, _, err := wsd.DialContext(ctx, relay+sep+"access_token="+authz+"&versions=v1", headers) wsconn, _, err := wsd.DialContext(ctx, relay+sep+"access_token="+authz+"&versions=v1", headers)
if nil != err {
fmt.Println("[debug] [wstun] simple dial failed", err, wsconn, ctx)
}
return NewWebsocketTunnel(wsconn), err return NewWebsocketTunnel(wsconn), err
} }
@ -61,15 +64,16 @@ func (wsw *WebsocketTunnel) Read(b []byte) (int, error) {
if nil == wsw.tmpr { if nil == wsw.tmpr {
_, msgr, err := wsw.wsconn.NextReader() _, msgr, err := wsw.wsconn.NextReader()
if nil != err { if nil != err {
//fmt.Println("debug wsw NextReader err:", err) fmt.Println("[debug] [wstun] NextReader err:", err)
return 0, err return 0, err
} }
wsw.tmpr = msgr wsw.tmpr = msgr
} }
n, err := wsw.tmpr.Read(b) n, err := wsw.tmpr.Read(b)
fmt.Println("[debug] [wstun] Read", n)
if nil != err { if nil != err {
//fmt.Println("debug wsw Read err:", err) fmt.Println("[debug] [wstun] Read err:", err)
if io.EOF == err { if io.EOF == err {
wsw.tmpr = nil wsw.tmpr = nil
// ignore the message EOF because it's not the websocket EOF // ignore the message EOF because it's not the websocket EOF
@ -80,17 +84,18 @@ func (wsw *WebsocketTunnel) Read(b []byte) (int, error) {
} }
func (wsw *WebsocketTunnel) Write(b []byte) (int, error) { func (wsw *WebsocketTunnel) Write(b []byte) (int, error) {
fmt.Println("[debug] [wstun] Write", len(b))
// TODO create or reset ping deadline // TODO create or reset ping deadline
// TODO document that more complete writes are preferred? // TODO document that more complete writes are preferred?
msgw, err := wsw.wsconn.NextWriter(websocket.BinaryMessage) msgw, err := wsw.wsconn.NextWriter(websocket.BinaryMessage)
if nil != err { if nil != err {
//fmt.Println("debug wsw NextWriter err:", err) fmt.Println("[debug] [wstun] NextWriter err:", err)
return 0, err return 0, err
} }
n, err := msgw.Write(b) n, err := msgw.Write(b)
if nil != err { if nil != err {
//fmt.Println("debug wsw Write err:", err) fmt.Println("[debug] [wstun] Write err:", err)
return n, err return n, err
} }
@ -100,7 +105,7 @@ func (wsw *WebsocketTunnel) Write(b []byte) (int, error) {
// Close will close the websocket with a control message // Close will close the websocket with a control message
func (wsw *WebsocketTunnel) Close() error { func (wsw *WebsocketTunnel) Close() error {
//fmt.Println("[debug] closing the websocket.Conn") fmt.Println("[debug] [wstun] closing the websocket.Conn")
// TODO handle EOF as websocket.CloseNormal? // TODO handle EOF as websocket.CloseNormal?
message := websocket.FormatCloseMessage(websocket.CloseGoingAway, "closing connection") message := websocket.FormatCloseMessage(websocket.CloseGoingAway, "closing connection")
@ -138,10 +143,12 @@ func (wsw *WebsocketTunnel) SetDeadline(t time.Time) error {
// SetReadDeadline sets the deadline for future Read calls // SetReadDeadline sets the deadline for future Read calls
func (wsw *WebsocketTunnel) SetReadDeadline(t time.Time) error { func (wsw *WebsocketTunnel) SetReadDeadline(t time.Time) error {
fmt.Println("[debug] [wstun] read deadline")
return wsw.wsconn.SetReadDeadline(t) return wsw.wsconn.SetReadDeadline(t)
} }
// SetWriteDeadline sets the deadline for future Write calls // SetWriteDeadline sets the deadline for future Write calls
func (wsw *WebsocketTunnel) SetWriteDeadline(t time.Time) error { func (wsw *WebsocketTunnel) SetWriteDeadline(t time.Time) error {
fmt.Println("[debug] [wstun] write deadline")
return wsw.wsconn.SetWriteDeadline(t) return wsw.wsconn.SetWriteDeadline(t)
} }