add blind proxy
This commit is contained in:
parent
006f604436
commit
049a9a6d48
|
@ -0,0 +1,106 @@
|
||||||
|
package subcommands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/bedrock-tool/bedrocktool/utils"
|
||||||
|
"github.com/sandertv/go-raknet"
|
||||||
|
"github.com/sandertv/gophertunnel/minecraft/protocol"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BlindProxyCMD struct {
|
||||||
|
ServerAddress string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*BlindProxyCMD) Name() string { return "blind-proxy" }
|
||||||
|
func (*BlindProxyCMD) Synopsis() string { return "raknet proxy" }
|
||||||
|
func (c *BlindProxyCMD) SetFlags(f *flag.FlagSet) {
|
||||||
|
f.StringVar(&c.ServerAddress, "address", "", "server address")
|
||||||
|
}
|
||||||
|
|
||||||
|
func packet_forward(src, dst *raknet.Conn) error {
|
||||||
|
for {
|
||||||
|
data, err := src.ReadPacket()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = dst.Write(data)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *BlindProxyCMD) Execute(ctx context.Context, ui utils.UI) error {
|
||||||
|
address, hostname, err := utils.ServerInput(ctx, c.ServerAddress)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
listener, err := raknet.Listen("0.0.0.0:19132")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer listener.Close()
|
||||||
|
logrus.Info("Listening on 0.0.0.0:19132")
|
||||||
|
|
||||||
|
listener.PongData([]byte(fmt.Sprintf("MCPE;%v;%v;%v;%v;%v;%v;Gophertunnel;%v;%v;%v;%v;",
|
||||||
|
"Proxy For "+hostname, protocol.CurrentProtocol, protocol.CurrentVersion, 0, 1,
|
||||||
|
listener.ID(), "Creative", 1, listener.Addr().(*net.UDPAddr).Port, listener.Addr().(*net.UDPAddr).Port,
|
||||||
|
)))
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
<-ctx.Done()
|
||||||
|
listener.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
clientConn, err := listener.Accept()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer clientConn.Close()
|
||||||
|
logrus.Info("Client Connected")
|
||||||
|
|
||||||
|
serverConn, err := raknet.DialContext(ctx, address)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer serverConn.Close()
|
||||||
|
logrus.Info("Server Connected")
|
||||||
|
|
||||||
|
logrus.Info("Forwarding Packets")
|
||||||
|
wg := sync.WaitGroup{}
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
_err := packet_forward(clientConn.(*raknet.Conn), serverConn)
|
||||||
|
if _err != nil {
|
||||||
|
err = _err
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
_err := packet_forward(serverConn, clientConn.(*raknet.Conn))
|
||||||
|
if _err != nil {
|
||||||
|
err = _err
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
utils.RegisterCommand(&BlindProxyCMD{})
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package subcommands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"flag"
|
||||||
|
|
||||||
|
"github.com/bedrock-tool/bedrocktool/utils"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RealmAddressCMD struct {
|
||||||
|
realm string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*RealmAddressCMD) Name() string { return "realm-address" }
|
||||||
|
func (*RealmAddressCMD) Synopsis() string { return "gets realms address" }
|
||||||
|
func (c *RealmAddressCMD) SetFlags(f *flag.FlagSet) {
|
||||||
|
f.StringVar(&c.realm, "realm", "", "realm name <name:id> or just name")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *RealmAddressCMD) Execute(ctx context.Context, ui utils.UI) error {
|
||||||
|
address, _, err := utils.ServerInput(ctx, "realm:"+c.realm)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
logrus.Infof("Address: %s", address)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
utils.RegisterCommand(&RealmAddressCMD{})
|
||||||
|
}
|
Loading…
Reference in New Issue