diff --git a/TransX.exe b/TransX.exe new file mode 100644 index 0000000..70828fd Binary files /dev/null and b/TransX.exe differ diff --git a/cipher/chacha.go b/cipher/chacha.go new file mode 100644 index 0000000..576baf4 --- /dev/null +++ b/cipher/chacha.go @@ -0,0 +1,20 @@ +package cipher + +type ChaCha struct { +} + +func (*ChaCha) Decrypt(data []byte) (decrypted []byte, err error) { + decrypted = data + err = nil + return +} + +func (*ChaCha) Encrypt(data []byte) (encryped []byte, err error) { + encryped = data + err = nil + return +} + +func NewChaCha() (cipher Cipher) { + return &ChaCha{} +} diff --git a/cipher/cipher.go b/cipher/cipher.go new file mode 100644 index 0000000..1e6eddf --- /dev/null +++ b/cipher/cipher.go @@ -0,0 +1,23 @@ +package cipher + +import ( + "net" +) + +type Cipher interface { + Decrypt(data []byte) (decrypted []byte, err error) + Encrypt(data []byte) (encryped []byte, err error) +} + +type Carrier struct { + Conn net.Conn + Cipher Cipher + Cache []byte +} + +func NewCipher(cipherName string) (cipher Cipher) { + if cipherName == "default" { + return NewChaCha() + } + return nil //TODO:临时这样处理 +} diff --git a/cipher/communication.go b/cipher/communication.go new file mode 100644 index 0000000..a4f3a5c --- /dev/null +++ b/cipher/communication.go @@ -0,0 +1,15 @@ +package cipher + +import ( +// "github.com/TransX/cipher" +) + +func SendData(carrier *Carrier, nByte int) (n int, err error) { + n, err = carrier.Conn.Write(carrier.Cache[:nByte]) + return +} + +func ReceiveData(carrier *Carrier) (n int, err error) { + n, err = carrier.Conn.Read(carrier.Cache) + return +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..1ab39fd --- /dev/null +++ b/main.go @@ -0,0 +1,10 @@ +// main.go +package main + +import ( + "fmt" +) + +func main() { + fmt.Println("Hello World!") +} diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..f1628f2 --- /dev/null +++ b/main_test.go @@ -0,0 +1,49 @@ +package main + +import( + "testing" + "net" +) + +func server(){ + listener,err=net.Listen("tcp4","0.0.0.0:1234") + if err!=nil{ + t.Fatal(err) + } + for { + conn,err:=listener.Accept() + if err!=nil{ + t.Fatal(err) + } + bytes:=make([]byte,32) + n,err:=conn.Read(bytes) + t.Log("Server Receive ",bytes[:n]) + _,err:=conn.Write([]byte("OK")) + if err!=nil{ + t.Fatail(err) + } + conn.Close() + } +} + +func client(){ + conn,err:=net.Dial("tcp4","0.0.0.0:1234") + if err!=nil{ + t.Fatail(err) + } + for{ + conn.Write([]byte("Client")) + bytes:=make([]byte,32) + n,err:=conn.Read(byte) + if err!=nil{ + t.Fatal(err) + } + t.Log("Client Receive ",bytes[:n]) + conn.Close() + } +} + +func TestTunnel(t *testing.T) +{ + StartTunnel("0.0.0.0","1200","0.0.0.0",) +} \ No newline at end of file diff --git a/tcp.go b/tcp.go new file mode 100644 index 0000000..d6ef89a --- /dev/null +++ b/tcp.go @@ -0,0 +1,91 @@ +package main + +import ( + "github.com/TransX/cipher" + "io" + "log" + "net" +) + +type TransTCP struct { + // serverConn *net.Conn + clientConn net.Conn + listener net.Listener + // cache []byte +} + +func NewTransTCP() *TransTCP { + return &TransTCP{} +} + +func (this *TransTCP) CreateTCPClient(ip, port string) (err error) { + conn, err := net.Dial("tcp4", ip+":"+port) + if err == nil { + this.clientConn = conn + } else { + this.clientConn = nil + } + return +} + +func (this *TransTCP) CreateTCPListener(ip, port string) (err error) { + listener, _err := net.Listen("tcp4", ip+":"+port) + if _err == nil { + this.listener = listener + return nil + } else { + return _err + } + return +} + +func (this *TransTCP) Start(remoteAddr chan net.Addr) (err error) { + cache := make([]byte, 1024*128) //128kB + // this.cache = cache + for { + if listenerConn, _err := this.listener.Accept(); err == nil { + remoteAddr <- listenerConn.RemoteAddr() + //构建Carrier + revCarrier := &cipher.Carrier{ + listenerConn, + cipher.NewCipher("default"), + cache, + } + sendCarrier := &cipher.Carrier{ + this.clientConn, + cipher.NewCipher("default"), + cache, + } + go func() { + for { + nByte, _err := cipher.ReceiveData(revCarrier) + if _err != nil { + if _err == io.EOF { + revCarrier.Conn.Close() + sendCarrier.Conn.Close() + log.Println("EOF") + return + } else { + log.Println(revCarrier.Conn.RemoteAddr().String(), _err) + return //TODO:还需要处理 + } + } + log.Println("Received ", nByte, " From ", revCarrier.Conn.RemoteAddr().String()) + nByte, _err = cipher.SendData(sendCarrier, nByte) + if _err == nil { + log.Println("Send ", nByte, " To ", sendCarrier.Conn.RemoteAddr().String()) + return + } else { + log.Println(sendCarrier.Conn.RemoteAddr().String(), _err) + } + } + + }() + + } else { + err = _err + } + + } + return nil +} diff --git a/tunnel.go b/tunnel.go new file mode 100644 index 0000000..d696d1b --- /dev/null +++ b/tunnel.go @@ -0,0 +1,18 @@ +package main + +func StartTunnel(sourceIP, desIP, desPort string) { + remoteAddr := make(chan net.Addr) + transSrcToDes := NewTransTCP() + transSrcToDes.CreateTCPListener("0.0.0.0", desPort) + transSrcToDes.CreateTCPClient(desIP, desPort) + go transSrcToDes.Start(remoteAddr) + sourcePort := <-remoteAddr + transDesToSrc := NewTransTCP() + transDesToSrc.CreateTCPListener("0.0.0.0", sourcePort) + transSrcToDes.CreateTCPClient(sourceIP, sourcePort) + + go transDesToSrc.Start() + c := make(chan byte) + <-c + +}