diff --git a/.gitignore b/.gitignore index 66fd13c..25eef8e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ # Dependency directories (remove the comment below to include it) # vendor/ + +.DS_Store \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..28064b8 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module github.com/fumiama/WireGold + +go 1.16 + +require github.com/sirupsen/logrus v1.8.1 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..59bd790 --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/gold/head/packet.go b/gold/head/packet.go new file mode 100644 index 0000000..d196d90 --- /dev/null +++ b/gold/head/packet.go @@ -0,0 +1,27 @@ +package head + +type Packet struct { + Proto uint8 + SrcPort uint16 + DstPort uint16 + TTL uint8 + Data []byte +} + +func NewPacket(proto uint8, srcPort uint16, dstPort uint16, data []byte) *Packet { + return &Packet{ + Proto: proto, + SrcPort: srcPort, + DstPort: dstPort, + TTL: 255, + Data: data, + } +} + +func (p *Packet) UnMashal(data []byte) { + +} + +func (p *Packet) Mashal() []byte { + return nil +} diff --git a/gold/head/protos.go b/gold/head/protos.go new file mode 100644 index 0000000..3eb46b8 --- /dev/null +++ b/gold/head/protos.go @@ -0,0 +1,7 @@ +package head + +const ( + ProtoHello uint8 = iota + ProtoHelloAck + ProtoData +) diff --git a/gold/link/crypto.go b/gold/link/crypto.go new file mode 100644 index 0000000..d0c7126 --- /dev/null +++ b/gold/link/crypto.go @@ -0,0 +1,23 @@ +package link + +import "net" + +var ( + privKey [32]byte + myip string + me net.IP +) + +func SetMyself(privateKey [32]byte, myIP string) { + privKey = privateKey + myip = myIP + me = net.ParseIP(myIP) +} + +func (id *Identity) Encode(b []byte) (n int, err error) { + return 0, nil +} + +func (id *Identity) Decode(b []byte) (n int, err error) { + return 0, nil +} diff --git a/gold/link/identify.go b/gold/link/identify.go new file mode 100644 index 0000000..97031bf --- /dev/null +++ b/gold/link/identify.go @@ -0,0 +1,9 @@ +package link + +type Identity struct { + PubicKey [32]byte + EndPoint string + KeepAlive int64 +} + +var peers = make(map[string]*Identity) diff --git a/gold/link/link.go b/gold/link/link.go new file mode 100644 index 0000000..176c25f --- /dev/null +++ b/gold/link/link.go @@ -0,0 +1,50 @@ +package link + +import ( + "errors" + "net" + + "github.com/fumiama/WireGold/gold/head" +) + +type Link struct { + conn net.Conn + peer *Identity + hasKeepRuning bool +} + +func Connect(peer string) (l Link, err error) { + p, ok := peers[peer] + if ok { + l.conn, err = net.Dial("udp", peer) + l.peer = p + } else { + err = errors.New("peer not exist") + } + return +} + +func (l *Link) Close() { + l.conn.Close() +} + +func (l *Link) Read(p *head.Packet) (n int, err error) { + d := make([]byte, 1024) + n, err = l.conn.Read(d) + if err == nil { + n, err = l.peer.Decode(d) + if err == nil { + p.UnMashal(d) + } + } + return +} + +func (l *Link) Write(p *head.Packet) (n int, err error) { + d := p.Mashal() + _, err = l.peer.Encode(d) + if err == nil { + n, err = l.conn.Write(d) + } + return +} diff --git a/gold/link/nat.go b/gold/link/nat.go new file mode 100644 index 0000000..1bc7d24 --- /dev/null +++ b/gold/link/nat.go @@ -0,0 +1,23 @@ +package link + +import ( + "time" + + "github.com/sirupsen/logrus" + + "github.com/fumiama/WireGold/gold/head" +) + +func (l *Link) KeepAlive() { + if l.peer.KeepAlive > 0 && !l.hasKeepRuning { + l.hasKeepRuning = true + go func() { + t := time.NewTicker(time.Second * time.Duration(l.peer.KeepAlive)) + for range t.C { + _, _ = l.Write(head.NewPacket(head.ProtoHello, 0, 0, nil)) + logrus.Infoln("[link.nat] send keep alive packet") + } + }() + logrus.Infoln("[link.nat] start to keep alive") + } +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..06ab7d0 --- /dev/null +++ b/main.go @@ -0,0 +1 @@ +package main diff --git a/upper/data.go b/upper/data.go new file mode 100644 index 0000000..25be846 --- /dev/null +++ b/upper/data.go @@ -0,0 +1,7 @@ +package upper + +import "io" + +type Service interface { + io.ReadWriteCloser +} diff --git a/upper/services/tunnel/tunnel.go b/upper/services/tunnel/tunnel.go new file mode 100644 index 0000000..9fb835a --- /dev/null +++ b/upper/services/tunnel/tunnel.go @@ -0,0 +1,46 @@ +package tunnel + +import ( + "github.com/sirupsen/logrus" + + "github.com/fumiama/WireGold/gold/head" + "github.com/fumiama/WireGold/gold/link" +) + +type Tunnel struct { + l *link.Link + In *chan []byte + Out *chan []byte + src uint16 + dest uint16 +} + +func Create(peer string, srcport uint16, destport uint16) (s Tunnel, err error) { + logrus.Infoln("[tunnel] create from", srcport, "to", destport) + var l link.Link + l, err = link.Connect(peer) + if err == nil { + s.l = &l + s.In = new(chan []byte) + s.Out = new(chan []byte) + s.src = srcport + s.dest = destport + go s.handleWrite() + } else { + logrus.Errorln("[tunnel] create err:", err) + } + return +} + +func (s *Tunnel) handleWrite() { + for b := range *s.In { + _, err := s.l.Write(head.NewPacket(head.ProtoData, s.src, s.dest, b)) + if err != nil { + logrus.Errorln("[tunnel] write err:", err) + } + } +} + +func (s *Tunnel) Handle(srcport uint16, destport uint16, data *[]byte) { + +}