diff --git a/core/node/groups.go b/core/node/groups.go index 930a2151bef..987ac9e2857 100644 --- a/core/node/groups.go +++ b/core/node/groups.go @@ -9,8 +9,8 @@ import ( blockstore "github.com/ipfs/go-ipfs-blockstore" config "github.com/ipfs/go-ipfs-config" util "github.com/ipfs/go-ipfs-util" - log "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-core/peer" + "github.com/ipfs/go-log" + "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/ipfs/go-ipfs/core/node/libp2p" @@ -109,17 +109,17 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config) fx.Option { autonat = fx.Provide(libp2p.AutoNATService(cfg.AutoNAT.Throttle)) } - // If `cfg.Swarm.DisableRelay` is set and `Network.Relay` isn't, use the former. - enableRelay := cfg.Swarm.Transports.Network.Relay.WithDefault(!cfg.Swarm.DisableRelay) //nolint + // If `cfg.Swarm.DisableRelay` is set and `Network.RelayTransport` isn't, use the former. + enableRelayTransport := cfg.Swarm.Transports.Network.Relay.WithDefault(!cfg.Swarm.DisableRelay) //nolint // Warn about a deprecated option. //nolint if cfg.Swarm.DisableRelay { logger.Error("The `Swarm.DisableRelay' config field is deprecated.") - if enableRelay { - logger.Error("`Swarm.DisableRelay' has been overridden by `Swarm.Transports.Network.Relay'") + if enableRelayTransport { + logger.Error("`Swarm.DisableRelay' has been overridden by `Swarm.Transports.Network.RelayTransport'") } else { - logger.Error("Use the `Swarm.Transports.Network.Relay' config field instead") + logger.Error("Use the `Swarm.Transports.Network.RelayTransport' config field instead") } } @@ -130,7 +130,8 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config) fx.Option { fx.Provide(libp2p.AddrFilters(cfg.Swarm.AddrFilters)), fx.Provide(libp2p.AddrsFactory(cfg.Addresses.Announce, cfg.Addresses.NoAnnounce)), fx.Provide(libp2p.SmuxTransport(cfg.Swarm.Transports)), - fx.Provide(libp2p.Relay(enableRelay, cfg.Swarm.EnableRelayHop)), + fx.Provide(libp2p.RelayTransport(enableRelayTransport)), + fx.Provide(libp2p.RelayService(!cfg.Swarm.DisableRelayService, cfg.Swarm.RelayServiceOpts)), fx.Provide(libp2p.Transports(cfg.Swarm.Transports)), fx.Invoke(libp2p.StartListening(cfg.Addresses.Swarm)), fx.Invoke(libp2p.SetupDiscovery(cfg.Discovery.MDNS.Enabled, cfg.Discovery.MDNS.Interval)), diff --git a/core/node/libp2p/relay.go b/core/node/libp2p/relay.go index 224e545b238..944bff0ad26 100644 --- a/core/node/libp2p/relay.go +++ b/core/node/libp2p/relay.go @@ -1,13 +1,17 @@ package libp2p import ( + "time" + + config "github.com/ipfs/go-ipfs-config" + "github.com/libp2p/go-libp2p" + "github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/relay" ) -func Relay(enableRelay, enableHop bool) func() (opts Libp2pOpts, err error) { +func RelayTransport(enableRelay bool) func() (opts Libp2pOpts, err error) { return func() (opts Libp2pOpts, err error) { if enableRelay { - // TODO: enable relay v2 opts.Opts = append(opts.Opts, libp2p.EnableRelay()) } else { opts.Opts = append(opts.Opts, libp2p.DisableRelay()) @@ -16,4 +20,41 @@ func Relay(enableRelay, enableHop bool) func() (opts Libp2pOpts, err error) { } } +func RelayService(enable bool, relayOpts config.RelayResources) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + if enable { + r := relay.DefaultResources() + if relayOpts.Limit.Data > 0 { + r.Limit.Data = relayOpts.Limit.Data + } + if relayOpts.Limit.Duration > 0 { + r.Limit.Duration = time.Duration(relayOpts.Limit.Duration) + } + if relayOpts.MaxCircuits > 0 { + r.MaxCircuits = relayOpts.MaxCircuits + } + if relayOpts.BufferSize > 0 { + r.BufferSize = relayOpts.BufferSize + } + if relayOpts.ReservationTTL > 0 { + r.ReservationTTL = time.Duration(relayOpts.ReservationTTL) + } + if relayOpts.MaxReservations > 0 { + r.MaxReservations = relayOpts.MaxReservations + } + if relayOpts.MaxReservationsPerIP > 0 { + r.MaxReservationsPerIP = relayOpts.MaxReservationsPerIP + } + if relayOpts.MaxReservationsPerPeer > 0 { + r.MaxReservationsPerPeer = relayOpts.MaxReservationsPerPeer + } + if relayOpts.MaxReservationsPerASN > 0 { + r.MaxReservationsPerASN = relayOpts.MaxReservationsPerASN + } + opts.Opts = append(opts.Opts, libp2p.EnableRelayService(relay.WithResources(r))) + } + return + } +} + var AutoRelay = simpleOpt(libp2p.ChainOptions(libp2p.EnableAutoRelay(), libp2p.DefaultStaticRelays())) diff --git a/docs/config.md b/docs/config.md index ae39a3f88ca..05df3a7317a 100644 --- a/docs/config.md +++ b/docs/config.md @@ -100,7 +100,18 @@ config file at runtime. - [`Swarm.DisableBandwidthMetrics`](#swarmdisablebandwidthmetrics) - [`Swarm.DisableNatPortMap`](#swarmdisablenatportmap) - [`Swarm.DisableRelay`](#swarmdisablerelay) - - [`Swarm.EnableRelayHop`](#swarmenablerelayhop) + - [`Swarm.DisableRelayService`](#swarmdisablerelayservice) + - [`Swarm.RelayServiceOpts`](#swarmrelayserviceopts) + - [`Swarm.RelayServiceOpts.Limit`](#swarmrelayserviceoptslimit) + - [`Swarm.RelayServiceOpts.Limit.Duration`](#swarmrelayserviceoptslimitduration) + - [`Swarm.RelayServiceOpts.Limit.Data`](#swarmrelayserviceoptslimitdata) + - [`Swarm.RelayServiceOpts.ReservationTTL`](#swarmrelayserviceoptsreservationttl) + - [`Swarm.RelayServiceOpts.MaxReservations`](#swarmrelayserviceoptsmaxreservations) + - [`Swarm.RelayServiceOpts.MaxCircuits`](#swarmrelayserviceoptsmaxcircuits) + - [`Swarm.RelayServiceOpts.BufferSize`](#swarmrelayserviceoptsbuffersize) + - [`Swarm.RelayServiceOpts.MaxReservationsPerPeer`](#swarmrelayserviceoptsmaxreservationsperpeer) + - [`Swarm.RelayServiceOpts.MaxReservationsPerIP`](#swarmrelayserviceoptsmaxreservationsperip) + - [`Swarm.RelayServiceOpts.MaxReservationsPerASN`](#swarmrelayserviceoptsmaxreservationsperasn) - [`Swarm.EnableAutoRelay`](#swarmenableautorelay) - [Mode 1: `EnableRelayHop` is `false`](#mode-1-enablerelayhop-is-false) - [Mode 2: `EnableRelayHop` is `true`](#mode-2-enablerelayhop-is-true) @@ -1280,18 +1291,128 @@ Default: `false` Type: `bool` -### `Swarm.EnableRelayHop` - -Configures this node to act as a relay "hop". A relay "hop" relays traffic for other peers. +### `Swarm.DisableRelayService` -WARNING: Do not enable this option unless you know what you're doing. Other -peers will randomly decide to use your node as a relay and consume _all_ -available bandwidth. There is _no_ rate-limiting. +Disables the p2p-circuit v2 relay service. This will prevent this node from +running as a relay server. Default: `false` Type: `bool` +### `Swarm.RelayServiceOpts` + +Configuration options for the relay service. + +Default: `{}` + +Type: `object` + +#### `Swarm.RelayServiceOpts.Limit` + +Limits applied to every relayed connection. + +Default: `{}` + +Type: `object[string -> string]` + +##### `Swarm.RelayServiceOpts.Limit.Duration` + +Time limit before a relayed connection is reset. + +Default: `2m` + +Type: `string` + + +##### `Swarm.RelayServiceOpts.Limit.Duration` + +Time limit before a relayed connection is reset. + +Default: `2m` + +Type: `string` + + +##### `Swarm.RelayServiceOpts.Limit.Data` + +Limit of data relayed (in each direction) before a relayed connection is reset. + +Default: `131072` (128 kb) + +Type: `integer` + + +#### `Swarm.RelayServiceOpts.ReservationTTL` + +Duration of a new or refreshed reservation. + +Default: `1h` + +Type: `string` + + +#### `Swarm.RelayServiceOpts.MaxReservations` + +Maximum number of active relay slots. + +Default: `128` + +Type: `integer` + + +#### `Swarm.RelayServiceOpts.MaxReservations` + +Maximum number of open relay connections for each peer. + +Default: `16` + +Type: `integer` + + +#### `Swarm.RelayServiceOpts.BufferSize` + +Size of the relayed connection buffers. + +Default: `2048` + +Type: `integer` + + +#### `Swarm.RelayServiceOpts.MaxReservationsPerPeer` + +Maximum number of reservations originating from the same peer. + +Default: `4` + +Type: `integer` + + +#### `Swarm.RelayServiceOpts.MaxReservationsPerIP` + +Maximum number of reservations originating from the same IP. + +Default: `8` + +Type: `integer` + + +#### `Swarm.RelayServiceOpts.MaxReservationsPerASN` + +Maximum number of reservations originating from the same ASN. + +Default: `32` + +Type: `integer` + + +### `Swarm.EnableRelayHop` + +**REMOVED** + +Please use [`Swarm.DisableRelayService`][]. + + ### `Swarm.EnableAutoRelay` Enables "automatic relay" mode for this node. This option does two _very_ @@ -1302,23 +1423,10 @@ Default: `false` Type: `bool` -#### Mode 1: `EnableRelayHop` is `false` - -If `Swarm.EnableAutoRelay` is enabled and `Swarm.EnableRelayHop` is disabled, -your node will automatically _use_ public relays from the network if it detects +Your node will automatically _use_ public relays from the network if it detects that it cannot be reached from the public internet (e.g., it's behind a firewall). This is likely the feature you're looking for. -If you enable `EnableAutoRelay`, you should almost certainly disable -`EnableRelayHop`. - -#### Mode 2: `EnableRelayHop` is `true` - -If `EnableAutoRelay` is enabled and `EnableRelayHop` is enabled, your node will -_act_ as a public relay for the network. Furthermore, in addition to simply -relaying traffic, your node will advertise itself as a public relay. Unless you -have the bandwidth of a small ISP, do not enable both of these options at the -same time. ### `Swarm.EnableAutoNATService` diff --git a/docs/examples/go-ipfs-as-a-library/go.mod b/docs/examples/go-ipfs-as-a-library/go.mod index a933241b72b..28c407239aa 100644 --- a/docs/examples/go-ipfs-as-a-library/go.mod +++ b/docs/examples/go-ipfs-as-a-library/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( github.com/ipfs/go-ipfs v0.9.1 - github.com/ipfs/go-ipfs-config v0.16.0 + github.com/ipfs/go-ipfs-config v0.16.1-0.20211018130411-0226122eaf22 github.com/ipfs/go-ipfs-files v0.0.9 github.com/ipfs/interface-go-ipfs-core v0.5.1 github.com/libp2p/go-libp2p-core v0.11.0 diff --git a/docs/examples/go-ipfs-as-a-library/go.sum b/docs/examples/go-ipfs-as-a-library/go.sum index 98c876085e6..b179057d8a0 100644 --- a/docs/examples/go-ipfs-as-a-library/go.sum +++ b/docs/examples/go-ipfs-as-a-library/go.sum @@ -450,8 +450,8 @@ github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcB github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= -github.com/ipfs/go-ipfs-config v0.16.0 h1:CBtIYyp/iWIczCv83bmfge8EA2KqxOOfqmETs3tUnnU= -github.com/ipfs/go-ipfs-config v0.16.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= +github.com/ipfs/go-ipfs-config v0.16.1-0.20211018130411-0226122eaf22 h1:oaJFYaZpyJ3U6GSnn3+M3yH/++78jrns2xSZp4kWWe4= +github.com/ipfs/go-ipfs-config v0.16.1-0.20211018130411-0226122eaf22/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= diff --git a/go.mod b/go.mod index 98ffa76a33c..e3183888360 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/ipfs/go-ipfs-blockstore v0.1.6 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-cmds v0.6.0 - github.com/ipfs/go-ipfs-config v0.16.0 + github.com/ipfs/go-ipfs-config v0.16.1-0.20211018130411-0226122eaf22 github.com/ipfs/go-ipfs-exchange-interface v0.0.1 github.com/ipfs/go-ipfs-exchange-offline v0.0.1 github.com/ipfs/go-ipfs-files v0.0.9 @@ -66,7 +66,6 @@ require ( github.com/jbenet/goprocess v0.1.4 github.com/libp2p/go-doh-resolver v0.3.1 github.com/libp2p/go-libp2p v0.15.0-rc.1.0.20211021081216-db8f9c6fddb5 - github.com/libp2p/go-libp2p-circuit v0.4.0 github.com/libp2p/go-libp2p-connmgr v0.2.4 github.com/libp2p/go-libp2p-core v0.11.0 github.com/libp2p/go-libp2p-discovery v0.5.1 diff --git a/go.sum b/go.sum index 17ac6f566f5..a1707351ce3 100644 --- a/go.sum +++ b/go.sum @@ -463,8 +463,8 @@ github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7Na github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= github.com/ipfs/go-ipfs-cmds v0.6.0 h1:yAxdowQZzoFKjcLI08sXVNnqVj3jnABbf9smrPQmBsw= github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= -github.com/ipfs/go-ipfs-config v0.16.0 h1:CBtIYyp/iWIczCv83bmfge8EA2KqxOOfqmETs3tUnnU= -github.com/ipfs/go-ipfs-config v0.16.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= +github.com/ipfs/go-ipfs-config v0.16.1-0.20211018130411-0226122eaf22 h1:oaJFYaZpyJ3U6GSnn3+M3yH/++78jrns2xSZp4kWWe4= +github.com/ipfs/go-ipfs-config v0.16.1-0.20211018130411-0226122eaf22/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=