From 815586eeec47edd2834082923fe64530e6bd60ab Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 26 Nov 2020 15:08:04 +0000 Subject: [PATCH 1/6] feat: add nat manager configuration options --- docs/CONFIG.md | 10 ++++++++- examples/custom-libp2p/package.json | 2 +- packages/ipfs-core/package.json | 2 +- packages/ipfs-core/src/components/config.js | 21 +++++++++++++++++-- packages/ipfs-core/src/components/libp2p.js | 10 +++++++++ packages/ipfs-core/src/components/start.js | 5 ++++- .../ipfs-core/src/runtime/config-browser.js | 3 ++- .../ipfs-core/src/runtime/config-nodejs.js | 3 ++- .../ipfs-core/src/runtime/libp2p-browser.js | 3 +++ .../ipfs-core/src/runtime/libp2p-nodejs.js | 3 +++ packages/ipfs-daemon/package.json | 2 +- 11 files changed, 55 insertions(+), 9 deletions(-) diff --git a/docs/CONFIG.md b/docs/CONFIG.md index 39c07d2773..173d349f2f 100644 --- a/docs/CONFIG.md +++ b/docs/CONFIG.md @@ -26,6 +26,7 @@ The js-ipfs config file is a JSON document located in the root directory of the - [`Enabled`](#enabled) - [`Swarm`](#swarm-1) - [`ConnMgr`](#connmgr) + - [`DisableNatPortMap`](#disablenatportmap) - [Example](#example) - [`API`](#api-1) - [`HTTPHeaders`](#httpheaders) @@ -269,6 +270,12 @@ The "basic" connection manager tries to keep between `LowWater` and `HighWater` 1. Keeping all connections until `HighWater` connections is reached. 2. Once `HighWater` is reached, it closes connections until `LowWater` is reached. +### `DisableNatPortMap` + +By default when running under nodejs, libp2p will try to use [UPnP](https://en.wikipedia.org/wiki/Universal_Plug_and_Play) to open a random high port on your router for any TCP connections you have configured. + +Set `DisableNatPortMap` to `false` to disable this behaviour. + ### Example ```json @@ -278,7 +285,8 @@ The "basic" connection manager tries to keep between `LowWater` and `HighWater` "LowWater": 100, "HighWater": 200, } - } + }, + "DisableNatPortMap": false } ``` diff --git a/examples/custom-libp2p/package.json b/examples/custom-libp2p/package.json index 8b18ac2411..93422cb3c5 100644 --- a/examples/custom-libp2p/package.json +++ b/examples/custom-libp2p/package.json @@ -11,7 +11,7 @@ "license": "MIT", "dependencies": { "ipfs": "^0.52.1", - "libp2p": "^0.29.3", + "libp2p": "libp2p/js-libp2p#feat/add-nat-manager", "libp2p-bootstrap": "^0.12.1", "libp2p-kad-dht": "^0.20.1", "libp2p-mdns": "^0.15.0", diff --git a/packages/ipfs-core/package.json b/packages/ipfs-core/package.json index fe37254dc6..9169487124 100644 --- a/packages/ipfs-core/package.json +++ b/packages/ipfs-core/package.json @@ -88,7 +88,7 @@ "it-first": "^1.0.4", "it-last": "^1.0.4", "it-pipe": "^1.1.0", - "libp2p": "^0.29.3", + "libp2p": "libp2p/js-libp2p#feat/add-nat-manager", "libp2p-bootstrap": "^0.12.1", "libp2p-crypto": "^0.18.0", "libp2p-floodsub": "^0.23.1", diff --git a/packages/ipfs-core/src/components/config.js b/packages/ipfs-core/src/components/config.js index d3319ab055..f04fd2b1cf 100644 --- a/packages/ipfs-core/src/components/config.js +++ b/packages/ipfs-core/src/components/config.js @@ -76,7 +76,7 @@ async function listProfiles (_options) { // eslint-disable-line require-await const profiles = { server: { - description: 'Recommended for nodes with public IPv4 address (servers, VPSes, etc.), disables host and content discovery in local networks.', + description: 'Recommended for nodes with public IPv4 address (servers, VPSes, etc.), disables host and content discovery and UPnP in local networks.', /** * @param {IPFSConfig} config * @returns {IPFSConfig} @@ -84,12 +84,16 @@ const profiles = { transform: (config) => { config.Discovery.MDNS.Enabled = false config.Discovery.webRTCStar.Enabled = false + config.Swarm = { + ...(config.Swarm || {}), + DisableNatPortMap: true + } return config } }, 'local-discovery': { - description: 'Sets default values to fields affected by `server` profile, enables discovery in local networks.', + description: 'Sets default values to fields affected by `server` profile, enables discovery and UPnP in local networks.', /** * @param {IPFSConfig} config * @returns {IPFSConfig} @@ -97,6 +101,10 @@ const profiles = { transform: (config) => { config.Discovery.MDNS.Enabled = true config.Discovery.webRTCStar.Enabled = true + config.Swarm = { + ...(config.Swarm || {}), + DisableNatPortMap: false + } return config } @@ -117,6 +125,10 @@ const profiles = { config.Bootstrap = [] config.Discovery.MDNS.Enabled = false config.Discovery.webRTCStar.Enabled = false + config.Swarm = { + ...(config.Swarm || {}), + DisableNatPortMap: true + } return config } @@ -137,6 +149,10 @@ const profiles = { config.Bootstrap = defaultConfig.Bootstrap config.Discovery.MDNS.Enabled = defaultConfig.Discovery.MDNS.Enabled config.Discovery.webRTCStar.Enabled = defaultConfig.Discovery.webRTCStar.Enabled + config.Swarm = { + ...(config.Swarm || {}), + DisableNatPortMap: false + } return config } @@ -453,6 +469,7 @@ module.exports.profiles = profiles * @typedef {Object} SwarmConfig * Options for configuring the swarm. * @property {ConnMgrConfig} [ConnMgr] + * @property {boolean} [DisableNatPortMap] * * @typedef {Object} ConnMgrConfig * The connection manager determines which and how many connections to keep and diff --git a/packages/ipfs-core/src/components/libp2p.js b/packages/ipfs-core/src/components/libp2p.js index 5086e40549..84e09daccd 100644 --- a/packages/ipfs-core/src/components/libp2p.js +++ b/packages/ipfs-core/src/components/libp2p.js @@ -98,6 +98,16 @@ function getLibp2pOptions ({ options, config, datastore, keys, keychainConfig, p pubsub: { enabled: get(options, 'config.Pubsub.Enabled', get(config, 'Pubsub.Enabled', true)) + }, + nat: { + enabled: get(options, 'nat.enabled', !get(config, 'Swarm.DisableNatPortMap', false)), + ttl: get(options, 'nat.ttl', 7200), + autoUpdate: get(options, 'nat.autoUpdate', true), + gateway: get(options, 'nat.gateway'), + externalIp: get(options, 'nat.externalIp'), + pmp: { + enabled: get(options, 'nat.pmp.enabled', false) + } } }, addresses: { diff --git a/packages/ipfs-core/src/components/start.js b/packages/ipfs-core/src/components/start.js index d421707ef4..9a3eed4f49 100644 --- a/packages/ipfs-core/src/components/start.js +++ b/packages/ipfs-core/src/components/start.js @@ -93,7 +93,10 @@ module.exports = ({ await libp2p.start() - libp2p.transportManager.getAddrs().forEach(ma => print(`Swarm listening on ${ma}/p2p/${peerId.toB58String()}`)) + Array.from(new Set([ + ...libp2p.transportManager.getAddrs().map(ma => ma.toString()), + ...libp2p.addressManager.getAnnounceAddrs().map(ma => ma.toString()) + ])).forEach(ma => print(`Swarm listening on ${ma}/p2p/${peerId.toB58String()}`)) const ipnsRouting = routingConfig({ libp2p, repo, peerId, options: constructorOptions }) const ipns = new IPNS(ipnsRouting, repo.datastore, peerId, keychain, { pass: initOptions.pass }) diff --git a/packages/ipfs-core/src/runtime/config-browser.js b/packages/ipfs-core/src/runtime/config-browser.js index 5793ac4acd..0c68a24d2f 100644 --- a/packages/ipfs-core/src/runtime/config-browser.js +++ b/packages/ipfs-core/src/runtime/config-browser.js @@ -41,7 +41,8 @@ module.exports = () => ({ ConnMgr: { LowWater: 200, HighWater: 500 - } + }, + DisableNatPortMap: true }, Routing: { Type: 'none' diff --git a/packages/ipfs-core/src/runtime/config-nodejs.js b/packages/ipfs-core/src/runtime/config-nodejs.js index 2c6e53b96d..5ed98ef44a 100644 --- a/packages/ipfs-core/src/runtime/config-nodejs.js +++ b/packages/ipfs-core/src/runtime/config-nodejs.js @@ -45,7 +45,8 @@ module.exports = () => ({ ConnMgr: { LowWater: 200, HighWater: 500 - } + }, + DisableNatPortMap: false }, Routing: { Type: 'none' diff --git a/packages/ipfs-core/src/runtime/libp2p-browser.js b/packages/ipfs-core/src/runtime/libp2p-browser.js index 0cbc337354..b7c9680c4f 100644 --- a/packages/ipfs-core/src/runtime/libp2p-browser.js +++ b/packages/ipfs-core/src/runtime/libp2p-browser.js @@ -59,6 +59,9 @@ module.exports = () => { pubsub: { enabled: true, emitSelf: true + }, + nat: { + enabled: false } }, metrics: { diff --git a/packages/ipfs-core/src/runtime/libp2p-nodejs.js b/packages/ipfs-core/src/runtime/libp2p-nodejs.js index cc90a492a6..43620356d4 100644 --- a/packages/ipfs-core/src/runtime/libp2p-nodejs.js +++ b/packages/ipfs-core/src/runtime/libp2p-nodejs.js @@ -63,6 +63,9 @@ module.exports = () => { pubsub: { enabled: true, emitSelf: true + }, + nat: { + enabled: true } }, metrics: { diff --git a/packages/ipfs-daemon/package.json b/packages/ipfs-daemon/package.json index f65449d4db..4a82ff0adf 100644 --- a/packages/ipfs-daemon/package.json +++ b/packages/ipfs-daemon/package.json @@ -37,7 +37,7 @@ "ipfs-http-server": "^0.1.3", "ipfs-utils": "^5.0.0", "just-safe-set": "^2.1.0", - "libp2p": "^0.29.3", + "libp2p": "libp2p/js-libp2p#feat/add-nat-manager", "libp2p-delegated-content-routing": "^0.8.0", "libp2p-delegated-peer-routing": "^0.8.0", "libp2p-webrtc-star": "^0.20.1", From 8ce86807af773717da50d059c789e1bbfda0e987 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Fri, 27 Nov 2020 12:10:12 +0000 Subject: [PATCH 2/6] chore: use libp2p.multiaddrs property instead of the transport manager --- packages/ipfs-core/src/components/id.js | 2 +- packages/ipfs-core/src/components/start.js | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/ipfs-core/src/components/id.js b/packages/ipfs-core/src/components/id.js index f319bf3e03..871e9287a5 100644 --- a/packages/ipfs-core/src/components/id.js +++ b/packages/ipfs-core/src/components/id.js @@ -29,7 +29,7 @@ module.exports = ({ peerId, libp2p }) => { if (libp2p) { // only available while the node is running - addresses = libp2p.transportManager.getAddrs() + addresses = libp2p.multiaddrs protocols = Array.from(libp2p.upgrader.protocols.keys()) } diff --git a/packages/ipfs-core/src/components/start.js b/packages/ipfs-core/src/components/start.js index 9a3eed4f49..1946509e98 100644 --- a/packages/ipfs-core/src/components/start.js +++ b/packages/ipfs-core/src/components/start.js @@ -93,10 +93,7 @@ module.exports = ({ await libp2p.start() - Array.from(new Set([ - ...libp2p.transportManager.getAddrs().map(ma => ma.toString()), - ...libp2p.addressManager.getAnnounceAddrs().map(ma => ma.toString()) - ])).forEach(ma => print(`Swarm listening on ${ma}/p2p/${peerId.toB58String()}`)) + libp2p.multiaddrs.forEach(ma => print(`Swarm listening on ${ma}/p2p/${peerId.toB58String()}`)) const ipnsRouting = routingConfig({ libp2p, repo, peerId, options: constructorOptions }) const ipns = new IPNS(ipnsRouting, repo.datastore, peerId, keychain, { pass: initOptions.pass }) From a98abeb763e5349b6d79489af0224adbfcefebab Mon Sep 17 00:00:00 2001 From: achingbrain Date: Fri, 27 Nov 2020 12:39:07 +0000 Subject: [PATCH 3/6] chore: increase bundle size --- packages/ipfs-core/.aegir.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ipfs-core/.aegir.js b/packages/ipfs-core/.aegir.js index a11af408f4..47743a8f9d 100644 --- a/packages/ipfs-core/.aegir.js +++ b/packages/ipfs-core/.aegir.js @@ -8,7 +8,7 @@ let preloadNode = MockPreloadNode.createNode() let ipfsdServer module.exports = { - bundlesize: { maxSize: '524kB' }, + bundlesize: { maxSize: '527kB' }, karma: { files: [{ pattern: 'node_modules/interface-ipfs-core/test/fixtures/**/*', From 8921d087d3241cb6913b11c61b47028567175bd5 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Fri, 27 Nov 2020 13:59:04 +0000 Subject: [PATCH 4/6] chore: correct gh url --- examples/custom-libp2p/package.json | 2 +- packages/ipfs-core/package.json | 2 +- packages/ipfs-daemon/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/custom-libp2p/package.json b/examples/custom-libp2p/package.json index 93422cb3c5..b7ec0f4b6c 100644 --- a/examples/custom-libp2p/package.json +++ b/examples/custom-libp2p/package.json @@ -11,7 +11,7 @@ "license": "MIT", "dependencies": { "ipfs": "^0.52.1", - "libp2p": "libp2p/js-libp2p#feat/add-nat-manager", + "libp2p": "libp2p/js-libp2p#feat/add-upnp-nat-manager", "libp2p-bootstrap": "^0.12.1", "libp2p-kad-dht": "^0.20.1", "libp2p-mdns": "^0.15.0", diff --git a/packages/ipfs-core/package.json b/packages/ipfs-core/package.json index 9169487124..f9203756ec 100644 --- a/packages/ipfs-core/package.json +++ b/packages/ipfs-core/package.json @@ -88,7 +88,7 @@ "it-first": "^1.0.4", "it-last": "^1.0.4", "it-pipe": "^1.1.0", - "libp2p": "libp2p/js-libp2p#feat/add-nat-manager", + "libp2p": "libp2p/js-libp2p#feat/add-upnp-nat-manager", "libp2p-bootstrap": "^0.12.1", "libp2p-crypto": "^0.18.0", "libp2p-floodsub": "^0.23.1", diff --git a/packages/ipfs-daemon/package.json b/packages/ipfs-daemon/package.json index 4a82ff0adf..97e945cc02 100644 --- a/packages/ipfs-daemon/package.json +++ b/packages/ipfs-daemon/package.json @@ -37,7 +37,7 @@ "ipfs-http-server": "^0.1.3", "ipfs-utils": "^5.0.0", "just-safe-set": "^2.1.0", - "libp2p": "libp2p/js-libp2p#feat/add-nat-manager", + "libp2p": "libp2p/js-libp2p#feat/add-upnp-nat-manager", "libp2p-delegated-content-routing": "^0.8.0", "libp2p-delegated-peer-routing": "^0.8.0", "libp2p-webrtc-star": "^0.20.1", From fe7287eb9a1848ae1e476581585a52865be54b05 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Tue, 1 Dec 2020 15:12:28 +0000 Subject: [PATCH 5/6] chore: override upnp port description --- packages/ipfs-core/src/runtime/libp2p-nodejs.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ipfs-core/src/runtime/libp2p-nodejs.js b/packages/ipfs-core/src/runtime/libp2p-nodejs.js index 43620356d4..cb72c3cfe8 100644 --- a/packages/ipfs-core/src/runtime/libp2p-nodejs.js +++ b/packages/ipfs-core/src/runtime/libp2p-nodejs.js @@ -8,6 +8,7 @@ const GossipSub = require('libp2p-gossipsub') const Multiplex = require('libp2p-mplex') const { NOISE } = require('libp2p-noise') const ipnsUtils = require('../ipns/routing/utils') +const os = require('os') module.exports = () => { return { @@ -65,7 +66,8 @@ module.exports = () => { emitSelf: true }, nat: { - enabled: true + enabled: true, + description: `ipfs@${os.hostname()}` } }, metrics: { From a6d0317be1f80f9007848b8bc5aca78e307571ea Mon Sep 17 00:00:00 2001 From: achingbrain Date: Fri, 29 Jan 2021 13:44:36 +0000 Subject: [PATCH 6/6] chore: merge master --- packages/ipfs-core/src/components/network.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ipfs-core/src/components/network.js b/packages/ipfs-core/src/components/network.js index b22855ec6b..be8111af99 100644 --- a/packages/ipfs-core/src/components/network.js +++ b/packages/ipfs-core/src/components/network.js @@ -44,7 +44,7 @@ class Network { await libp2p.start() - for (const ma of libp2p.transportManager.getAddrs()) { + for (const ma of libp2p.multiaddrs) { print(`Swarm listening on ${ma}/p2p/${peerId.toB58String()}`) }