diff --git a/pkg/config/application_config.go b/pkg/config/application_config.go index e2c7e10ec..9df42c507 100644 --- a/pkg/config/application_config.go +++ b/pkg/config/application_config.go @@ -11,6 +11,7 @@ import ( // ApplicationConfiguration config specific to the node. type ApplicationConfiguration struct { Address string `yaml:"Address"` + AnnouncedNodePort uint16 `yaml:"AnnouncedPort"` AttemptConnPeers int `yaml:"AttemptConnPeers"` DBConfiguration storage.DBConfiguration `yaml:"DBConfiguration"` DialTimeout time.Duration `yaml:"DialTimeout"` diff --git a/pkg/network/server.go b/pkg/network/server.go index d384fdbcc..b463147ae 100644 --- a/pkg/network/server.go +++ b/pkg/network/server.go @@ -1278,8 +1278,14 @@ func (s *Server) broadcastTxLoop() { } } -// Port returns actual server port. It may differs from that of server.Config. +// Port returns a server port that should be used in P2P version exchange. In +// case if `AnnouncedPort` is set in the server.Config, the announced node port +// will be returned (e.g. consider the node running behind NAT). If `AnnouncedPort` +// isn't set, the port returned may still differs from that of server.Config. func (s *Server) Port() (uint16, error) { + if s.AnnouncedPort != 0 { + return s.ServerConfig.AnnouncedPort, nil + } var port uint16 _, portStr, err := net.SplitHostPort(s.transport.Address()) if err != nil { diff --git a/pkg/network/server_config.go b/pkg/network/server_config.go index 42fed7a23..374c38462 100644 --- a/pkg/network/server_config.go +++ b/pkg/network/server_config.go @@ -31,7 +31,10 @@ type ( // Address. Example: "127.0.0.1". Address string - // Port. Example: 20332. + // AnnouncedPort is an announced node port for P2P version exchange. + AnnouncedPort uint16 + + // Port is the actual node port it is bound to. Example: 20332. Port uint16 // The network mode the server will operate on. @@ -92,6 +95,7 @@ func NewServerConfig(cfg config.Config) ServerConfig { return ServerConfig{ UserAgent: cfg.GenerateUserAgent(), Address: appConfig.Address, + AnnouncedPort: appConfig.AnnouncedNodePort, Port: appConfig.NodePort, Net: protoConfig.Magic, Relay: appConfig.Relay,