From 4e5ee70b3dbd3e47db84f360227a45a06d850ad1 Mon Sep 17 00:00:00 2001 From: Maycon Santos Date: Fri, 2 Sep 2022 19:33:35 +0200 Subject: [PATCH] Load WgPort from config file and exchange via signal (#449) Added additional common blacklisted interfaces Updated the signal protocol to pass the peer port and netbird version Co-authored-by: braginini --- client/internal/config.go | 18 ++++++-- client/internal/connect.go | 2 +- client/internal/engine.go | 38 +++++++++------ client/internal/peer/conn.go | 77 +++++++++++++++++++++---------- client/internal/peer/conn_test.go | 21 ++++++--- client/internal/proxy/noproxy.go | 11 +++-- signal/client/client.go | 9 ++-- signal/proto/generate.sh | 4 ++ signal/proto/signalexchange.pb.go | 65 +++++++++++++++++--------- signal/proto/signalexchange.proto | 3 ++ 10 files changed, 171 insertions(+), 77 deletions(-) create mode 100755 signal/proto/generate.sh diff --git a/client/internal/config.go b/client/internal/config.go index d02fb2167..851cd2c01 100644 --- a/client/internal/config.go +++ b/client/internal/config.go @@ -37,6 +37,7 @@ type Config struct { ManagementURL *url.URL AdminURL *url.URL WgIface string + WgPort int IFaceBlackList []string // SSHKey is a private SSH key in a PEM format SSHKey string @@ -49,7 +50,13 @@ func createNewConfig(managementURL, adminURL, configPath, preSharedKey string) ( if err != nil { return nil, err } - config := &Config{SSHKey: string(pem), PrivateKey: wgKey, WgIface: iface.WgInterfaceDefault, IFaceBlackList: []string{}} + config := &Config{ + SSHKey: string(pem), + PrivateKey: wgKey, + WgIface: iface.WgInterfaceDefault, + WgPort: iface.DefaultWgPort, + IFaceBlackList: []string{}, + } if managementURL != "" { URL, err := ParseURL("Management URL", managementURL) if err != nil { @@ -72,8 +79,8 @@ func createNewConfig(managementURL, adminURL, configPath, preSharedKey string) ( config.AdminURL = newURL } - config.IFaceBlackList = []string{iface.WgInterfaceDefault, "tun0", "zt", "ZeroTier", "utun", "wg", "ts", - "Tailscale", "tailscale"} + config.IFaceBlackList = []string{iface.WgInterfaceDefault, "wt", "utun", "tun0", "zt", "ZeroTier", "utun", "wg", "ts", + "Tailscale", "tailscale", "docker", "vet"} err = util.WriteJson(configPath, config) if err != nil { @@ -150,6 +157,11 @@ func ReadConfig(managementURL, adminURL, configPath string, preSharedKey *string refresh = true } + if config.WgPort == 0 { + config.WgPort = iface.DefaultWgPort + refresh = true + } + if refresh { // since we have new management URL, we need to update config file if err := util.WriteJson(configPath, config); err != nil { diff --git a/client/internal/connect.go b/client/internal/connect.go index 719a43bd8..ddd8788e7 100644 --- a/client/internal/connect.go +++ b/client/internal/connect.go @@ -188,7 +188,7 @@ func createEngineConfig(key wgtypes.Key, config *Config, peerConfig *mgmProto.Pe WgAddr: peerConfig.Address, IFaceBlackList: config.IFaceBlackList, WgPrivateKey: key, - WgPort: iface.DefaultWgPort, + WgPort: config.WgPort, SSHKey: []byte(config.SSHKey), } diff --git a/client/internal/engine.go b/client/internal/engine.go index f78fccb1f..0a322c483 100644 --- a/client/internal/engine.go +++ b/client/internal/engine.go @@ -388,7 +388,8 @@ func signalCandidate(candidate ice.Candidate, myKey wgtypes.Key, remoteKey wgtyp return nil } -func signalAuth(uFrag string, pwd string, myKey wgtypes.Key, remoteKey wgtypes.Key, s signal.Client, isAnswer bool) error { +// SignalOfferAnswer signals either an offer or an answer to remote peer +func SignalOfferAnswer(offerAnswer peer.OfferAnswer, myKey wgtypes.Key, remoteKey wgtypes.Key, s signal.Client, isAnswer bool) error { var t sProto.Body_Type if isAnswer { t = sProto.Body_ANSWER @@ -396,9 +397,9 @@ func signalAuth(uFrag string, pwd string, myKey wgtypes.Key, remoteKey wgtypes.K t = sProto.Body_OFFER } - msg, err := signal.MarshalCredential(myKey, remoteKey, &signal.Credential{ - UFrag: uFrag, - Pwd: pwd, + msg, err := signal.MarshalCredential(myKey, offerAnswer.WgListenPort, remoteKey, &signal.Credential{ + UFrag: offerAnswer.IceCredentials.UFrag, + Pwd: offerAnswer.IceCredentials.Pwd, }, t) if err != nil { return err @@ -726,6 +727,7 @@ func (e Engine) createPeerConn(pubKey string, allowedIPs string) (*peer.Conn, er UDPMux: e.udpMux, UDPMuxSrflx: e.udpMuxSrflx, ProxyConfig: proxyConfig, + LocalWgPort: e.config.WgPort, } peerConn, err := peer.NewConn(config, e.statusRecorder) @@ -738,16 +740,16 @@ func (e Engine) createPeerConn(pubKey string, allowedIPs string) (*peer.Conn, er return nil, err } - signalOffer := func(uFrag string, pwd string) error { - return signalAuth(uFrag, pwd, e.config.WgPrivateKey, wgPubKey, e.signal, false) + signalOffer := func(offerAnswer peer.OfferAnswer) error { + return SignalOfferAnswer(offerAnswer, e.config.WgPrivateKey, wgPubKey, e.signal, false) } signalCandidate := func(candidate ice.Candidate) error { return signalCandidate(candidate, e.config.WgPrivateKey, wgPubKey, e.signal) } - signalAnswer := func(uFrag string, pwd string) error { - return signalAuth(uFrag, pwd, e.config.WgPrivateKey, wgPubKey, e.signal, true) + signalAnswer := func(offerAnswer peer.OfferAnswer) error { + return SignalOfferAnswer(offerAnswer, e.config.WgPrivateKey, wgPubKey, e.signal, true) } peerConn.SetSignalCandidate(signalCandidate) @@ -776,18 +778,26 @@ func (e *Engine) receiveSignalEvents() { if err != nil { return err } - conn.OnRemoteOffer(peer.IceCredentials{ - UFrag: remoteCred.UFrag, - Pwd: remoteCred.Pwd, + conn.OnRemoteOffer(peer.OfferAnswer{ + IceCredentials: peer.IceCredentials{ + UFrag: remoteCred.UFrag, + Pwd: remoteCred.Pwd, + }, + WgListenPort: int(msg.GetBody().GetWgListenPort()), + Version: msg.GetBody().GetNetBirdVersion(), }) case sProto.Body_ANSWER: remoteCred, err := signal.UnMarshalCredential(msg) if err != nil { return err } - conn.OnRemoteAnswer(peer.IceCredentials{ - UFrag: remoteCred.UFrag, - Pwd: remoteCred.Pwd, + conn.OnRemoteAnswer(peer.OfferAnswer{ + IceCredentials: peer.IceCredentials{ + UFrag: remoteCred.UFrag, + Pwd: remoteCred.Pwd, + }, + WgListenPort: int(msg.GetBody().GetWgListenPort()), + Version: msg.GetBody().GetNetBirdVersion(), }) case sProto.Body_CANDIDATE: candidate, err := ice.UnmarshalCandidate(msg.GetBody().Payload) diff --git a/client/internal/peer/conn.go b/client/internal/peer/conn.go index c07c5510e..1bb6bf823 100644 --- a/client/internal/peer/conn.go +++ b/client/internal/peer/conn.go @@ -3,6 +3,7 @@ package peer import ( "context" nbStatus "github.com/netbirdio/netbird/client/status" + "github.com/netbirdio/netbird/client/system" "github.com/netbirdio/netbird/iface" "golang.zx2c4.com/wireguard/wgctrl" "net" @@ -36,6 +37,20 @@ type ConnConfig struct { UDPMux ice.UDPMux UDPMuxSrflx ice.UniversalUDPMux + + LocalWgPort int +} + +// OfferAnswer represents a session establishment offer or answer +type OfferAnswer struct { + IceCredentials IceCredentials + // WgListenPort is a remote WireGuard listen port. + // This field is used when establishing a direct WireGuard connection without any proxy. + // We can set the remote peer's endpoint with this port. + WgListenPort int + + // Version of NetBird Agent + Version string } // IceCredentials ICE protocol credentials struct @@ -51,13 +66,13 @@ type Conn struct { // signalCandidate is a handler function to signal remote peer about local connection candidate signalCandidate func(candidate ice.Candidate) error // signalOffer is a handler function to signal remote peer our connection offer (credentials) - signalOffer func(uFrag string, pwd string) error - signalAnswer func(uFrag string, pwd string) error + signalOffer func(OfferAnswer) error + signalAnswer func(OfferAnswer) error // remoteOffersCh is a channel used to wait for remote credentials to proceed with the connection - remoteOffersCh chan IceCredentials + remoteOffersCh chan OfferAnswer // remoteAnswerCh is a channel used to wait for remote credentials answer (confirmation of our offer) to proceed with the connection - remoteAnswerCh chan IceCredentials + remoteAnswerCh chan OfferAnswer closeCh chan struct{} ctx context.Context notifyDisconnected context.CancelFunc @@ -88,8 +103,8 @@ func NewConn(config ConnConfig, statusRecorder *nbStatus.Status) (*Conn, error) mu: sync.Mutex{}, status: StatusDisconnected, closeCh: make(chan struct{}), - remoteOffersCh: make(chan IceCredentials), - remoteAnswerCh: make(chan IceCredentials), + remoteOffersCh: make(chan OfferAnswer), + remoteAnswerCh: make(chan OfferAnswer), statusRecorder: statusRecorder, }, nil } @@ -200,15 +215,15 @@ func (conn *Conn) Open() error { // Only continue once we got a connection confirmation from the remote peer. // The connection timeout could have happened before a confirmation received from the remote. // The connection could have also been closed externally (e.g. when we received an update from the management that peer shouldn't be connected) - var remoteCredentials IceCredentials + var remoteOfferAnswer OfferAnswer select { - case remoteCredentials = <-conn.remoteOffersCh: + case remoteOfferAnswer = <-conn.remoteOffersCh: // received confirmation from the remote peer -> ready to proceed err = conn.sendAnswer() if err != nil { return err } - case remoteCredentials = <-conn.remoteAnswerCh: + case remoteOfferAnswer = <-conn.remoteAnswerCh: case <-time.After(conn.config.Timeout): return NewConnectionTimeoutError(conn.config.Key, conn.config.Timeout) case <-conn.closeCh: @@ -216,7 +231,8 @@ func (conn *Conn) Open() error { return NewConnectionClosedError(conn.config.Key) } - log.Debugf("received connection confirmation from peer %s", conn.config.Key) + log.Debugf("received connection confirmation from peer %s running version %s and with remote WireGuard listen port %d", + conn.config.Key, remoteOfferAnswer.Version, remoteOfferAnswer.WgListenPort) // at this point we received offer/answer and we are ready to gather candidates conn.mu.Lock() @@ -245,16 +261,21 @@ func (conn *Conn) Open() error { isControlling := conn.config.LocalKey > conn.config.Key var remoteConn *ice.Conn if isControlling { - remoteConn, err = conn.agent.Dial(conn.ctx, remoteCredentials.UFrag, remoteCredentials.Pwd) + remoteConn, err = conn.agent.Dial(conn.ctx, remoteOfferAnswer.IceCredentials.UFrag, remoteOfferAnswer.IceCredentials.Pwd) } else { - remoteConn, err = conn.agent.Accept(conn.ctx, remoteCredentials.UFrag, remoteCredentials.Pwd) + remoteConn, err = conn.agent.Accept(conn.ctx, remoteOfferAnswer.IceCredentials.UFrag, remoteOfferAnswer.IceCredentials.Pwd) } if err != nil { return err } + // dynamically set remote WireGuard port is other side specified a different one from the default one + remoteWgPort := iface.DefaultWgPort + if remoteOfferAnswer.WgListenPort != 0 { + remoteWgPort = remoteOfferAnswer.WgListenPort + } // the ice connection has been established successfully so we are ready to start the proxy - err = conn.startProxy(remoteConn) + err = conn.startProxy(remoteConn, remoteWgPort) if err != nil { return err } @@ -319,7 +340,7 @@ func IsPublicIP(ip net.IP) bool { } // startProxy starts proxying traffic from/to local Wireguard and sets connection status to StatusConnected -func (conn *Conn) startProxy(remoteConn net.Conn) error { +func (conn *Conn) startProxy(remoteConn net.Conn, remoteWgPort int) error { conn.mu.Lock() defer conn.mu.Unlock() @@ -336,7 +357,7 @@ func (conn *Conn) startProxy(remoteConn net.Conn) error { p = proxy.NewWireguardProxy(conn.config.ProxyConfig) peerState.Direct = false } else { - p = proxy.NewNoProxy(conn.config.ProxyConfig) + p = proxy.NewNoProxy(conn.config.ProxyConfig, remoteWgPort) peerState.Direct = true } conn.proxy = p @@ -409,12 +430,12 @@ func (conn *Conn) cleanup() error { } // SetSignalOffer sets a handler function to be triggered by Conn when a new connection offer has to be signalled to the remote peer -func (conn *Conn) SetSignalOffer(handler func(uFrag string, pwd string) error) { +func (conn *Conn) SetSignalOffer(handler func(offer OfferAnswer) error) { conn.signalOffer = handler } // SetSignalAnswer sets a handler function to be triggered by Conn when a new connection answer has to be signalled to the remote peer -func (conn *Conn) SetSignalAnswer(handler func(uFrag string, pwd string) error) { +func (conn *Conn) SetSignalAnswer(handler func(answer OfferAnswer) error) { conn.signalAnswer = handler } @@ -459,8 +480,12 @@ func (conn *Conn) sendAnswer() error { return err } - log.Debugf("sending asnwer to %s", conn.config.Key) - err = conn.signalAnswer(localUFrag, localPwd) + log.Debugf("sending answer to %s", conn.config.Key) + err = conn.signalAnswer(OfferAnswer{ + IceCredentials: IceCredentials{localUFrag, localPwd}, + WgListenPort: conn.config.LocalWgPort, + Version: system.NetbirdVersion(), + }) if err != nil { return err } @@ -477,7 +502,11 @@ func (conn *Conn) sendOffer() error { if err != nil { return err } - err = conn.signalOffer(localUFrag, localPwd) + err = conn.signalOffer(OfferAnswer{ + IceCredentials: IceCredentials{localUFrag, localPwd}, + WgListenPort: conn.config.LocalWgPort, + Version: system.NetbirdVersion(), + }) if err != nil { return err } @@ -518,11 +547,11 @@ func (conn *Conn) Status() ConnStatus { // OnRemoteOffer handles an offer from the remote peer and returns true if the message was accepted, false otherwise // doesn't block, discards the message if connection wasn't ready -func (conn *Conn) OnRemoteOffer(remoteAuth IceCredentials) bool { +func (conn *Conn) OnRemoteOffer(offer OfferAnswer) bool { log.Debugf("OnRemoteOffer from peer %s on status %s", conn.config.Key, conn.status.String()) select { - case conn.remoteOffersCh <- remoteAuth: + case conn.remoteOffersCh <- offer: return true default: log.Debugf("OnRemoteOffer skipping message from peer %s on status %s because is not ready", conn.config.Key, conn.status.String()) @@ -533,11 +562,11 @@ func (conn *Conn) OnRemoteOffer(remoteAuth IceCredentials) bool { // OnRemoteAnswer handles an offer from the remote peer and returns true if the message was accepted, false otherwise // doesn't block, discards the message if connection wasn't ready -func (conn *Conn) OnRemoteAnswer(remoteAuth IceCredentials) bool { +func (conn *Conn) OnRemoteAnswer(answer OfferAnswer) bool { log.Debugf("OnRemoteAnswer from peer %s on status %s", conn.config.Key, conn.status.String()) select { - case conn.remoteAnswerCh <- remoteAuth: + case conn.remoteAnswerCh <- answer: return true default: // connection might not be ready yet to receive so we ignore the message diff --git a/client/internal/peer/conn_test.go b/client/internal/peer/conn_test.go index 245cd92dd..d90e63f06 100644 --- a/client/internal/peer/conn_test.go +++ b/client/internal/peer/conn_test.go @@ -18,6 +18,7 @@ var connConf = ConnConfig{ InterfaceBlackList: nil, Timeout: time.Second, ProxyConfig: proxy.Config{}, + LocalWgPort: 51820, } func TestNewConn_interfaceFilter(t *testing.T) { @@ -59,9 +60,13 @@ func TestConn_OnRemoteOffer(t *testing.T) { go func() { for { - accepted := conn.OnRemoteOffer(IceCredentials{ - UFrag: "test", - Pwd: "test", + accepted := conn.OnRemoteOffer(OfferAnswer{ + IceCredentials: IceCredentials{ + UFrag: "test", + Pwd: "test", + }, + WgListenPort: 0, + Version: "", }) if accepted { wg.Done() @@ -89,9 +94,13 @@ func TestConn_OnRemoteAnswer(t *testing.T) { go func() { for { - accepted := conn.OnRemoteAnswer(IceCredentials{ - UFrag: "test", - Pwd: "test", + accepted := conn.OnRemoteAnswer(OfferAnswer{ + IceCredentials: IceCredentials{ + UFrag: "test", + Pwd: "test", + }, + WgListenPort: 0, + Version: "", }) if accepted { wg.Done() diff --git a/client/internal/proxy/noproxy.go b/client/internal/proxy/noproxy.go index ecb96ef33..361ab68bb 100644 --- a/client/internal/proxy/noproxy.go +++ b/client/internal/proxy/noproxy.go @@ -1,7 +1,6 @@ package proxy import ( - "github.com/netbirdio/netbird/iface" log "github.com/sirupsen/logrus" "net" ) @@ -14,10 +13,14 @@ import ( // In order NoProxy to work, Wireguard port has to be fixed for the time being. type NoProxy struct { config Config + // RemoteWgListenPort is a WireGuard port of a remote peer. + // It is used instead of the hardcoded 51820 port. + RemoteWgListenPort int } -func NewNoProxy(config Config) *NoProxy { - return &NoProxy{config: config} +// NewNoProxy creates a new NoProxy with a provided config and remote peer's WireGuard listen port +func NewNoProxy(config Config, remoteWgPort int) *NoProxy { + return &NoProxy{config: config, RemoteWgListenPort: remoteWgPort} } func (p *NoProxy) Close() error { @@ -36,7 +39,7 @@ func (p *NoProxy) Start(remoteConn net.Conn) error { if err != nil { return err } - addr.Port = iface.DefaultWgPort + addr.Port = p.RemoteWgListenPort err = p.config.WgInterface.UpdatePeer(p.config.RemoteKey, p.config.AllowedIps, DefaultWgKeepAlive, addr, p.config.PreSharedKey) diff --git a/signal/client/client.go b/signal/client/client.go index 4b7c90ca0..9d1ef2cf9 100644 --- a/signal/client/client.go +++ b/signal/client/client.go @@ -2,6 +2,7 @@ package client import ( "fmt" + "github.com/netbirdio/netbird/client/system" "github.com/netbirdio/netbird/signal/proto" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" "io" @@ -41,13 +42,15 @@ func UnMarshalCredential(msg *proto.Message) (*Credential, error) { } // MarshalCredential marsharl a Credential instance and returns a Message object -func MarshalCredential(myKey wgtypes.Key, remoteKey wgtypes.Key, credential *Credential, t proto.Body_Type) (*proto.Message, error) { +func MarshalCredential(myKey wgtypes.Key, myPort int, remoteKey wgtypes.Key, credential *Credential, t proto.Body_Type) (*proto.Message, error) { return &proto.Message{ Key: myKey.PublicKey().String(), RemoteKey: remoteKey.String(), Body: &proto.Body{ - Type: t, - Payload: fmt.Sprintf("%s:%s", credential.UFrag, credential.Pwd), + Type: t, + Payload: fmt.Sprintf("%s:%s", credential.UFrag, credential.Pwd), + WgListenPort: uint32(myPort), + NetBirdVersion: system.NetbirdVersion(), }, }, nil } diff --git a/signal/proto/generate.sh b/signal/proto/generate.sh new file mode 100755 index 000000000..73f3d9bf3 --- /dev/null +++ b/signal/proto/generate.sh @@ -0,0 +1,4 @@ +#!/bin/bash +go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26 +go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1 +protoc -I proto/ proto/signalexchange.proto --go_out=. --go-grpc_out=. \ No newline at end of file diff --git a/signal/proto/signalexchange.pb.go b/signal/proto/signalexchange.pb.go index cac490da1..a0b62578d 100644 --- a/signal/proto/signalexchange.pb.go +++ b/signal/proto/signalexchange.pb.go @@ -214,6 +214,9 @@ type Body struct { Type Body_Type `protobuf:"varint,1,opt,name=type,proto3,enum=signalexchange.Body_Type" json:"type,omitempty"` Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` + // wgListenPort is an actual WireGuard listen port + WgListenPort uint32 `protobuf:"varint,3,opt,name=wgListenPort,proto3" json:"wgListenPort,omitempty"` + NetBirdVersion string `protobuf:"bytes,4,opt,name=netBirdVersion,proto3" json:"netBirdVersion,omitempty"` } func (x *Body) Reset() { @@ -262,6 +265,20 @@ func (x *Body) GetPayload() string { return "" } +func (x *Body) GetWgListenPort() uint32 { + if x != nil { + return x.WgListenPort + } + return 0 +} + +func (x *Body) GetNetBirdVersion() string { + if x != nil { + return x.NetBirdVersion + } + return "" +} + var File_signalexchange_proto protoreflect.FileDescriptor var file_signalexchange_proto_rawDesc = []byte{ @@ -281,28 +298,32 @@ var file_signalexchange_proto_rawDesc = []byte{ 0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x42, 0x6f, 0x64, 0x79, 0x52, - 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x7d, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x2d, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x42, 0x6f, 0x64, - 0x79, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2c, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, - 0x0a, 0x05, 0x4f, 0x46, 0x46, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4e, 0x53, - 0x57, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x4e, 0x44, 0x49, 0x44, 0x41, - 0x54, 0x45, 0x10, 0x02, 0x32, 0xb9, 0x01, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x45, - 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, - 0x20, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x1a, 0x20, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x20, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, - 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, - 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x20, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x6c, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, - 0x42, 0x08, 0x5a, 0x06, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xc9, 0x01, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x2d, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x42, 0x6f, + 0x64, 0x79, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x77, 0x67, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x77, + 0x67, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6e, + 0x65, 0x74, 0x42, 0x69, 0x72, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x74, 0x42, 0x69, 0x72, 0x64, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x4f, + 0x46, 0x46, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4e, 0x53, 0x57, 0x45, 0x52, + 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x4e, 0x44, 0x49, 0x44, 0x41, 0x54, 0x45, 0x10, + 0x02, 0x32, 0xb9, 0x01, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x20, 0x2e, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x20, + 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x12, 0x20, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x78, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x20, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x78, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x08, 0x5a, + 0x06, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/signal/proto/signalexchange.proto b/signal/proto/signalexchange.proto index 3db383723..4ba214d5f 100644 --- a/signal/proto/signalexchange.proto +++ b/signal/proto/signalexchange.proto @@ -49,4 +49,7 @@ message Body { } Type type = 1; string payload = 2; + // wgListenPort is an actual WireGuard listen port + uint32 wgListenPort = 3; + string netBirdVersion = 4; } \ No newline at end of file