Documentation
¶
Overview ¶
Package wgipam implements an IP Address Management (IPAM) system for dynamic IP address assignment to WireGuard peers, using the wg-dynamic protocol.
For more information about wg-dynamic, please see: https://git.zx2c4.com/wg-dynamic/about/.
This project is not affiliated with the WireGuard or wg-dynamic projects.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Family ¶
type Family int
A Family specifies one or more IP address families, such as IPv4, IPv6, or DualStack.
type HTTPHandler ¶
type HTTPHandler struct {
// contains filtered or unexported fields
}
A HTTPHandler provides the HTTP debug API handler for wgipamd.
func NewHTTPHandler ¶
func NewHTTPHandler( usePrometheus, usePProf bool, reg *prometheus.Registry, stores map[string]Store, ) *HTTPHandler
NewHTTPHandler creates a HTTPHandler with the specified configuration.
func (*HTTPHandler) ServeHTTP ¶
func (h *HTTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
type Handler ¶
type Handler struct {
// Leases specifies a Store for Lease storage. Leases must be non-nil or
// the Handler will panic.
Leases LeaseStore
// IPs specifies an IPAllocator for allocating and freeing client addresses.
// IPs must be non-nil or the Handler will panic.
IPs IPAllocator
// LeaseDuration specifies the amount of time leases may exist before they
// expire and are purged.
LeaseDuration time.Duration
// Log specifies a logger for the Server. If nil, all logs are discarded.
Log *log.Logger
// Metrics specifies Prometheus metrics for the Handler. If nil, metrics
// are not collected.
Metrics *HandlerMetrics
// NewRequest specifies an optional hook which will be invoked when a new
// request is received. The source address src of the remote client is
// passed to NewRequest. If NewRequest is nil, it is a no-op.
NewRequest func(src net.Addr)
}
A Handler handles IP allocation requests using the wg-dynamic protocol.
type HandlerMetrics ¶
type HandlerMetrics struct {
RequestsTotal *prometheus.CounterVec
ErrorsTotal *prometheus.CounterVec
}
HandlerMetrics contains metrics related to Handler operations.
func NewHandlerMetrics ¶
func NewHandlerMetrics(reg *prometheus.Registry, ifi string) *HandlerMetrics
NewHandlerMetrics produces a HandlerMetrics structure which registers its metrics with reg and adds an interface label ifi.
type IPAllocator ¶
type IPAllocator interface {
// Allocate allocates an available IP address from each underlying subnet
// which matches the input Family. It returns false if one or more of the
// subnets ran out of IP addresses during allocation.
Allocate(family Family) (ips []*net.IPNet, ok bool, err error)
// Free returns an allocated IP address to the IPAllocator. Free operations
// should be idempotent; that is, an error should only be returned if the
// free operation fails. Attempting to free an IP that did not already exist
// should not return an error.
Free(ip *net.IPNet) error
}
An IPAllocator can allocate IP addresses from one or more subnets.
func DualStackIPAllocator ¶
func DualStackIPAllocator(store IPStore, subnets []Subnet) (IPAllocator, error)
DualStackIPAllocator returns an IPAllocator which can allocate both IPv4 and IPv6 addresses. It is a convenience wrapper around other IPAllocators that automatically allocates addresses from the input subnets as appropriate.
func SimpleIPAllocator ¶
func SimpleIPAllocator(store IPStore, subnet Subnet) (IPAllocator, error)
SimpleIPAllocator returns an IPAllocator which allocates IP addresses in order by iterating through addresses in a subnet.
type IPStore ¶
type IPStore interface {
// Subnets returns all existing subnets. Note that the order of the subnets
// is unspecified. The caller must sort the leases for deterministic output.
Subnets() (subnets []*net.IPNet, err error)
// SaveSubnet creates or updates a Subnet by its CIDR value.
SaveSubnet(subnet *net.IPNet) error
// AllocatedIPs returns all of the IP addresses allocated within a specific
// subnet. Note that the order of the addresses is unspecified. The caller
// must sort the addresses for deterministic output.
AllocatedIPs(subnet *net.IPNet) (ips []*net.IPNet, err error)
// AllocateIP allocates an IP address from the specified subnet. It returns
// false if the address is already allocated from the subnet, and returns an
// error if the subnet does not exist.
AllocateIP(subnet, ip *net.IPNet) (ok bool, err error)
// FreeIP frees an allocated IP address in the specified subnet. FreeIP
// operations should be idempotent; the same rules apply as with DeleteLease.
// It returns an error if the subnet does not exist.
FreeIP(subnet, ip *net.IPNet) error
}
An IPStore manages IP address allocation and storage.
type Lease ¶
A Lease is a record of allocated IP addresses assigned to a client.
type LeaseStore ¶
type LeaseStore interface {
// Leases returns all existing Leases. Note that the order of the Leases
// is unspecified. The caller must sort the leases for deterministic output.
Leases() (leases []*Lease, err error)
// Lease returns the Lease identified by key. It returns false if no
// Lease exists for key.
Lease(key uint64) (lease *Lease, ok bool, err error)
// SaveLease creates or updates a Lease by key.
SaveLease(key uint64, lease *Lease) error
// DeleteLease deletes a Lease by key. Delete operations should be idempotent;
// that is, an error should only be returned if the delete operation fails.
// Attempting to delete an item that did not already exist should not
// return an error.
DeleteLease(key uint64) error
}
A LeaseStore manages Lease storage.
type PurgeStats ¶
type PurgeStats struct {
// FreedIPs contains a map of subnet CIDRs to the number of IP addresses
// that were freed within that subnet.
FreedIPs map[string]int
}
PurgeStats contains statistics returned from a Store's Purge operation.
type Store ¶
type Store interface {
// Close syncs and closes the Store's internal state.
io.Closer
// Purge purge Leases which expire on or before the specified point in time,
// and frees the IP addresses associated with the leases.
// Purge operations that specify the same point in time should be
// idempotent; the same rules apply as with DeleteLease.
Purge(t time.Time) (*PurgeStats, error)
LeaseStore
IPStore
}
A Store manages Leases and IP allocations. To ensure compliance with the expected behaviors of the Store interface, use the wgipamtest.TestStore function.
func IPStoreMetrics ¶
func IPStoreMetrics(reg *prometheus.Registry, ifi string, subnets []Subnet, ips Store) (Store, error)
IPStoreMetrics produces a Store which gathers Prometheus metrics for IPStore operations.
func MemoryStore ¶
func MemoryStore() Store
MemoryStore returns a Store which stores data in memory.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
cmd
|
|
|
wgipamd
command
Command wgipamd implements an IP Address Management (IPAM) daemon for dynamic IP address assignment to WireGuard peers, using the wg-dynamic protocol.
|
Command wgipamd implements an IP Address Management (IPAM) daemon for dynamic IP address assignment to WireGuard peers, using the wg-dynamic protocol. |
|
internal
|
|
|
config
Package config provides configuration file support for the wgipamd server.
|
Package config provides configuration file support for the wgipamd server. |
|
wgipamd
Package wgipamd implements package main logic for the wgipamd server.
|
Package wgipamd implements package main logic for the wgipamd server. |
|
Package wgipamtest provides testing facilities for wgipamd types.
|
Package wgipamtest provides testing facilities for wgipamd types. |