diff --git a/cluster/cluster.go b/cluster/cluster.go index c5e1b2f..be6bbd1 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -31,7 +31,7 @@ type Cluster struct { // New is used to create a new Cluster instance // The returned instance is ready to be updated with the local node settings then joined -func New(name string, init bool, clusterKey []byte, bindAddr string, bindPort int, useIPAsName bool) (*Cluster, error) { +func New(name string, init bool, clusterKey []byte, bindAddr string, bindPort int, advertiseAddr string, advertisePort int, useIPAsName bool) (*Cluster, error) { state := &state{} if !init { loadState(state, name) @@ -47,7 +47,8 @@ func New(name string, init bool, clusterKey []byte, bindAddr string, bindPort in mlConfig.SecretKey = clusterKey mlConfig.BindAddr = bindAddr mlConfig.BindPort = bindPort - mlConfig.AdvertisePort = bindPort + mlConfig.AdvertiseAddr = advertiseAddr + mlConfig.AdvertisePort = advertisePort if useIPAsName && bindAddr != "0.0.0.0" { mlConfig.Name = bindAddr } diff --git a/config.go b/config.go index 34528c3..b9fd051 100644 --- a/config.go +++ b/config.go @@ -6,6 +6,7 @@ import ( "github.com/costela/wesher/cluster" "github.com/hashicorp/go-sockaddr" + "github.com/mikioh/ipaddr" "github.com/pkg/errors" "github.com/stevenroose/gonfig" ) @@ -17,6 +18,7 @@ type config struct { Init bool `desc:"whether to explicitly (re)initialize the cluster; any known state from previous runs will be forgotten"` BindAddr string `id:"bind-addr" desc:"IP address to bind to for cluster membership traffic (cannot be used with --bind-iface)"` BindIface string `id:"bind-iface" desc:"Interface to bind to for cluster membership traffic (cannot be used with --bind-addr)"` + AdvertiseAddr string `id:"advertise-addr" desc:"IP address to advertise to other nodes for NAT traversal"` ClusterPort int `id:"cluster-port" desc:"port used for membership gossip traffic (both TCP and UDP); must be the same across cluster" default:"7946"` WireguardPort int `id:"wireguard-port" desc:"port used for wireguard traffic (UDP); must be the same across cluster" default:"51820"` BaseMtu int `id:"mtu" desc:"MTU of the underlying network, taking intermediary hops into account" default:"1500"` @@ -80,6 +82,10 @@ func loadConfig() (*config, error) { } } + if _, err := ipaddr.Parse(config.AdvertiseAddr); err != nil { + config.AdvertiseAddr = "" + } + return &config, nil } diff --git a/go.mod b/go.mod index 3204755..d33d94b 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/memberlist v0.2.2 github.com/mattn/go-isatty v0.0.12 + github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721 // indirect github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.7.0 github.com/stevenroose/gonfig v0.1.5 diff --git a/main.go b/main.go index 28c8fd3..86ddb41 100644 --- a/main.go +++ b/main.go @@ -35,7 +35,7 @@ func main() { logrus.SetLevel(logLevel) // Create the wireguard and cluster configuration - cluster, err := cluster.New(config.Interface, config.Init, config.ClusterKey, config.BindAddr, config.ClusterPort, config.UseIPAsName) + cluster, err := cluster.New(config.Interface, config.Init, config.ClusterKey, config.BindAddr, config.ClusterPort, config.AdvertiseAddr, config.ClusterPort, config.UseIPAsName) if err != nil { logrus.WithError(err).Fatal("could not create cluster") }