addressmanager

package
v0.13.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 26, 2023 License: ISC Imports: 16 Imported by: 10

Documentation

Overview

Package addressmanager implements concurrency safe Pyrin address manager.

Address Manager Overview

In order maintain the peer-to-peer Pyrin network, there needs to be a source of addresses to connect to as nodes come and go. The Pyrin protocol provides the getaddr and addr messages to allow peers to communicate known addresses with each other. However, there needs to a mechanism to store those results and select peers from them. It is also important to note that remote peers can't be trusted to send valid peers nor attempt to provide you with only peers they control with malicious intent.

With that in mind, this package provides a concurrency safe address manager for caching and selecting peers in a non-deterministic manner. The general idea is the caller adds addresses to the address manager and notifies it when addresses are connected, known good, and attempted. The caller also requests addresses as it needs them.

The address manager internally segregates the addresses into groups and non-deterministically selects groups in a cryptographically random manner. This reduce the chances multiple addresses from the same nets are selected which generally helps provide greater peer diversity, and perhaps more importantly, drastically reduces the chances an attacker is able to coerce your peer into only connecting to nodes they control.

The address manager also understands routability and tries hard to only return routable addresses. In addition, it uses the information provided by the caller about connected, known good, and attempted addresses to periodically purge peers which no longer appear to be good peers as well as bias the selection toward known good peers. The general idea is to make a best effort at only providing usable addresses.

Index

Constants

View Source
const (
	// GetAddressesMax is the most addresses that we will send in response
	// to a getAddress (in practise the most addresses we will return from a
	// call to AddressCache()).
	GetAddressesMax = 2500
)

Variables

View Source
var ErrAddressNotFound = errors.New("address not found")

ErrAddressNotFound is an error returned from some functions when a given address is not found in the address manager

Functions

func AddAddressByIP

func AddAddressByIP(am *AddressManager, addressIP string, subnetworkID *externalapi.DomainSubnetworkID) error

AddAddressByIP adds an address where we are given an ip:port and not a appmessage.NetAddress.

func IsIPv4

func IsIPv4(na *appmessage.NetAddress) bool

IsIPv4 returns whether or not the given address is an IPv4 address.

func IsLocal

func IsLocal(na *appmessage.NetAddress) bool

IsLocal returns whether or not the given address is a local address.

func IsRFC1918

func IsRFC1918(na *appmessage.NetAddress) bool

IsRFC1918 returns whether or not the passed address is part of the IPv4 private network address space as defined by RFC1918 (10.0.0.0/8, 172.16.0.0/12, or 192.168.0.0/16).

func IsRFC2544

func IsRFC2544(na *appmessage.NetAddress) bool

IsRFC2544 returns whether or not the passed address is part of the IPv4 address space as defined by RFC2544 (198.18.0.0/15)

func IsRFC3849

func IsRFC3849(na *appmessage.NetAddress) bool

IsRFC3849 returns whether or not the passed address is part of the IPv6 documentation range as defined by RFC3849 (2001:DB8::/32).

func IsRFC3927

func IsRFC3927(na *appmessage.NetAddress) bool

IsRFC3927 returns whether or not the passed address is part of the IPv4 autoconfiguration range as defined by RFC3927 (169.254.0.0/16).

func IsRFC3964

func IsRFC3964(na *appmessage.NetAddress) bool

IsRFC3964 returns whether or not the passed address is part of the IPv6 to IPv4 encapsulation range as defined by RFC3964 (2002::/16).

func IsRFC4193

func IsRFC4193(na *appmessage.NetAddress) bool

IsRFC4193 returns whether or not the passed address is part of the IPv6 unique local range as defined by RFC4193 (FC00::/7).

func IsRFC4380

func IsRFC4380(na *appmessage.NetAddress) bool

IsRFC4380 returns whether or not the passed address is part of the IPv6 teredo tunneling over UDP range as defined by RFC4380 (2001::/32).

func IsRFC4843

func IsRFC4843(na *appmessage.NetAddress) bool

IsRFC4843 returns whether or not the passed address is part of the IPv6 ORCHID range as defined by RFC4843 (2001:10::/28).

func IsRFC4862

func IsRFC4862(na *appmessage.NetAddress) bool

IsRFC4862 returns whether or not the passed address is part of the IPv6 stateless address autoconfiguration range as defined by RFC4862 (FE80::/64).

func IsRFC5737

func IsRFC5737(na *appmessage.NetAddress) bool

IsRFC5737 returns whether or not the passed address is part of the IPv4 documentation address space as defined by RFC5737 (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24)

func IsRFC6052

func IsRFC6052(na *appmessage.NetAddress) bool

IsRFC6052 returns whether or not the passed address is part of the IPv6 well-known prefix range as defined by RFC6052 (64:FF9B::/96).

func IsRFC6145

func IsRFC6145(na *appmessage.NetAddress) bool

IsRFC6145 returns whether or not the passed address is part of the IPv6 to IPv4 translated address range as defined by RFC6145 (::FFFF:0:0:0/96).

func IsRFC6598

func IsRFC6598(na *appmessage.NetAddress) bool

IsRFC6598 returns whether or not the passed address is part of the IPv4 shared address space specified by RFC6598 (100.64.0.0/10)

func IsRoutable

func IsRoutable(na *appmessage.NetAddress, acceptUnroutable bool) bool

IsRoutable returns whether or not the passed address is routable over the public internet. This is true as long as the address is valid and is not in any reserved ranges.

func IsValid

func IsValid(na *appmessage.NetAddress) bool

IsValid returns whether or not the passed address is valid. The address is considered invalid under the following circumstances: IPv4: It is either a zero or all bits set address. IPv6: It is either a zero or RFC3849 documentation address.

Types

type AddressManager

type AddressManager struct {
	// contains filtered or unexported fields
}

AddressManager provides a concurrency safe address manager for caching potential peers on the Pyrin network.

func New

func New(cfg *Config, database database.Database) (*AddressManager, error)

New returns a new Pyrin address manager.

func (*AddressManager) AddAddress

func (am *AddressManager) AddAddress(address *appmessage.NetAddress) error

AddAddress adds address to the address manager

func (*AddressManager) AddAddresses

func (am *AddressManager) AddAddresses(addresses ...*appmessage.NetAddress) error

AddAddresses adds addresses to the address manager

func (*AddressManager) Addresses

func (am *AddressManager) Addresses() []*appmessage.NetAddress

Addresses returns all addresses

func (*AddressManager) Ban

func (am *AddressManager) Ban(addressToBan *appmessage.NetAddress) error

Ban marks the given address as banned

func (*AddressManager) BannedAddresses

func (am *AddressManager) BannedAddresses() []*appmessage.NetAddress

BannedAddresses returns all banned addresses

func (*AddressManager) BestLocalAddress

func (am *AddressManager) BestLocalAddress(remoteAddress *appmessage.NetAddress) *appmessage.NetAddress

BestLocalAddress returns the most appropriate local address to use for the given remote address.

func (*AddressManager) GroupKey

func (am *AddressManager) GroupKey(na *appmessage.NetAddress) string

GroupKey returns a string representing the network group an address is part of. This is the /16 for IPv4, the /32 (/36 for he.net) for IPv6, the string "local" for a local address, and the string "unroutable" for an unroutable address.

func (*AddressManager) IsBanned

func (am *AddressManager) IsBanned(address *appmessage.NetAddress) (bool, error)

IsBanned returns true if the given address is marked as banned

func (*AddressManager) MarkConnectionFailure

func (am *AddressManager) MarkConnectionFailure(address *appmessage.NetAddress) error

MarkConnectionFailure notifies the address manager that the given address has failed to connect

func (*AddressManager) MarkConnectionSuccess

func (am *AddressManager) MarkConnectionSuccess(address *appmessage.NetAddress) error

MarkConnectionSuccess notifies the address manager that the given address has successfully connected

func (*AddressManager) RandomAddresses

func (am *AddressManager) RandomAddresses(count int, exceptions []*appmessage.NetAddress) []*appmessage.NetAddress

RandomAddresses returns count addresses at random that aren't banned and aren't in exceptions

func (*AddressManager) RemoveAddress

func (am *AddressManager) RemoveAddress(address *appmessage.NetAddress) error

RemoveAddress removes addresses from the address manager

func (*AddressManager) Unban

func (am *AddressManager) Unban(address *appmessage.NetAddress) error

Unban unmarks the given address as banned

type AddressPriority

type AddressPriority int

AddressPriority type is used to describe the hierarchy of local address discovery methods.

const (
	// InterfacePrio signifies the address is on a local interface
	InterfacePrio AddressPriority = iota

	// BoundPrio signifies the address has been explicitly bounded to.
	BoundPrio

	// UpnpPrio signifies the address was obtained from UPnP.
	UpnpPrio

	// HTTPPrio signifies the address was obtained from an external HTTP service.
	HTTPPrio

	// ManualPrio signifies the address was provided by --externalip.
	ManualPrio
)

type AddressRandomize

type AddressRandomize struct {
	// contains filtered or unexported fields
}

AddressRandomize implement addressRandomizer interface

func NewAddressRandomize

func NewAddressRandomize(maxFailedCount uint64) *AddressRandomize

NewAddressRandomize returns a new RandomizeAddress.

func (*AddressRandomize) RandomAddresses

func (amc *AddressRandomize) RandomAddresses(addresses []*address, count int) []*appmessage.NetAddress

RandomAddresses returns count addresses at random from input list

type Config

type Config struct {
	AcceptUnroutable bool
	DefaultPort      string
	ExternalIPs      []string
	Listeners        []string
	Lookup           func(string) ([]net.IP, error)
}

Config is a descriptor which specifies the AddressManager instance configuration.

func NewConfig

func NewConfig(cfg *config.Config) *Config

NewConfig returns a new address manager Config.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL