From 9b7ad40b06ba633dde3b6f9423a084e0a76b1a29 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Mon, 8 May 2023 11:19:44 -0400 Subject: [PATCH] feat: ext-ip --- cmd/waku/flags.go | 11 +++++++++-- cmd/waku/main.go | 3 ++- waku/node.go | 9 +++++++++ waku/options.go | 1 + waku/v2/node/wakuoptions.go | 25 +++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 3 deletions(-) diff --git a/cmd/waku/flags.go b/cmd/waku/flags.go index 05418c66..1bf0617f 100644 --- a/cmd/waku/flags.go +++ b/cmd/waku/flags.go @@ -147,9 +147,16 @@ var ( Destination: &options.NAT, // TODO: accept none,any,upnp,extaddr EnvVars: []string{"WAKUNODE2_NAT"}, }) - AdvertiseAddress = cliutils.NewGenericFlagMultiValue(&cli.GenericFlag{ + IPAddress = altsrc.NewStringFlag(&cli.StringFlag{ + Name: "ext-ip", // This was added so js-waku test don't fail + Usage: "Set external IP address", + Value: "", + Destination: &options.ExtIP, + EnvVars: []string{"WAKUNODE2_EXT_IP"}, + }) + ExtMultiaddresses = cliutils.NewGenericFlagMultiValue(&cli.GenericFlag{ Name: "ext-multiaddr", - Usage: "External address to advertise to other nodes. Ooverrides --address and --ws-address flags. Option may be repeated", + Usage: "External address to advertise to other nodes. Overrides --address and --ws-address flags. Option may be repeated", Value: &cliutils.MultiaddrSlice{ Values: &options.AdvertiseAddresses, }, diff --git a/cmd/waku/main.go b/cmd/waku/main.go index e1713c9c..1b0d857f 100644 --- a/cmd/waku/main.go +++ b/cmd/waku/main.go @@ -37,7 +37,8 @@ func main() { KeepAlive, PersistPeers, NAT, - AdvertiseAddress, + IPAddress, + ExtMultiaddresses, ShowAddresses, LogLevel, LogEncoding, diff --git a/waku/node.go b/waku/node.go index b2eed7aa..a6c76cbe 100644 --- a/waku/node.go +++ b/waku/node.go @@ -5,6 +5,7 @@ import ( "crypto/ecdsa" "database/sql" "encoding/json" + "errors" "fmt" "net" "os" @@ -119,6 +120,14 @@ func Execute(options Options) { nodeOpts = append(nodeOpts, node.WithDns4Domain(options.Dns4DomainName)) } + if options.ExtIP != "" { + ip := net.ParseIP(options.ExtIP) + if ip == nil { + failOnErr(errors.New("invalid IP address"), "could not set external IP address") + } + nodeOpts = append(nodeOpts, node.WithExternalIP(ip)) + } + libp2pOpts := node.DefaultLibP2POptions if len(options.AdvertiseAddresses) == 0 { libp2pOpts = append(libp2pOpts, libp2p.NATPortMap()) // Attempt to open ports using uPNP for NATed hosts.) diff --git a/waku/options.go b/waku/options.go index b9c798a1..da69f0f2 100644 --- a/waku/options.go +++ b/waku/options.go @@ -159,6 +159,7 @@ type Options struct { LogEncoding string LogOutput string NAT string + ExtIP string PersistPeers bool UserAgent string PProf bool diff --git a/waku/v2/node/wakuoptions.go b/waku/v2/node/wakuoptions.go index b762ebbe..6222e953 100644 --- a/waku/v2/node/wakuoptions.go +++ b/waku/v2/node/wakuoptions.go @@ -220,6 +220,31 @@ func WithAdvertiseAddresses(advertiseAddrs ...ma.Multiaddr) WakuNodeOption { } } +// WithExternalIP is a WakuNodeOption that allows overriding the advertised external IP used in the waku node with custom value +func WithExternalIP(ip net.IP) WakuNodeOption { + return func(params *WakuNodeParameters) error { + params.addressFactory = func(inputAddr []multiaddr.Multiaddr) (addresses []multiaddr.Multiaddr) { + component := "/ip4/" + if ip.To4() == nil && ip.To16() != nil { + component = "/ip6/" + } + + hostAddrMA, err := multiaddr.NewMultiaddr(component + ip.String()) + if err != nil { + panic("Could not build external IP") + } + + for _, addr := range inputAddr { + _, rest := multiaddr.SplitFirst(addr) + addresses = append(addresses, hostAddrMA.Encapsulate(rest)) + } + + return addresses + } + return nil + } +} + // WithMultiaddress is a WakuNodeOption that configures libp2p to listen on a list of multiaddresses func WithMultiaddress(addresses []multiaddr.Multiaddr) WakuNodeOption { return func(params *WakuNodeParameters) error {