Allow binds to both :: and 0.0.0.0

Binding on 0.0.0.0 when :: is specified in the bind_addresses is now allowed.
This causes a warning explaining the behaviour.
Configuration changed to match.

See #2232

Signed-off-by: Silke Hofstra <silke@slxh.eu>
This commit is contained in:
Silke Hofstra 2017-09-02 17:26:40 +02:00 committed by Silke
parent 3e59143ba8
commit 37d1a90025
2 changed files with 61 additions and 42 deletions

View File

@ -58,6 +58,7 @@ from twisted.internet import defer, reactor
from twisted.web.resource import EncodingResourceWrapper, Resource
from twisted.web.server import GzipEncoderFactory
from twisted.web.static import File
from twisted.internet import error
logger = logging.getLogger("synapse.app.homeserver")
@ -131,29 +132,36 @@ class SynapseHomeServer(HomeServer):
if tls:
for address in bind_addresses:
reactor.listenSSL(
port,
SynapseSite(
"synapse.access.https.%s" % (site_tag,),
site_tag,
listener_config,
root_resource,
),
self.tls_server_context_factory,
interface=address
)
try:
reactor.listenSSL(
port,
SynapseSite(
"synapse.access.https.%s" % (site_tag,),
site_tag,
listener_config,
root_resource,
),
self.tls_server_context_factory,
interface=address
)
except error.CannotListenError as e:
check_bind_error(e, address, bind_addresses)
else:
for address in bind_addresses:
reactor.listenTCP(
port,
SynapseSite(
"synapse.access.http.%s" % (site_tag,),
site_tag,
listener_config,
root_resource,
),
interface=address
)
try:
reactor.listenTCP(
port,
SynapseSite(
"synapse.access.http.%s" % (site_tag,),
site_tag,
listener_config,
root_resource,
),
interface=address
)
except error.CannotListenError as e:
check_bind_error(e, address, bind_addresses)
logger.info("Synapse now listening on port %d", port)
def _configure_named_resource(self, name, compress=False):
@ -232,25 +240,31 @@ class SynapseHomeServer(HomeServer):
bind_addresses = listener["bind_addresses"]
for address in bind_addresses:
reactor.listenTCP(
listener["port"],
manhole(
username="matrix",
password="rabbithole",
globals={"hs": self},
),
interface=address
)
try:
reactor.listenTCP(
listener["port"],
manhole(
username="matrix",
password="rabbithole",
globals={"hs": self},
),
interface=address
)
except error.CannotListenError as e:
check_bind_error(e, address, bind_addresses)
elif listener["type"] == "replication":
bind_addresses = listener["bind_addresses"]
for address in bind_addresses:
factory = ReplicationStreamProtocolFactory(self)
server_listener = reactor.listenTCP(
listener["port"], factory, interface=address
)
reactor.addSystemEventTrigger(
"before", "shutdown", server_listener.stopListening,
)
try:
factory = ReplicationStreamProtocolFactory(self)
server_listener = reactor.listenTCP(
listener["port"], factory, interface=address
)
reactor.addSystemEventTrigger(
"before", "shutdown", server_listener.stopListening,
)
except error.CannotListenError as e:
check_bind_error(e, address, bind_addresses)
else:
logger.warn("Unrecognized listener type: %s", listener["type"])
@ -284,6 +298,13 @@ class SynapseHomeServer(HomeServer):
return db_conn
def check_bind_error(e, address, bind_addresses):
if address == '0.0.0.0' and '::' in bind_addresses:
logger.warn('Failed to listen on 0.0.0.0, continuing because listening on [::]')
else:
raise e
def setup(config_options):
"""
Args:

View File

@ -220,14 +220,12 @@ class ServerConfig(Config):
port: %(bind_port)s
# Local addresses to listen on.
# On Linux and Mac OS, this will listen on all IPv4 and IPv6
# On Linux and Mac OS, `::` will listen on all IPv4 and IPv6
# addresses by default. For most other OSes, this will only listen
# on IPv6.
bind_addresses:
- '::'
# For systems other than Linux or Mac OS, uncomment the next line
# to also listen on IPv4.
#- '0.0.0.0'
- '0.0.0.0'
# This is a 'http' listener, allows us to specify 'resources'.
type: http
@ -265,7 +263,7 @@ class ServerConfig(Config):
# For when matrix traffic passes through loadbalancer that unwraps TLS.
- port: %(unsecure_port)s
tls: false
bind_addresses: ['::']
bind_addresses: ['::', '0.0.0.0']
type: http
x_forwarded: false