mirror of
https://github.com/netbirdio/netbird.git
synced 2026-04-28 05:06:38 +00:00
84 lines
2.1 KiB
Go
84 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/hex"
|
|
"flag"
|
|
"fmt"
|
|
"github.com/wiretrustee/wiretrustee/browser/conn"
|
|
"github.com/wiretrustee/wiretrustee/signal/client"
|
|
"golang.zx2c4.com/wireguard/device"
|
|
"golang.zx2c4.com/wireguard/tun/netstack"
|
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
|
"io"
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
//my private key qJi7zSrgdokeoXE27fbca2hvMlgg1NQIW6KbrTJhhmc=
|
|
//remote private key KLuBc6tM/NRV1071bfPiNUxZmMhGBCXfxoDg+A+J7ns=
|
|
func main() {
|
|
|
|
keyFlag := flag.String("key", "", "a Wireguard private key")
|
|
remoteKeyFlag := flag.String("remote-key", "", "a Wireguard remote peer public key")
|
|
signalEndpoint := flag.String("signal-endpoint", "ws://apitest.wiretrustee.com:80/signal", "a Signal service Websocket endpoint")
|
|
|
|
flag.Parse()
|
|
|
|
key, err := wgtypes.ParseKey(*keyFlag)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
log.Printf("my public key: %s", key.PublicKey().String())
|
|
|
|
remoteKey, err := wgtypes.ParseKey(*remoteKeyFlag)
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
|
|
defer cancel()
|
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
signal, err := client.NewWebsocketClient(ctx, *signalEndpoint, key)
|
|
|
|
tun, tnet, err := netstack.CreateNetTUN(
|
|
[]net.IP{net.ParseIP("10.100.0.2")},
|
|
[]net.IP{net.ParseIP("8.8.8.8")},
|
|
1420)
|
|
|
|
b := conn.NewWebRTCBind("chann-1", signal, key.PublicKey().String(), remoteKey.String())
|
|
dev := device.NewDevice(tun, b, device.NewLogger(device.LogLevelVerbose, ""))
|
|
err = dev.IpcSet(fmt.Sprintf("private_key=%s\npublic_key=%s\npersistent_keepalive_interval=10\nendpoint=webrtc://datachannel\nallowed_ip=0.0.0.0/0",
|
|
hex.EncodeToString(key[:]),
|
|
hex.EncodeToString(remoteKey[:]),
|
|
))
|
|
|
|
dev.Up()
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
listener, err := tnet.ListenTCP(&net.TCPAddr{Port: 80})
|
|
if err != nil {
|
|
log.Panicln(err)
|
|
}
|
|
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
|
|
log.Printf("> %s - %s - %s", request.RemoteAddr, request.URL.String(), request.UserAgent())
|
|
io.WriteString(writer, "Hello from userspace TCP!")
|
|
})
|
|
err = http.Serve(listener, nil)
|
|
if err != nil {
|
|
log.Panicln(err)
|
|
}
|
|
|
|
select {}
|
|
|
|
}
|