mirror of
https://github.com/fumiama/WireGold.git
synced 2026-06-11 04:06:14 +08:00
add 分片
This commit is contained in:
@@ -8,9 +8,16 @@ const (
|
||||
ServiceNull = iota
|
||||
// ServiceTunnel 管道通信服务
|
||||
ServiceTunnel
|
||||
// ServiceWireGold 虚拟组网服务
|
||||
ServiceWireGold
|
||||
)
|
||||
|
||||
type Service interface {
|
||||
Create(peer string, srcport, destport, mtu uint16) (Service, error)
|
||||
io.ReadWriteCloser
|
||||
// Start 无阻塞运行
|
||||
Start(srcport, destport, mtu uint16)
|
||||
// Run 阻塞运行
|
||||
Run(srcport, destport, mtu uint16)
|
||||
// Stop 停止
|
||||
Stop()
|
||||
io.ReadWriter
|
||||
}
|
||||
|
||||
@@ -21,24 +21,36 @@ type Tunnel struct {
|
||||
mtu uint16
|
||||
}
|
||||
|
||||
func Create(me *link.Me, peer string, srcport, destport, mtu uint16) (s Tunnel, err error) {
|
||||
logrus.Infoln("[tunnel] create from", srcport, "to", destport)
|
||||
func Create(me *link.Me, peer string) (s Tunnel, err error) {
|
||||
s.l, err = me.Connect(peer)
|
||||
if err == nil {
|
||||
s.in = make(chan []byte, 4)
|
||||
s.out = make(chan []byte, 4)
|
||||
s.peerip = net.ParseIP(peer)
|
||||
s.src = srcport
|
||||
s.dest = destport
|
||||
s.mtu = mtu
|
||||
go s.handleWrite()
|
||||
go s.handleRead()
|
||||
} else {
|
||||
logrus.Errorln("[tunnel] create err:", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (s *Tunnel) Start(srcport, destport, mtu uint16) {
|
||||
logrus.Infoln("[tunnel] start from", srcport, "to", destport)
|
||||
s.src = srcport
|
||||
s.dest = destport
|
||||
s.mtu = mtu
|
||||
go s.handleWrite()
|
||||
go s.handleRead()
|
||||
}
|
||||
|
||||
func (s *Tunnel) Run(srcport, destport, mtu uint16) {
|
||||
logrus.Infoln("[tunnel] start from", srcport, "to", destport)
|
||||
s.src = srcport
|
||||
s.dest = destport
|
||||
s.mtu = mtu
|
||||
go s.handleWrite()
|
||||
s.handleRead()
|
||||
}
|
||||
|
||||
func (s *Tunnel) Write(p []byte) (int, error) {
|
||||
s.in <- p
|
||||
return len(p), nil
|
||||
@@ -63,10 +75,9 @@ func (s *Tunnel) Read(p []byte) (int, error) {
|
||||
return 0, errors.New("reading reaches nil")
|
||||
}
|
||||
|
||||
func (s *Tunnel) Close() error {
|
||||
func (s *Tunnel) Stop() {
|
||||
s.l.Close()
|
||||
close(s.in)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Tunnel) handleWrite() {
|
||||
|
||||
@@ -27,18 +27,20 @@ func TestTunnel(t *testing.T) {
|
||||
t.Log("peer priv key:", hex.EncodeToString(peerpk.Private()[:]))
|
||||
t.Log("peer publ key:", hex.EncodeToString(peerpk.Public()[:]))
|
||||
|
||||
m := link.NewMe(selfpk.Private(), "192.168.1.2/32", "127.0.0.1:1236", false)
|
||||
m := link.NewMe(selfpk.Private(), "192.168.1.2/32", "127.0.0.1:1236", false, 1, 1, 4096)
|
||||
m.AddPeer("192.168.1.3", peerpk.Public(), "127.0.0.1:1237", []string{"192.168.1.3/32"}, 0, false, false)
|
||||
p := link.NewMe(peerpk.Private(), "192.168.1.3/32", "127.0.0.1:1237", false)
|
||||
p := link.NewMe(peerpk.Private(), "192.168.1.3/32", "127.0.0.1:1237", false, 1, 1, 4096)
|
||||
p.AddPeer("192.168.1.2", selfpk.Public(), "127.0.0.1:1236", []string{"192.168.1.2/32"}, 0, false, false)
|
||||
tunnme, err := Create(&m, "192.168.1.3", 1, 1, 4096)
|
||||
tunnme, err := Create(&m, "192.168.1.3")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
tunnpeer, err := Create(&p, "192.168.1.2", 1, 1, 4096)
|
||||
tunnme.Start(1, 1, 4096)
|
||||
tunnpeer, err := Create(&p, "192.168.1.2")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
tunnpeer.Start(1, 1, 4096)
|
||||
|
||||
sendb := ([]byte)("1234")
|
||||
tunnme.Write(sendb)
|
||||
@@ -68,4 +70,7 @@ func TestTunnel(t *testing.T) {
|
||||
if string(sendb) != string(buf) {
|
||||
t.Fatal("error: recv 131072 bytes data")
|
||||
}
|
||||
|
||||
tunnme.Stop()
|
||||
tunnpeer.Stop()
|
||||
}
|
||||
|
||||
107
upper/services/wg/wg.go
Normal file
107
upper/services/wg/wg.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package wg
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net"
|
||||
|
||||
base14 "github.com/fumiama/go-base16384"
|
||||
curve "github.com/fumiama/go-x25519"
|
||||
|
||||
"github.com/fumiama/WireGold/config"
|
||||
"github.com/fumiama/WireGold/gold/link"
|
||||
"github.com/fumiama/WireGold/helper"
|
||||
"github.com/fumiama/WireGold/lower"
|
||||
)
|
||||
|
||||
const suffix32 = "㴄"
|
||||
|
||||
type WG struct {
|
||||
c *config.Config
|
||||
key [32]byte
|
||||
PublicKey string
|
||||
nic *lower.NIC
|
||||
me link.Me
|
||||
}
|
||||
|
||||
func NewWireGold(c *config.Config) (wg WG, err error) {
|
||||
wg.c = c
|
||||
|
||||
var k []byte
|
||||
k, err = base14.UTF82utf16be(helper.StringToBytes(c.PrivateKey + suffix32))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
n := copy(wg.key[:], base14.Decode(k))
|
||||
if n != 32 {
|
||||
err = errors.New("private key length is not 32")
|
||||
return
|
||||
}
|
||||
|
||||
cur := curve.Get(wg.key[:])
|
||||
pubk, err := base14.UTF16be2utf8(base14.Encode((*cur.Public())[:]))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
wg.PublicKey = helper.BytesToString(pubk[:57])
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (wg *WG) Start(srcport, destport, mtu uint16) {
|
||||
wg.init(srcport, destport, mtu)
|
||||
wg.nic.Up()
|
||||
go wg.nic.Start(&wg.me)
|
||||
}
|
||||
|
||||
func (wg *WG) Run(srcport, destport, mtu uint16) {
|
||||
wg.init(srcport, destport, mtu)
|
||||
wg.nic.Up()
|
||||
wg.nic.Start(&wg.me)
|
||||
}
|
||||
|
||||
func (wg *WG) Stop() {
|
||||
wg.nic.Stop()
|
||||
wg.nic.Down()
|
||||
wg.nic.Destroy()
|
||||
}
|
||||
|
||||
func (wg *WG) init(srcport, destport, mtu uint16) {
|
||||
cidrsmap := make(map[string]bool, 32)
|
||||
_, mysubnet, err := net.ParseCIDR(wg.c.SubNet)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for _, p := range wg.c.Peers {
|
||||
for _, ip := range p.AllowedIPs {
|
||||
ipnet, _, err := net.ParseCIDR(ip)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if !mysubnet.Contains(ipnet) {
|
||||
cidrsmap[ip] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
cidrs := make([]string, len(cidrsmap))
|
||||
i := 0
|
||||
for k := range cidrsmap {
|
||||
cidrs[i] = k
|
||||
i++
|
||||
}
|
||||
|
||||
wg.nic = lower.NewNIC(wg.c.IP, wg.c.SubNet, cidrs...)
|
||||
wg.me = link.NewMe(&wg.key, wg.c.IP+"/32", wg.c.EndPoint, true, srcport, destport, mtu)
|
||||
|
||||
for _, peer := range wg.c.Peers {
|
||||
var peerkey [32]byte
|
||||
k, err := base14.UTF82utf16be(helper.StringToBytes(peer.PublicKey + suffix32))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
n := copy(peerkey[:], base14.Decode(k))
|
||||
if n != 32 {
|
||||
panic("peer public key length is not 32")
|
||||
}
|
||||
wg.me.AddPeer(peer.IP, &peerkey, peer.EndPoint, peer.AllowedIPs, peer.KeepAliveSeconds, peer.AllowTrans, true)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user