From 04544ac9e07db0a7f45954e90c2dce9351c2d81f Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 22 Jan 2012 16:43:45 +0000 Subject: [PATCH] * Transports: Bind only to a single interface if specified as the host address and it's available (ticket #591) --- .../router/transport/ntcp/NTCPTransport.java | 26 +++++++++++++++++-- .../router/transport/udp/UDPTransport.java | 18 +++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index de39759eaf..ac6856a5b7 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -13,6 +13,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -30,6 +31,7 @@ import net.i2p.router.transport.CommSystemFacadeImpl; import net.i2p.router.transport.Transport; import net.i2p.router.transport.TransportBid; import net.i2p.router.transport.TransportImpl; +import net.i2p.util.Addresses; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.Log; import net.i2p.util.Translate; @@ -515,6 +517,23 @@ public class NTCPTransport extends TransportImpl { if (_myAddress != null) { InetAddress bindToAddr = null; String bindTo = _context.getProperty(PROP_BIND_INTERFACE); + + if (bindTo == null) { + // If we are configured with a fixed IP address, + // AND it's one of our local interfaces, + // bind only to that. + boolean isFixed = _context.getProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_AUTO_IP, "true") + .toLowerCase(Locale.US).equals("false"); + String fixedHost = _context.getProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_HOSTNAME); + if (isFixed && fixedHost != null) { + try { + String testAddr = InetAddress.getByName(fixedHost).getHostAddress(); + if (Addresses.getAddresses().contains(testAddr)) + bindTo = testAddr; + } catch (UnknownHostException uhe) {} + } + } + if (bindTo != null) { try { bindToAddr = InetAddress.getByName(bindTo); @@ -532,10 +551,13 @@ public class NTCPTransport extends TransportImpl { chan.configureBlocking(false); InetSocketAddress addr = null; - if(bindToAddr==null) + if(bindToAddr==null) { addr = new InetSocketAddress(_myAddress.getPort()); - else + } else { addr = new InetSocketAddress(bindToAddr, _myAddress.getPort()); + if (_log.shouldLog(Log.WARN)) + _log.warn("Binding only to " + bindToAddr); + } chan.socket().bind(addr); if (_log.shouldLog(Log.INFO)) _log.info("Listening on " + addr); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index 3f233c53cb..11b3e29d08 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -35,6 +35,7 @@ import net.i2p.router.transport.Transport; import net.i2p.router.transport.TransportBid; import net.i2p.router.transport.TransportImpl; import net.i2p.router.util.RandomIterator; +import net.i2p.util.Addresses; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.Log; import net.i2p.util.SimpleScheduler; @@ -255,6 +256,21 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // bind host String bindTo = _context.getProperty(PROP_BIND_INTERFACE); + + if (bindTo == null) { + // If we are configured with a fixed IP address, + // AND it's one of our local interfaces, + // bind only to that. + String fixedHost = _context.getProperty(PROP_EXTERNAL_HOST); + if (fixedHost != null && fixedHost.length() > 0) { + try { + String testAddr = InetAddress.getByName(fixedHost).getHostAddress(); + if (Addresses.getAddresses().contains(testAddr)) + bindTo = testAddr; + } catch (UnknownHostException uhe) {} + } + } + InetAddress bindToAddr = null; if (bindTo != null) { try { @@ -281,6 +297,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } else { port = _externalListenPort; } + if (bindToAddr != null && _log.shouldLog(Log.WARN)) + _log.warn("Binding only to " + bindToAddr); if (_log.shouldLog(Log.INFO)) _log.info("Binding to the port: " + port); if (_endpoint == null) { -- GitLab