123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- // Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC")
- //
- // Permission to use, copy, modify, and/or distribute this software for any
- // purpose with or without fee is hereby granted, provided that the above
- // copyright notice and this permission notice appear in all copies.
- //
- // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- // PERFORMANCE OF THIS SOFTWARE.
- /**
- @page libdhcpsrv libdhcpsrv - Server DHCP library
- This library contains code useful for DHCPv4 and DHCPv6 server operations, like
- Lease Manager that stores leases information, configuration manager that stores
- configuration etc. The code here is server specific. For generic (useful in
- server, client, relay and other tools like perfdhcp) code, please see
- \ref libdhcp.
- This library contains several crucial elements of the DHCP server operation:
- - isc::dhcp::LeaseMgr - Lease Manager is a name for database backend that stores
- leases.
- - isc::dhcp::CfgMgr - Configuration Manager that holds DHCP specific
- configuration information (subnets, pools, options, timer values etc.) in
- easy to use format.
- - AllocEngine - allocation engine that handles new requestes and allocates new
- leases.
- @section leasemgr Lease Manager
- LeaseMgr provides a common, unified abstract API for all database backends. All
- backends are derived from the base class isc::dhcp::LeaseMgr. Currently the
- only available backend is MySQL (see \ref isc::dhcp::MySqlLeaseMgr).
- @section cfgmgr Configuration Manager
- Configuration Manager (\ref isc::dhcp::CfgMgr) stores configuration information
- necessary for DHCPv4 and DHCPv6 server operation. In particular, it stores
- subnets (\ref isc::dhcp::Subnet4 and \ref isc::dhcp::Subnet6) together with
- their pools (\ref isc::dhcp::Pool4 and \ref isc::dhcp::Pool6), options and
- other information specified by the used in BIND10 configuration.
- @section allocengine Allocation Engine
- Allocation Engine (\ref isc::dhcp::AllocEngine) is what its name say - an engine
- that handles allocation of new leases. It takes parameters that the client
- provided (client-id, DUID, subnet, a hint if the user provided one, etc.) and
- then attempts to allocate a lease.
- There is no single best soluction to the address assignment problem. Server
- is expected to pick an address from its available pools is currently not used.
- There are many possible algorithms that can do that, each with its own advantages
- and drawbacks. This allocation engine must provide robust operation is radically
- different scenarios, so there address selection problem was abstracted into
- separate module, called allocator. Its sole purpose is to pick an address from
- a pool. Allocation engine will then check if the picked address is free and if
- it is not, then will ask allocator to pick again.
- At least 3 allocators will be implemented:
- - Iterative - it iterates over all resources (addresses or prefixes) in
- available pools, one by one. The advantages of this approach are: speed
- (typically it only needs to increase address just one), the guarantee to cover
- all addresses and predictability. This allocator behaves reasonably good in
- case of nearing depletion. Even when pools are almost completely allocated, it
- still will be able to allocate outstanding leases efficiently. Predictability
- can also be considered a serious flaw in some environments, as prediction of the
- next address is trivial and can be leveraged by an attacker. Another drawback of
- this allocator is that it does not attempt to give the same address to returning
- clients (clients that released or expired their leases and are requesting a new
- lease will likely to get a different lease). This allocator is not suitable for
- temporary addresses, which must be randomized. This allocator is implemented
- in \ref isc::dhcp::AllocEngine::IterativeAllocator.
- - Hashed - ISC-DHCP uses hash of the client-id or DUID to determine, which
- address is tried first. If that address is not available, the result is hashed
- again. That procedure is repeated until available address is found or there
- are no more addresses left. The benefit of that approach is that it provides
- a relative lease stability, so returning old clients are likely to get the same
- address again. The drawbacks are increased computation cost, as each iteration
- requires use of a hashing function. That is especially difficult when the
- pools are almost depleted. It also may be difficult to guarantee that the
- repeated hashing will iterate over all available addresses in all pools. Flawed
- hash algorithm can go into cycles that iterate over only part of the addresses.
- It is difficult to detect such issues as only some initial seed (client-id
- or DUID) values may trigger short cycles. This allocator is currently not
- implemented. This will be the only allocator allowed for temporary addresses.
- - Random - Another possible approach to address selection is randomization. This
- allocator can pick an address randomly from the configured pool. The benefit
- of this approach is that it is easy to implement and makes attacks based on
- address prediction more difficult. The drawback of this approach is that
- returning clients are almost guaranteed to get a different address. Another
- drawback is that with almost depleted pools it is increasingly difficult to
- "guess" an address that is free. This allocator is currently not implemented.
- @subsection allocEngineTypes Different lease types support
- Allocation Engine has been extended to support different types of leases. Four
- types are supported: TYPE_V4 (IPv4 addresses), TYPE_NA (normal IPv6 addresses),
- TYPE_TA (temporary IPv6 addresses) and TYPE_PD (delegated prefixes). Support for
- TYPE_TA is partial. Some routines are able to handle it, while other are
- not. The major missing piece is the RandomAllocator, so there is no way to randomly
- generate an address. This defeats the purpose of using temporary addresses for now.
- @subsection allocEnginePD Prefix Delegation support in AllocEngine
- The Allocation Engine supports allocation of the IPv6 addresses and prefixes.
- For a prefix pool, the iterative allocator "walks over"
- every available pool. It is similar to how it iterates over address pool,
- but instead of increasing address by just one, it walks over the whole delegated
- prefix length in one step. This is implemented in
- isc::dhcp::AllocEngine::IterativeAllocator::increasePrefix(). Functionally the
- increaseAddress(addr) call is equivalent to increasePrefix(addr, 128)
- (increasing by a /128 prefix, i.e. a single address). However, both methods are
- kept, because increaseAddress() is faster and this is a routine that may be
- called many hundred thousands times per second.
- */
|