Bez popisu

Anatole Denis 79f78359c2 plugins/dns: Implement DHCPv6 support (#54) před 6 roky
.travis c54b03d33a CI: linters and fixes před 6 roky
cmds a8ccf129b5 [plugins/file] Added documentation před 6 roky
config b9d7c74d44 Logger: add prefix to log lines před 6 roky
handler 1a8a757049 Stop returning `nil, false` in plugins (#51) před 6 roky
logger b9d7c74d44 Logger: add prefix to log lines před 6 roky
plugins 79f78359c2 plugins/dns: Implement DHCPv6 support (#54) před 6 roky
.gitignore 1e3cb1982d IPv4 server plugin (#40) před 6 roky
.stickler.yml 1d2a09489b Adding .stickler.yml před 7 roky
.travis.yml c54b03d33a CI: linters and fixes před 6 roky
LICENSE a711f5f6d9 Initial commit před 7 roky
README.md 1e3cb1982d IPv4 server plugin (#40) před 6 roky
coredhcp.go 406e854316 server4: Fix peer address logic (#53) před 6 roky
go.mod 79f78359c2 plugins/dns: Implement DHCPv6 support (#54) před 6 roky
go.sum 79f78359c2 plugins/dns: Implement DHCPv6 support (#54) před 6 roky

README.md

coredhcp

Build Status codecov Go Report Card

Fast, multithreaded, modular and extensible DHCP server written in Go

This is still a work-in-progress

Example configuration

In CoreDHCP almost everything is implemented as a plugin. The order of plugins in the configuration matters: every request is evaluated calling each plugin in order, until one breaks the evaluation and responds to, or drops, the request.

The following configuration runs a DHCPv6-only server, listening on all the interfaces, using a custom DUID-LL as server ID, and reading the leases from a text file.

server6:
    listen: '[::]:547'
    plugins:
        - server_id: LL 00:de:ad:be:ef:00
        - file: "leases.txt"
        # - dns: 8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

#server4:
#    listen: '0.0.0.0:67'
#    plugins:
        # - server_id: 10.10.10.1
        # - dns: 8.8.8.8 8.8.4.4
        # - router: 10.10.10.1
        # - netmask: 255.255.255.0
        # - range: leases.txt 10.10.10.100 10.10.10.200 60s

See also config.yml.example.

Build and run

The server is located under cmds/coredhcp/, so enter that directory first.

Once you have a working configuration in config.yml (see config.yml.example), you can build and run the server:

$ cd cmds/coredhcp
$ go build
$ sudo ./coredhcp
INFO[2019-01-05T22:28:07Z] Registering plugin "file"
INFO[2019-01-05T22:28:07Z] Registering plugin "server_id"
INFO[2019-01-05T22:28:07Z] Loading configuration
INFO[2019-01-05T22:28:07Z] Found plugin: `server_id` with 2 args, `[LL 00:de:ad:be:ef:00]`
INFO[2019-01-05T22:28:07Z] Found plugin: `file` with 1 args, `[leases.txt]`
INFO[2019-01-05T22:28:07Z] Loading plugins...
INFO[2019-01-05T22:28:07Z] Loading plugin `server_id`
INFO[2019-01-05T22:28:07Z] plugins/server_id: loading `server_id` plugin
INFO[2019-01-05T22:28:07Z] plugins/server_id: using ll 00:de:ad:be:ef:00
INFO[2019-01-05T22:28:07Z] Loading plugin `file`
INFO[2019-01-05T22:28:07Z] plugins/file: reading leases from leases.txt
INFO[2019-01-05T22:28:07Z] plugins/file: loaded 1 leases from leases.txt
INFO[2019-01-05T22:28:07Z] Starting DHCPv6 listener on [::]:547
INFO[2019-01-05T22:28:07Z] Waiting
2019/01/05 22:28:07 Server listening on [::]:547
2019/01/05 22:28:07 Ready to handle requests
...

Then try it with the local test client, that is located under cmds/client/:

$ cd cmds/client
$ go build
$ sudo ./client
INFO[2019-01-05T22:29:21Z] &{ReadTimeout:3s WriteTimeout:3s LocalAddr:[::1]:546 RemoteAddr:[::1]:547}
INFO[2019-01-05T22:29:21Z] DHCPv6Message
  messageType=SOLICIT
  transactionid=0x6d30ff
  options=[
    OptClientId{cid=DUID{type=DUID-LLT hwtype=Ethernet hwaddr=00:11:22:33:44:55}}
    OptRequestedOption{options=[DNS Recursive Name Server, Domain Search List]}
    OptElapsedTime{elapsedtime=0}
    OptIANA{IAID=[250 206 176 12], t1=3600, t2=5400, options=[]}
  ]
...

How to write a plugin

CoreDHCP is heavily based on plugins: even the core functionalities are implemented as plugins. Therefore, knowing how to write one is the key to add new features to CoreDHCP.

The best way to learn is to read the comments and source code of the example plugin, which guides you through the implementation of a simple plugin that prints a packet every time it is received by the server.

Authors