summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBluesaxorcist <joshua@operatorfoundation.org>2019-08-16 16:10:27 -0500
committerBluesaxorcist <joshua@operatorfoundation.org>2019-08-16 16:10:27 -0500
commitd8ce35ae3fea54b0ad67f2ce94fca8a0f99941ea (patch)
tree2555d40de44248795758bc9110711a756fa71878
parentadef45bb1ef64a4ac57a9ed503b51da4a621e51c (diff)
made dispatcher operational for obfs4
-rw-r--r--common/pt_extras/pt_extras.go84
-rw-r--r--modes/pt_socks5/pt_socks5.go102
-rw-r--r--modes/stun_udp/stun_udp.go61
-rw-r--r--modes/transparent_tcp/transparent_tcp.go84
-rw-r--r--modes/transparent_udp/transparent_udp.go92
-rw-r--r--obfs4.json1
-rw-r--r--shadow.json1
-rw-r--r--shapeshifter-dispatcher/shapeshifter-dispatcher.go18
-rw-r--r--state/dispatcher.log50
9 files changed, 197 insertions, 296 deletions
diff --git a/common/pt_extras/pt_extras.go b/common/pt_extras/pt_extras.go
index 63c1aba..e38d44e 100644
--- a/common/pt_extras/pt_extras.go
+++ b/common/pt_extras/pt_extras.go
@@ -30,6 +30,10 @@ package pt_extras
import (
"errors"
"fmt"
+ "github.com/OperatorFoundation/shapeshifter-dispatcher/common/log"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/Optimizer"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
"net"
"net/url"
"os"
@@ -170,3 +174,83 @@ func resolveAddrStr(addrStr string) (*net.TCPAddr, error) {
func PtShouldExitOnStdinClose() bool {
return os.Getenv("TOR_PT_EXIT_ON_STDIN_CLOSE") == "1"
}
+
+func ArgsToDialer(target string, name string, args pt.Args) (Optimizer.Transport, error) {
+ switch name {
+ //case "obfs2":
+ // transport := obfs2.NewObfs2Transport()
+ // dialer = transport.Dial
+ // return dialer, nil
+ case "obfs4":
+ if cert, ok := args["cert"]; ok {
+ if iatModeStr, ok2 := args["iatMode"]; ok2 {
+ iatMode, err := strconv.Atoi(iatModeStr[0])
+ if err == nil {
+ transport := obfs4.Transport{
+ CertString: cert[0],
+ IatMode: iatMode,
+ Address: target,
+ }
+ return transport, nil
+ } else {
+ log.Errorf("obfs4 transport bad iatMode value: %s %s", iatModeStr[0], err)
+ return nil, errors.New("obfs4 transport bad iatMode value")
+ }
+ } else {
+ log.Errorf("obfs4 transport missing iatMode argument: %s", args)
+ return nil, errors.New("obfs4 transport missing iatMode argument")
+ }
+ } else {
+ log.Errorf("obfs4 transport missing cert argument: %s", args)
+ return nil, errors.New("obfs4 transport missing cert argument")
+ }
+ case "shadow":
+ if password, ok := args["password"]; ok {
+ if cipher, ok2 := args["cipherName"]; ok2 {
+ transport := shadow.Transport{
+ Password: password[0],
+ CipherName: cipher[0],
+ Address: target,
+ }
+ return transport, nil
+ } else {
+ log.Errorf("shadow transport missing cipher argument: %s", args)
+ return nil, errors.New("shadow transport missing cipher argument")
+ }
+ } else {
+ log.Errorf("shadow transport missing password argument: %s", args)
+ return nil, errors.New("shadow transport missing password argument")
+ }
+ case "Optimizer":
+ if _, ok := args["transports"]; ok {
+ if strategyName, ok2 := args["strategy"]; ok2 {
+ var strategy Optimizer.Strategy = nil
+ switch strategyName[0] {
+ case "first":
+ strategy = Optimizer.NewFirstStrategy()
+ case "random":
+ strategy = Optimizer.NewRandomStrategy()
+ case "rotate":
+ strategy = Optimizer.NewRotateStrategy()
+ case "track":
+ strategy = Optimizer.NewTrackStrategy()
+ case "min":
+ strategy = Optimizer.NewMinimizeDialDuration()
+ }
+ transports := []Optimizer.Transport{}
+ transport := Optimizer.NewOptimizerClient(transports, strategy)
+ return transport, nil
+ } else {
+ log.Errorf("Optimizer transport missing transports argument: %s", args)
+ return nil, errors.New("optimizer transport missing transports argument")
+ }
+ } else {
+ log.Errorf("Optimizer transport missing strategy argument: %s", args)
+ return nil, errors.New("optimizer transport missing strategy argument")
+ }
+
+ default:
+ log.Errorf("Unknown transport: %s", name)
+ return nil, errors.New("unknown transport")
+ }
+} \ No newline at end of file
diff --git a/modes/pt_socks5/pt_socks5.go b/modes/pt_socks5/pt_socks5.go
index 8ff2528..7b958de 100644
--- a/modes/pt_socks5/pt_socks5.go
+++ b/modes/pt_socks5/pt_socks5.go
@@ -30,6 +30,8 @@
package pt_socks5
import (
+ "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
"io"
"net"
"net/url"
@@ -107,86 +109,12 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, con
}
}
- var dialer func(address string) (net.Conn, error)
+ var dialer func() (net.Conn, error)
// Deal with arguments.
- switch name {
- case "obfs2":
- transport := obfs2.NewObfs2Transport()
- dialer = transport.Dial
- case "obfs4":
- if cert, ok := args.Get("cert"); ok {
- if iatModeStr, ok2 := args.Get("iatMode"); ok2 {
- iatMode, err := strconv.Atoi(iatModeStr)
- if err != nil {
- transport := obfs4.NewObfs4Client(cert, iatMode)
- dialer = transport.Dial
- } else {
- log.Errorf("obfs4 transport bad iatMode value: %s", iatModeStr)
- socksReq.Reply(socks5.ReplyGeneralFailure)
- return
- }
- } else {
- log.Errorf("obfs4 transport missing cert argument: %s", args)
- socksReq.Reply(socks5.ReplyGeneralFailure)
- return
- }
- } else {
- log.Errorf("obfs4 transport missing cert argument: %s", args)
- socksReq.Reply(socks5.ReplyGeneralFailure)
- return
- }
- //case "shadow":
- // if password, ok := args["password"]; ok {
- // if cipher, ok2 := args["cipherName"]; ok2 {
- // transport := shadow.NewShadowClient(password[0], cipher[0])
- // dialer = transport.Dial
- // } else {
- // log.Errorf("shadow transport missing cipher argument: %s", args)
- // socksReq.Reply(socks5.ReplyGeneralFailure)
- // return
- // }
- // } else {
- // log.Errorf("shadow transport missing password argument: %s", args)
- // socksReq.Reply(socks5.ReplyGeneralFailure)
- // return
- // }
- // case "Optimizer":
- // if _, ok := args["transports"]; ok {
- // if strategyName, ok2 := args["strategy"]; ok2 {
- // var strategy Optimizer.Strategy = nil
- // switch strategyName[0] {
- // case "first":
- // strategy = Optimizer.NewFirstStrategy()
- // case "random":
- // strategy = Optimizer.NewRandomStrategy()
- // case "rotate":
- // strategy = Optimizer.NewRotateStrategy()
- // case "track":
- // strategy = Optimizer.NewTrackStrategy()
- // case "min":
- // strategy = Optimizer.NewMinimizeDialDuration()
- // }
- //transports := []Optimizer.Transport{}
- //transport := Optimizer.NewOptimizerClient(transports, strategy)
- // return transport, nil
- ////says too many arguments to return just like earlier.
- // } else {
- // log.Errorf("Optimizer transport missing transports argument: %s", args)
- // socksReq.Reply(socks5.ReplyGeneralFailure)
- // return
- // }
- //} else {
- // log.Errorf("Optimizer transport missing strategy argument: %s", args)
- // socksReq.Reply(socks5.ReplyGeneralFailure)
- // return
- //}
-
- default:
- log.Errorf("Unknown transport: %s", name)
- socksReq.Reply(socks5.ReplyGeneralFailure)
- return
- }
+ transport, _ := pt_extras.ArgsToDialer(socksReq.Target, name, args)
+ dialer = transport.Dial
+ f := dialer
// Obtain the proxy dialer if any, and create the outgoing TCP connection.
// dialFn := proxy.Direct.Dial
@@ -204,9 +132,7 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, con
//
// fmt.Println("Got dialer", dialFn, proxyURI, proxy.Direct)
- f := dialer
-
- remote, _ := f(socksReq.Target)
+ remote, _ := f()
if err != nil {
log.Errorf("%s(%s) - outgoing connection failed: %s", name, addrStr, log.ElideError(err))
socksReq.Reply(socks5.ErrorToReplyCode(err))
@@ -264,11 +190,25 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn
log.Errorf("obfs4 transport missing cert argument: %s", args)
return
}
+ case "shadow":
+ password, ok := args.Get("password")
+ if !ok {
+ return false, nil
+ }
+
+ cipherName, ok2 := args.Get("cipherName")
+ if !ok2 {
+ return false, nil
+ }
+
+ transport := shadow.NewShadowServer(password, cipherName)
+ listen = transport.Listen
default:
log.Errorf("Unknown transport: %s", name)
return
}
+
f := listen
transportLn := f(bindaddr.Addr.String())
diff --git a/modes/stun_udp/stun_udp.go b/modes/stun_udp/stun_udp.go
index c9abcd6..f9d458f 100644
--- a/modes/stun_udp/stun_udp.go
+++ b/modes/stun_udp/stun_udp.go
@@ -31,6 +31,7 @@ package stun_udp
import (
"fmt"
+ "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras"
"github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
"io"
golog "log"
@@ -169,39 +170,11 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt
return
}
- var f func(address string) (net.Conn, error)
-
// Deal with arguments.
- switch name {
- case "obfs2":
- transport := obfs2.NewObfs2Transport()
- f = transport.Dial
- case "obfs4":
- if cert, ok := args["cert"]; ok {
- if iatModeStr, ok2 := args["iatMode"]; ok2 {
- iatMode, err := strconv.Atoi(iatModeStr[0])
- if err != nil {
- transport := obfs4.NewObfs4Client(cert[0], iatMode)
- f = transport.Dial
- } else {
- log.Errorf("obfs4 transport bad iatMode value: %s", iatModeStr)
- return
- }
- } else {
- log.Errorf("obfs4 transport missing cert argument: %s", args)
- return
- }
- } else {
- log.Errorf("obfs4 transport missing cert argument: %s", args)
- return
- }
- default:
- log.Errorf("Unknown transport: %s", name)
- return
- }
+ transport, _ := pt_extras.ArgsToDialer(target, name, args)
fmt.Println("Dialing ", target)
- remote, _ := f(target)
+ remote, _ := transport.Dial()
// if err != nil {
// fmt.Println("outgoing connection failed", err)
// log.Errorf("(%s) - outgoing connection failed: %s", target, log.ElideError(err))
@@ -268,34 +241,6 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn
log.Errorf("shadow transport missing password argument: %s", args)
return
}
- // case "Optimizer":
- // if _, ok := args["transports"]; ok {
- // if strategyName, ok2 := args["strategy"]; ok2 {
- // var strategy Optimizer.Strategy = nil
- // switch strategyName[0] {
- // case "first":
- // strategy = Optimizer.NewFirstStrategy()
- // case "random":
- // strategy = Optimizer.NewRandomStrategy()
- // case "rotate":
- // strategy = Optimizer.NewRotateStrategy()
- // case "track":
- // strategy = Optimizer.NewTrackStrategy()
- // case "min":
- // strategy = Optimizer.NewMinimizeDialDuration()
- // }
- //transports := []Optimizer.Transport{}
- //transport := Optimizer.NewOptimizerClient(transports, strategy)
- // return transport, nil
- ////says too many arguments to return just like earlier. tried autocorrecting and now it says transport is not type bool
- // } else {
- // log.Errorf("Optimizer transport missing transports argument: %s", args)
- // return
- // }
- //} else {
- // log.Errorf("Optimizer transport missing strategy argument: %s", args)
- // return
- //}
default:
log.Errorf("Unknown transport: %s", name)
diff --git a/modes/transparent_tcp/transparent_tcp.go b/modes/transparent_tcp/transparent_tcp.go
index d49bb32..a948d2d 100644
--- a/modes/transparent_tcp/transparent_tcp.go
+++ b/modes/transparent_tcp/transparent_tcp.go
@@ -30,19 +30,17 @@
package transparent_tcp
import (
- "errors"
"fmt"
+ "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras"
"io"
"net"
"net/url"
- "strconv"
"strings"
"sync"
"github.com/OperatorFoundation/shapeshifter-dispatcher/common/log"
"github.com/OperatorFoundation/shapeshifter-dispatcher/common/termmon"
"github.com/OperatorFoundation/shapeshifter-ipc"
- "github.com/OperatorFoundation/shapeshifter-transports/transports/Optimizer"
//"github.com/OperatorFoundation/shapeshifter-transports/transports/obfs2"
"github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4"
"github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
@@ -99,7 +97,7 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt
// Deal with arguments.
- transport, _ := argsToDialer(target, name, args)
+ transport, _ := pt_extras.ArgsToDialer(target, name, args)
dialer = transport.Dial
f := dialer
@@ -138,85 +136,7 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt
return
}
-func argsToDialer(target string, name string, args pt.Args) (Optimizer.Transport, error) {
- switch name {
- //case "obfs2":
- // transport := obfs2.NewObfs2Transport()
- // dialer = transport.Dial
- // return dialer, nil
- case "obfs4":
- if cert, ok := args["cert"]; ok {
- if iatModeStr, ok2 := args["iatMode"]; ok2 {
- iatMode, err := strconv.Atoi(iatModeStr[0])
- if err == nil {
- transport := obfs4.Transport{
- CertString: cert[0],
- IatMode: iatMode,
- Address: target,
- }
- return transport, nil
- } else {
- log.Errorf("obfs4 transport bad iatMode value: %s %s", iatModeStr[0], err)
- return nil, errors.New("obfs4 transport bad iatMode value")
- }
- } else {
- log.Errorf("obfs4 transport missing iatMode argument: %s", args)
- return nil, errors.New("obfs4 transport missing iatMode argument")
- }
- } else {
- log.Errorf("obfs4 transport missing cert argument: %s", args)
- return nil, errors.New("obfs4 transport missing cert argument")
- }
- case "shadow":
- if password, ok := args["password"]; ok {
- if cipher, ok2 := args["cipherName"]; ok2 {
- transport := shadow.Transport{
- Password: password[0],
- CipherName: cipher[0],
- Address: target,
- }
- return transport, nil
- } else {
- log.Errorf("shadow transport missing cipher argument: %s", args)
- return nil, errors.New("shadow transport missing cipher argument")
- }
- } else {
- log.Errorf("shadow transport missing password argument: %s", args)
- return nil, errors.New("shadow transport missing password argument")
- }
- case "Optimizer":
- if _, ok := args["transports"]; ok {
- if strategyName, ok2 := args["strategy"]; ok2 {
- var strategy Optimizer.Strategy = nil
- switch strategyName[0] {
- case "first":
- strategy = Optimizer.NewFirstStrategy()
- case "random":
- strategy = Optimizer.NewRandomStrategy()
- case "rotate":
- strategy = Optimizer.NewRotateStrategy()
- case "track":
- strategy = Optimizer.NewTrackStrategy()
- case "min":
- strategy = Optimizer.NewMinimizeDialDuration()
- }
- transports := []Optimizer.Transport{}
- transport := Optimizer.NewOptimizerClient(transports, strategy)
- return transport, nil
- } else {
- log.Errorf("Optimizer transport missing transports argument: %s", args)
- return nil, errors.New("optimizer transport missing transports argument")
- }
- } else {
- log.Errorf("Optimizer transport missing strategy argument: %s", args)
- return nil, errors.New("optimizer transport missing strategy argument")
- }
- default:
- log.Errorf("Unknown transport: %s", name)
- return nil, errors.New("unknown transport")
- }
-}
func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerInfo pt.ServerInfo, statedir string, options string) (launched bool, listeners []net.Listener) {
// Launch each of the server listeners.
diff --git a/modes/transparent_udp/transparent_udp.go b/modes/transparent_udp/transparent_udp.go
index 58ef491..f32397f 100644
--- a/modes/transparent_udp/transparent_udp.go
+++ b/modes/transparent_udp/transparent_udp.go
@@ -33,6 +33,8 @@ import (
"bytes"
"encoding/binary"
"fmt"
+ "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
"io"
golog "log"
"net"
@@ -175,8 +177,6 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt
fmt.Println("Dialing....")
- var dialer func(address string) (net.Conn, error)
-
args, argsErr := pt.ParsePT2ClientParameters(options)
if argsErr != nil {
log.Errorf("Error parsing transport options: %s", options)
@@ -184,80 +184,9 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt
}
// Deal with arguments.
- switch name {
- case "obfs2":
- transport := obfs2.NewObfs2Transport()
- dialer = transport.Dial
- case "obfs4":
- if cert, ok := args["cert"]; ok {
- if iatModeStr, ok2 := args["iatMode"]; ok2 {
- iatMode, err := strconv.Atoi(iatModeStr[0])
- if err != nil {
- transport := obfs4.NewObfs4Client(cert[0], iatMode)
- dialer = transport.Dial
- } else {
- log.Errorf("obfs4 transport bad iatMode value: %s", iatModeStr)
- return
- }
- } else {
- log.Errorf("obfs4 transport missing cert argument: %s", args)
- return
- }
- } else {
- log.Errorf("obfs4 transport missing cert argument: %s", args)
- return
- }
- //case "shadow":
- // if password, ok := args["password"]; ok {
- // if cipher, ok2 := args["cipherName"]; ok2 {
- //transport := shadow.NewShadowClient(password[0], cipher[0])
- //dialer = transport.Dial
- ////transport.Dial isn't the right type somehow?
- // } else {
- // log.Errorf("shadow transport missing cipher argument: %s", args)
- // return
- // }
- //} else {
- // log.Errorf("shadow transport missing password argument: %s", args)
- // return
- //}
- //case "Optimizer":
- // if _, ok := args["transports"]; ok {
- // if strategyName, ok2 := args["strategy"]; ok2 {
- // var strategy Optimizer.Strategy = nil
- // switch strategyName[0] {
- // case "first":
- // strategy = Optimizer.NewFirstStrategy()
- // case "random":
- // strategy = Optimizer.NewRandomStrategy()
- // case "rotate":
- // strategy = Optimizer.NewRotateStrategy()
- // case "track":
- // strategy = Optimizer.NewTrackStrategy()
- // case "min":
- // strategy = Optimizer.NewMinimizeDialDuration()
- // }
- //transports := []Optimizer.Transport{}
- //transport := Optimizer.NewOptimizerClient(transports, strategy)
- //return transport
- ////says too many arguments to return? where is the return type specified?
- // } else {
- // log.Errorf("Optimizer transport missing transports argument: %s", args)
- // return
- // }
- //} else {
- // log.Errorf("Optimizer transport missing strategy argument: %s", args)
- // return
- //}
-
- default:
- log.Errorf("Unknown transport: %s", name)
- return
- }
-
- f := dialer
+ transport, _ := pt_extras.ArgsToDialer(target, name, args)
fmt.Println("Dialing ", target)
- remote, _ := f(target)
+ remote, _ := transport.Dial()
// if err != nil {
// fmt.Println("outgoing connection failed", err)
// log.Errorf("(%s) - outgoing connection failed: %s", target, log.ElideError(err))
@@ -311,6 +240,19 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn
log.Errorf("obfs4 transport missing cert argument: %s", args)
return
}
+ case "shadow":
+ password, ok := args.Get("password")
+ if !ok {
+ return false, nil
+ }
+
+ cipherName, ok2 := args.Get("cipherName")
+ if !ok2 {
+ return false, nil
+ }
+
+ transport := shadow.NewShadowServer(password, cipherName)
+ listen = transport.Listen
default:
log.Errorf("Unknown transport: %s", name)
return
diff --git a/obfs4.json b/obfs4.json
new file mode 100644
index 0000000..2697889
--- /dev/null
+++ b/obfs4.json
@@ -0,0 +1 @@
+{"cert": "a1cc6eI5H+1kTzXhbuwMR9w3ZkLeZuReniier8DYSlAg4ed9yTbnyDiWc1vF1WFWKFRYHQ", "iatMode": "0"} \ No newline at end of file
diff --git a/shadow.json b/shadow.json
new file mode 100644
index 0000000..7f4f83b
--- /dev/null
+++ b/shadow.json
@@ -0,0 +1 @@
+{"password": "orange", "cipherName": "aes-128-ctr"} \ No newline at end of file
diff --git a/shapeshifter-dispatcher/shapeshifter-dispatcher.go b/shapeshifter-dispatcher/shapeshifter-dispatcher.go
index 03923a6..4995b4e 100644
--- a/shapeshifter-dispatcher/shapeshifter-dispatcher.go
+++ b/shapeshifter-dispatcher/shapeshifter-dispatcher.go
@@ -33,6 +33,7 @@ import (
"errors"
"flag"
"fmt"
+ "io/ioutil"
golog "log"
"net"
"net/url"
@@ -101,6 +102,7 @@ func main() {
// Experimental flags under consideration for PT 2.1
socksAddr := flag.String("proxylistenaddr", "127.0.0.1:0", "Specify the bind address for the local SOCKS server provided by the client")
+ optionsFile := flag.String("optionsFile", "", "store all the options in a single file")
// Additional command line flags inherited from obfs4proxy
showVer := flag.Bool("version", false, "Print version and exit")
@@ -144,6 +146,22 @@ func main() {
if err = log.Init(*enableLogging, path.Join(stateDir, dispatcherLogFile), *unsafeLogging); err != nil {
golog.Fatalf("[ERROR]: %s - failed to initialize logging", execName)
}
+ if *options != "" && *optionsFile != "" {
+ golog.Fatal("cannot specify -options and -optionsFile at the same time")
+ }
+ if *optionsFile != "" {
+ _, err := os.Stat(*optionsFile)
+ if err != nil {
+ log.Errorf("optionsFile does not exist %s", *optionsFile)
+ } else {
+ contents, readErr := ioutil.ReadFile(*optionsFile)
+ if readErr != nil {
+ log.Errorf("could not open optionsFile: %s", *optionsFile)
+ } else {
+ *options = string(contents)
+ }
+ }
+ }
log.Noticef("%s - launched", getVersion())
diff --git a/state/dispatcher.log b/state/dispatcher.log
new file mode 100644
index 0000000..0128b1c
--- /dev/null
+++ b/state/dispatcher.log
@@ -0,0 +1,50 @@
+2019/08/16 15:44:27 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/08/16 15:44:27 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/08/16 15:44:27 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/08/16 15:44:27 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/08/16 15:44:27 [INFO]: obfs4 - registered listener: 127.0.0.1:1443
+2019/08/16 15:44:27 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - accepting connections
+2019/08/16 15:45:05 [ERROR]: obfs4 transport missing iatMode argument: map[cert:[a1cc6eI5H+1kTzXhbuwMR9w3ZkLeZuReniier8DYSlAg4ed9yTbnyDiWc1vF1WFWKFRYHQ] iatmode:[0]]
+2019/08/16 15:45:54 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/08/16 15:45:54 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/08/16 15:45:54 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/08/16 15:45:54 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/08/16 15:45:54 [INFO]: obfs4 - registered listener: 127.0.0.1:1443
+2019/08/16 15:45:54 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - accepting connections
+2019/08/16 15:48:59 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/08/16 15:48:59 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/08/16 15:48:59 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/08/16 15:48:59 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/08/16 15:48:59 [INFO]: obfs4 - registered listener: 127.0.0.1:1443
+2019/08/16 15:48:59 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - accepting connections
+2019/08/16 15:49:08 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/08/16 15:49:08 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/08/16 15:49:08 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/08/16 15:49:08 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/08/16 15:49:08 [INFO]: obfs4 - registered listener: 127.0.0.1:1443
+2019/08/16 15:49:08 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - accepting connections
+2019/08/16 15:49:28 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/08/16 15:49:28 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/08/16 15:49:28 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/08/16 15:49:28 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/08/16 15:49:28 [INFO]: obfs4 - registered listener: 127.0.0.1:1443
+2019/08/16 15:49:28 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - accepting connections
+2019/08/16 15:49:36 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/08/16 15:49:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/08/16 15:49:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/08/16 15:49:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/08/16 15:49:36 [INFO]: obfs4 - registered listener: 127.0.0.1:1443
+2019/08/16 15:49:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - accepting connections
+2019/08/16 15:50:04 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/08/16 15:50:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/08/16 15:50:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/08/16 15:50:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/08/16 15:50:04 [INFO]: obfs4 - registered listener: 127.0.0.1:1443
+2019/08/16 15:50:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - accepting connections
+2019/08/16 15:54:31 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/08/16 15:54:31 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/08/16 15:54:31 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/08/16 15:54:31 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/08/16 15:54:31 [INFO]: obfs4 - registered listener: 127.0.0.1:1443
+2019/08/16 15:54:31 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - accepting connections
+2019/08/16 15:57:21 [INFO]: obfs4(127.0.0.1:2222) - closed connection