diff --git a/README.md b/README.md index f7ec5b4..261c0c6 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,10 @@ On the client machine, run Wiretap in configure mode to build a config ./wiretap configure --port --endpoint --routes ``` +* `--port` sets the listening port of the Client's Relay interface. It's set to 51820 by default. Note that the E2EE listening port does not need to be accessible to the Server +* `--endpoint` tells the Server how to connect to the Client's Relay interface (the E2EE interfaces already know how to talk to each other if the Relay interfaces are working) +* `--routes` is the equivalent of WireGuard's AllowedIPs setting. This tells the Client to route traffic that matches these IP ranges through Wiretap + Following the example in the diagram: ```bash ./wiretap configure --port 1337 --endpoint 1.3.3.7:1337 --routes 10.0.0.0/24 @@ -99,7 +103,7 @@ Config File: ./wiretap serve -f wiretap_server.conf ``` > **Note** -> Wiretap uses 2 WireGuard interfaces per node in order to safely and scalably chain together servers. See the [How It Works](#how-it-works) section for details +> Wiretap uses 2 WireGuard interfaces per node in order to safely and scalably chain together servers. This means your client will bind to more than one port, but only the Relay Interface port needs to be accessible by the Server. See the [How It Works](#how-it-works) section for details. Use `--simple` if your setup requires a single interface on the client Install the resulting config either by copying and pasting the output or by importing the new `wiretap_relay.conf` and `wiretap_e2ee.conf` files into WireGuard: diff --git a/src/cmd/add_server.go b/src/cmd/add_server.go index 2a3f8dd..b830db8 100644 --- a/src/cmd/add_server.go +++ b/src/cmd/add_server.go @@ -320,7 +320,7 @@ func (c addServerCmdConfig) Run() { // Copy to clipboard if requested. var clipboardStatus string if c.writeToClipboard { - err = clipboard.WriteAll(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, "POSIX")) + err = clipboard.WriteAll(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, peer.POSIX, false)) if err != nil { clipboardStatus = fmt.Sprintf("%s %s", RedBold("clipboard:"), Red(fmt.Sprintf("error copying to clipboard: %v", err))) } else { @@ -347,8 +347,8 @@ func (c addServerCmdConfig) Run() { fmt.Fprintln(color.Output) fmt.Fprintln(color.Output, fileStatusServer) fmt.Fprintln(color.Output) - fmt.Fprintln(color.Output, Cyan("POSIX Shell: "), Green(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, "POSIX"))) - fmt.Fprintln(color.Output, Cyan(" PowerShell: "), Green(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, "POWERSHELL"))) + fmt.Fprintln(color.Output, Cyan("POSIX Shell: "), Green(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, peer.POSIX, false))) + fmt.Fprintln(color.Output, Cyan(" PowerShell: "), Green(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, peer.PowerShell, false))) fmt.Fprintln(color.Output, Cyan("Config File: "), Green("./wiretap serve -f "+c.configFileServer)) fmt.Fprintln(color.Output) if c.writeToClipboard { diff --git a/src/cmd/configure.go b/src/cmd/configure.go index bcacac6..d809cdb 100644 --- a/src/cmd/configure.go +++ b/src/cmd/configure.go @@ -22,6 +22,7 @@ type configureCmdConfig struct { configFileE2EE string configFileServer string writeToClipboard bool + simple bool clientAddr4Relay string clientAddr6Relay string clientAddr4E2EE string @@ -44,6 +45,7 @@ var configureCmdArgs = configureCmdConfig{ configFileE2EE: ConfigE2EE, configFileServer: ConfigServer, writeToClipboard: false, + simple: false, clientAddr4Relay: ClientRelaySubnet4.Addr().Next().String() + "/32", clientAddr6Relay: ClientRelaySubnet6.Addr().Next().String() + "/128", clientAddr4E2EE: ClientE2EESubnet4.Addr().Next().String() + "/32", @@ -77,6 +79,7 @@ func init() { configureCmd.Flags().StringVarP(&configureCmdArgs.configFileE2EE, "e2ee-output", "", configureCmdArgs.configFileE2EE, "wireguard E2EE config output filename") configureCmd.Flags().StringVarP(&configureCmdArgs.configFileServer, "server-output", "s", configureCmdArgs.configFileServer, "wiretap server config output filename") configureCmd.Flags().BoolVarP(&configureCmdArgs.writeToClipboard, "clipboard", "c", configureCmdArgs.writeToClipboard, "copy configuration args to clipboard") + configureCmd.Flags().BoolVarP(&configureCmdArgs.simple, "simple", "", configureCmdArgs.simple, "disable multihop and multiclient features for a simpler setup") configureCmd.Flags().StringVarP(&configureCmdArgs.apiAddr, "api", "0", configureCmdArgs.apiAddr, "address of server API service") configureCmd.Flags().StringVarP(&configureCmdArgs.clientAddr4Relay, "ipv4-relay", "", configureCmdArgs.clientAddr4Relay, "ipv4 relay address") @@ -138,8 +141,14 @@ func (c configureCmdConfig) Run() { ListenPort: c.port, Peers: []peer.PeerConfigArgs{ { - PublicKey: serverConfigRelay.GetPublicKey(), - AllowedIPs: []string{relaySubnet4.String(), relaySubnet6.String()}, + PublicKey: serverConfigRelay.GetPublicKey(), + AllowedIPs: func() []string { + if c.simple { + return c.allowedIPs + } else { + return []string{relaySubnet4.String(), relaySubnet6.String()} + } + }(), Endpoint: func() string { if c.outbound { return c.endpoint @@ -217,11 +226,13 @@ func (c configureCmdConfig) Run() { // Write config file and get status string. var fileStatusE2EE string - err = os.WriteFile(c.configFileE2EE, []byte(clientConfigE2EE.AsFile()), 0600) - if err != nil { - fileStatusE2EE = fmt.Sprintf("%s %s", RedBold("config:"), Red(fmt.Sprintf("error writing config file: %v", err))) - } else { - fileStatusE2EE = fmt.Sprintf("%s %s", GreenBold("config:"), Green(c.configFileE2EE)) + if !c.simple { + err = os.WriteFile(c.configFileE2EE, []byte(clientConfigE2EE.AsFile()), 0600) + if err != nil { + fileStatusE2EE = fmt.Sprintf("%s %s", RedBold("config:"), Red(fmt.Sprintf("error writing config file: %v", err))) + } else { + fileStatusE2EE = fmt.Sprintf("%s %s", GreenBold("config:"), Green(c.configFileE2EE)) + } } // Write server config file and get status string. @@ -233,10 +244,16 @@ func (c configureCmdConfig) Run() { fileStatusServer = fmt.Sprintf("%s %s", GreenBold("server config:"), Green(c.configFileServer)) } + // Make config file string + serverConfigFile := fmt.Sprintf("./wiretap serve -f %s", c.configFileServer) + if c.simple { + serverConfigFile = fmt.Sprintf("%s --simple", serverConfigFile) + } + // Copy to clipboard if requested. var clipboardStatus string if c.writeToClipboard { - err = clipboard.WriteAll(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, "POSIX")) + err = clipboard.WriteAll(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, peer.POSIX, c.simple)) if err != nil { clipboardStatus = fmt.Sprintf("%s %s", RedBold("clipboard:"), Red(fmt.Sprintf("error copying to clipboard: %v", err))) } else { @@ -247,24 +264,26 @@ func (c configureCmdConfig) Run() { // Write and format output. fmt.Fprintln(color.Output) fmt.Fprintln(color.Output, "Configurations successfully generated.") - fmt.Fprintln(color.Output, "Import the two configs into WireGuard locally and pass the arguments below to Wiretap on the remote machine.") + fmt.Fprintln(color.Output, "Import the config(s) into WireGuard locally and pass the arguments below to Wiretap on the remote machine.") fmt.Fprintln(color.Output) fmt.Fprintln(color.Output, fileStatusRelay) fmt.Fprintln(color.Output, Green(strings.Repeat("─", 32))) fmt.Fprint(color.Output, WhiteBold(clientConfigRelay.AsFile())) fmt.Fprintln(color.Output, Green(strings.Repeat("─", 32))) fmt.Fprintln(color.Output) - fmt.Fprintln(color.Output, fileStatusE2EE) - fmt.Fprintln(color.Output, Green(strings.Repeat("─", 32))) - fmt.Fprint(color.Output, WhiteBold(clientConfigE2EE.AsFile())) - fmt.Fprintln(color.Output, Green(strings.Repeat("─", 32))) - fmt.Fprintln(color.Output) + if !c.simple { + fmt.Fprintln(color.Output, fileStatusE2EE) + fmt.Fprintln(color.Output, Green(strings.Repeat("─", 32))) + fmt.Fprint(color.Output, WhiteBold(clientConfigE2EE.AsFile())) + fmt.Fprintln(color.Output, Green(strings.Repeat("─", 32))) + fmt.Fprintln(color.Output) + } fmt.Fprintln(color.Output, fileStatusServer) fmt.Fprintln(color.Output) fmt.Fprintln(color.Output, GreenBold("server command:")) - fmt.Fprintln(color.Output, Cyan("POSIX Shell: "), Green(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, "POSIX"))) - fmt.Fprintln(color.Output, Cyan(" PowerShell: "), Green(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, "POWERSHELL"))) - fmt.Fprintln(color.Output, Cyan("Config File: "), Green("./wiretap serve -f "+c.configFileServer)) + fmt.Fprintln(color.Output, Cyan("POSIX Shell: "), Green(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, peer.POSIX, c.simple))) + fmt.Fprintln(color.Output, Cyan(" PowerShell: "), Green(peer.CreateServerCommand(serverConfigRelay, serverConfigE2EE, peer.PowerShell, c.simple))) + fmt.Fprintln(color.Output, Cyan("Config File: "), Green(serverConfigFile)) fmt.Fprintln(color.Output) if c.writeToClipboard { fmt.Fprintln(color.Output, clipboardStatus) diff --git a/src/cmd/serve.go b/src/cmd/serve.go index 5059fbe..005eeac 100644 --- a/src/cmd/serve.go +++ b/src/cmd/serve.go @@ -14,6 +14,7 @@ import ( "github.com/spf13/viper" "golang.zx2c4.com/wireguard/conn" "golang.zx2c4.com/wireguard/device" + "golang.zx2c4.com/wireguard/tun" "golang.zx2c4.com/wireguard/tun/netstack" "gvisor.dev/gvisor/pkg/tcpip/network/ipv4" "gvisor.dev/gvisor/pkg/tcpip/network/ipv6" @@ -34,6 +35,7 @@ type serveCmdConfig struct { clientAddr6Relay string quiet bool debug bool + simple bool logging bool logFile string } @@ -61,6 +63,7 @@ var serveCmd = serveCmdConfig{ clientAddr6Relay: ClientRelaySubnet6.Addr().Next().Next().String(), quiet: false, debug: false, + simple: false, logging: false, logFile: "wiretap.log", } @@ -99,6 +102,7 @@ func init() { cmd.Flags().StringVarP(&serveCmd.configFile, "config-file", "f", serveCmd.configFile, "wireguard config file to read from") cmd.Flags().BoolVarP(&serveCmd.quiet, "quiet", "q", serveCmd.quiet, "silence wiretap log messages") cmd.Flags().BoolVarP(&serveCmd.debug, "debug", "d", serveCmd.debug, "enable wireguard log messages") + cmd.Flags().BoolVarP(&serveCmd.simple, "simple", "", serveCmd.simple, "disable multihop and multiclient features for a simpler setup") cmd.Flags().BoolVarP(&serveCmd.logging, "log", "l", serveCmd.logging, "enable logging to file") cmd.Flags().StringVarP(&serveCmd.logFile, "log-file", "o", serveCmd.logFile, "write log to this filename") @@ -107,6 +111,10 @@ func init() { cmd.Flags().StringVarP(&serveCmd.clientAddr4E2EE, "ipv4-e2ee-client", "", serveCmd.clientAddr4E2EE, "ipv4 e2ee address of client") cmd.Flags().StringVarP(&serveCmd.clientAddr6E2EE, "ipv6-e2ee-client", "", serveCmd.clientAddr6E2EE, "ipv6 e2ee address of client") + // Bind supported flags to environment variables. + err = viper.BindPFlag("simple", cmd.Flags().Lookup("simple")) + check("error binding flag to viper", err) + // Quiet and debug flags must be used independently. cmd.MarkFlagsMutuallyExclusive("debug", "quiet") @@ -184,7 +192,27 @@ func init() { helpFunc := cmd.HelpFunc() cmd.SetHelpFunc(func(cmd *cobra.Command, args []string) { if !ShowHidden { - for _, f := range []string{"ipv4-relay-client", "ipv6-relay-client", "ipv4-e2ee-client", "ipv6-e2ee-client", "private-relay", "public-relay", "private-e2ee", "public-e2ee", "endpoint-relay", "endpoint-e2ee", "port", "allowed", "ipv4-relay", "ipv6-relay", "ipv4-e2ee", "ipv6-e2ee", "api", "keepalive", "mtu"} { + for _, f := range []string{ + "ipv4-relay-client", + "ipv6-relay-client", + "ipv4-e2ee-client", + "ipv6-e2ee-client", + "private-relay", + "public-relay", + "private-e2ee", + "public-e2ee", + "endpoint-relay", + "endpoint-e2ee", + "port", + "allowed", + "ipv4-relay", + "ipv6-relay", + "ipv4-e2ee", + "ipv6-e2ee", + "api", + "keepalive", + "mtu", + } { err := cmd.Flags().MarkHidden(f) if err != nil { fmt.Printf("Failed to hide flag %v: %v\n", f, err) @@ -236,7 +264,7 @@ func (c serveCmdConfig) Run() { } // Check for required flags. - if !viper.IsSet("Relay.Peer.publickey") || !viper.IsSet("E2EE.Peer.publickey") { + if !viper.IsSet("Relay.Peer.publickey") || (!viper.IsSet("simple") && !viper.IsSet("E2EE.Peer.publickey")) { check("config error", errors.New("public key of peer is required")) } @@ -263,20 +291,23 @@ func (c serveCmdConfig) Run() { configRelay, err := peer.GetConfig(configRelayArgs) check("failed to make relay configuration", err) - configE2EEArgs := peer.ConfigArgs{ - PrivateKey: viper.GetString("E2EE.Interface.privatekey"), - ListenPort: E2EEPort, - Peers: []peer.PeerConfigArgs{ - { - PublicKey: viper.GetString("E2EE.Peer.publickey"), - Endpoint: viper.GetString("E2EE.Peer.endpoint"), - AllowedIPs: []string{c.clientAddr4E2EE + "/32", c.clientAddr6E2EE + "/128"}, + var configE2EE peer.Config + if !viper.GetBool("simple") { + configE2EEArgs := peer.ConfigArgs{ + PrivateKey: viper.GetString("E2EE.Interface.privatekey"), + ListenPort: E2EEPort, + Peers: []peer.PeerConfigArgs{ + { + PublicKey: viper.GetString("E2EE.Peer.publickey"), + Endpoint: viper.GetString("E2EE.Peer.endpoint"), + AllowedIPs: []string{c.clientAddr4E2EE + "/32", c.clientAddr6E2EE + "/128"}, + }, }, - }, - Addresses: []string{viper.GetString("E2EE.Interface.ipv4") + "/32", viper.GetString("E2EE.Interface.ipv6") + "/128", viper.GetString("E2EE.Interface.api") + "/128"}, + Addresses: []string{viper.GetString("E2EE.Interface.ipv4") + "/32", viper.GetString("E2EE.Interface.ipv6") + "/128", viper.GetString("E2EE.Interface.api") + "/128"}, + } + configE2EE, err = peer.GetConfig(configE2EEArgs) + check("failed to make e2ee configuration", err) } - configE2EE, err := peer.GetConfig(configE2EEArgs) - check("failed to make relay configuration", err) // Print public key for easier configuration. fmt.Println() @@ -284,12 +315,17 @@ func (c serveCmdConfig) Run() { fmt.Println(strings.Repeat("─", 32)) fmt.Print(configRelay.AsShareableFile()) fmt.Println(strings.Repeat("─", 32)) + if !viper.GetBool("simple") { + fmt.Println() + fmt.Println("E2EE configuration:") + fmt.Println(strings.Repeat("─", 32)) + fmt.Print(configE2EE.AsShareableFile()) + fmt.Println(strings.Repeat("─", 32)) + } fmt.Println() - fmt.Println("E2EE configuration:") - fmt.Println(strings.Repeat("─", 32)) - fmt.Print(configE2EE.AsShareableFile()) - fmt.Println(strings.Repeat("─", 32)) - fmt.Println() + + apiAddr, err := netip.ParseAddr(viper.GetString("E2EE.Interface.api")) + check("failed to parse API address", err) // Create virtual relay interface with this address and MTU. ipv4Addr, err := netip.ParseAddr(viper.GetString("Relay.Interface.ipv4")) @@ -298,42 +334,48 @@ func (c serveCmdConfig) Run() { ipv6Addr, err := netip.ParseAddr(viper.GetString("Relay.Interface.ipv6")) check("failed to parse ipv6 address", err) - fmt.Println(ipv4Addr, ipv6Addr, "for relay") + relayAddrs := []netip.Addr{ipv4Addr, ipv6Addr} + if viper.GetBool("simple") { + relayAddrs = append(relayAddrs, apiAddr) + } + tunRelay, tnetRelay, err := netstack.CreateNetTUN( - []netip.Addr{ipv4Addr, ipv6Addr}, + relayAddrs, []netip.Addr{}, viper.GetInt("Relay.Interface.mtu"), ) check("failed to create relay TUN", err) - // Enable forwarding for Relay NICs - s := tnetRelay.Stack() - tcpipErr := s.SetForwardingDefaultAndAllNICs(ipv4.ProtocolNumber, true) - if tcpipErr != nil { - check("failed to enable forwarding", errors.New(tcpipErr.String())) - } - tcpipErr = s.SetForwardingDefaultAndAllNICs(ipv6.ProtocolNumber, true) - if tcpipErr != nil { - check("failed to enable forwarding", errors.New(tcpipErr.String())) - } + var tunE2EE tun.Device + var tnetE2EE *netstack.Net + if !viper.GetBool("simple") { + // Enable forwarding for Relay NICs + s := tnetRelay.Stack() + tcpipErr := s.SetForwardingDefaultAndAllNICs(ipv4.ProtocolNumber, true) + if tcpipErr != nil { + check("failed to enable forwarding", errors.New(tcpipErr.String())) + } + tcpipErr = s.SetForwardingDefaultAndAllNICs(ipv6.ProtocolNumber, true) + if tcpipErr != nil { + check("failed to enable forwarding", errors.New(tcpipErr.String())) + } - // Create virtual e2ee interface with this address and MTU - 80. - ipv4Addr, err = netip.ParseAddr(viper.GetString("E2EE.Interface.ipv4")) - check("failed to parse ipv4 address", err) + // Create virtual e2ee interface with this address and MTU - 80. + ipv4Addr, err = netip.ParseAddr(viper.GetString("E2EE.Interface.ipv4")) + check("failed to parse ipv4 address", err) - ipv6Addr, err = netip.ParseAddr(viper.GetString("E2EE.Interface.ipv6")) - check("failed to parse ipv6 address", err) + ipv6Addr, err = netip.ParseAddr(viper.GetString("E2EE.Interface.ipv6")) + check("failed to parse ipv6 address", err) - apiAddr, err := netip.ParseAddr(viper.GetString("E2EE.Interface.api")) - check("failed to parse API address", err) - - fmt.Println(ipv4Addr, ipv6Addr, apiAddr, "for relay") - tunE2EE, tnetE2EE, err := netstack.CreateNetTUN( - []netip.Addr{ipv4Addr, ipv6Addr, apiAddr}, - []netip.Addr{}, - viper.GetInt("Relay.Interface.mtu")-80, - ) - check("failed to create E2EE TUN", err) + if !viper.GetBool("simple") { + tunE2EE, tnetE2EE, err = netstack.CreateNetTUN( + []netip.Addr{ipv4Addr, ipv6Addr, apiAddr}, + []netip.Addr{}, + viper.GetInt("Relay.Interface.mtu")-80, + ) + check("failed to create E2EE TUN", err) + } + } var logger int if c.debug { @@ -353,35 +395,45 @@ func (c serveCmdConfig) Run() { err = devRelay.Up() check("failed to bring up relay device", err) - // Make new e2ee device, bind to relay device's userspace networking stack. - devE2EE := device.NewDevice(tunE2EE, userspace.NewBind(tnetRelay), device.NewLogger(logger, "")) - - // Configure wireguard. - fmt.Println(configE2EE.AsIPC()) - err = devE2EE.IpcSet(configE2EE.AsIPC()) - check("failed to configure e2ee wireguard device", err) - err = devE2EE.Up() - check("failed to bring up e2ee device", err) + var devE2EE *device.Device + if !viper.GetBool("simple") { + // Make new e2ee device, bind to relay device's userspace networking stack. + devE2EE = device.NewDevice(tunE2EE, userspace.NewBind(tnetRelay), device.NewLogger(logger, "")) + + // Configure wireguard. + fmt.Println(configE2EE.AsIPC()) + err = devE2EE.IpcSet(configE2EE.AsIPC()) + check("failed to configure e2ee wireguard device", err) + err = devE2EE.Up() + check("failed to bring up e2ee device", err) + } + transportHandler := func() *netstack.Net { + if viper.GetBool("simple") { + return tnetRelay + } else { + return tnetE2EE + } + }() // Start transport layer handlers under the e2ee device. wg.Add(1) lock.Lock() go func() { - tcp.Handle(tnetE2EE, ipv4Addr, ipv6Addr, 1337, &lock) + tcp.Handle(transportHandler, ipv4Addr, ipv6Addr, 1337, &lock) wg.Done() }() lock.Lock() wg.Add(1) go func() { - udp.Handle(tnetE2EE, ipv4Addr, ipv6Addr, 1337, &lock) + udp.Handle(transportHandler, ipv4Addr, ipv6Addr, 1337, &lock) wg.Done() }() lock.Lock() wg.Add(1) go func() { - icmp.Handle(tnetE2EE, &lock) + icmp.Handle(transportHandler, &lock) wg.Done() }() @@ -400,7 +452,7 @@ func (c serveCmdConfig) Run() { lock.Lock() wg.Add(1) go func() { - api.Handle(tnetE2EE, devRelay, devE2EE, &configRelay, &configE2EE, apiAddr, uint16(ApiPort), &lock, &ns) + api.Handle(transportHandler, devRelay, devE2EE, &configRelay, &configE2EE, apiAddr, uint16(ApiPort), &lock, &ns) wg.Done() }() diff --git a/src/peer/config.go b/src/peer/config.go index 95364fe..20ca0e9 100644 --- a/src/peer/config.go +++ b/src/peer/config.go @@ -37,6 +37,13 @@ type ConfigArgs struct { Addresses []string } +type Shell uint + +const ( + POSIX Shell = iota + PowerShell +) + func GetConfig(args ConfigArgs) (Config, error) { c, err := NewConfig() if err != nil { @@ -412,7 +419,7 @@ func (c *Config) AsIPC() string { return s.String() } -func CreateServerCommand(relayConfig Config, e2eeConfig Config, shell string) string { +func CreateServerCommand(relayConfig Config, e2eeConfig Config, shell Shell, simple bool) string { var s strings.Builder var keys []string var vals []string @@ -458,31 +465,36 @@ func CreateServerCommand(relayConfig Config, e2eeConfig Config, shell string) st vals = append(vals, relayConfig.GetPeerEndpoint(0)) } - // E2EE Interface. - keys = append(keys, "WIRETAP_E2EE_INTERFACE_PRIVATEKEY") - vals = append(vals, e2eeConfig.GetPrivateKey()) + if !simple { + // E2EE Interface. + keys = append(keys, "WIRETAP_E2EE_INTERFACE_PRIVATEKEY") + vals = append(vals, e2eeConfig.GetPrivateKey()) - if len(e2eeConfig.addresses) == 1 { - keys = append(keys, "WIRETAP_E2EE_INTERFACE_API") - vals = append(vals, e2eeConfig.addresses[0].IP.String()) - } + if len(e2eeConfig.addresses) == 1 { + keys = append(keys, "WIRETAP_E2EE_INTERFACE_API") + vals = append(vals, e2eeConfig.addresses[0].IP.String()) + } - // E2EE Peer. - keys = append(keys, "WIRETAP_E2EE_PEER_PUBLICKEY") - vals = append(vals, e2eeConfig.GetPeerPublicKey(0)) + // E2EE Peer. + keys = append(keys, "WIRETAP_E2EE_PEER_PUBLICKEY") + vals = append(vals, e2eeConfig.GetPeerPublicKey(0)) - if len(e2eeConfig.GetPeerEndpoint(0)) > 0 { - keys = append(keys, "WIRETAP_E2EE_PEER_ENDPOINT") - vals = append(vals, e2eeConfig.GetPeerEndpoint(0)) + if len(e2eeConfig.GetPeerEndpoint(0)) > 0 { + keys = append(keys, "WIRETAP_E2EE_PEER_ENDPOINT") + vals = append(vals, e2eeConfig.GetPeerEndpoint(0)) + } + } else { + keys = append(keys, "WIRETAP_SIMPLE") + vals = append(vals, "true") } switch shell { - case "POSIX": + case POSIX: for i := 0; i < len(keys); i++ { s.WriteString(fmt.Sprintf("%s=%s ", keys[i], vals[i])) } s.WriteString("./wiretap serve") - case "POWERSHELL": + case PowerShell: for i := 0; i < len(keys); i++ { s.WriteString(fmt.Sprintf("$env:%s=\"%s\"; ", keys[i], vals[i])) }