Fully functional DNS server written in C#.
The project was conceived while working to reduce the cost of datacentre "stamps" while providing robust services within a datacentre, specifically to remove the need for an expensive load-balancer device by providing round-robin DNS services, and retrying connectivity instead.
This software is licenced under MIT terms that permits reuse within proprietary software provided all copies of the licensed software include a copy of the MIT License terms and the copyright notice. See licence.txt
// clone the repo
>> cd $repo-root
>> git clone https://github.com/stephbu/csharp-dns-server
// check you can build the project
>> cd $repo-root/csharp-dns-server
>> dotnet build
// check that the tests run
>> dotnet test
- if you're running on Windows 10 with Docker Tools installed, Docker uses the ICS SharedAccess service to provide DNS resolution for Docker containers - this listens on UDP:53, and will conflict with the DNS project. Either turn off the the service (
net stop SharedAccess
), or change the UDP port.
As written, the server has the following features:
- Pluggable Zone Resolver. Host one or more zones locally, and run your code to resolve names in that zone. Enables many complex scenarios such as:
- round-robin load-balancing. Distribute load and provide failover with a datacentre without expensive hardware.
- health-checks. While maintaining a list of machines in round-robin for a name, the code performs periodic healthchecks against the machines, if necessary removing machines that fail the health checks from rotation.
- Delegates all other DNS lookup to host machines default DNS server(s)
The DNS server has a built-in Web Server providing operational insight into the current server behaviour.
- healthcheck for server status
- counters
- zone information
Time-based constraints such as parental controls to block a site, e.g. Facebook. Logging of site usage e.g. company notifications
Two phases of testing was completed.
-
Verification that the bit-packing classes correctly added and removed bits in correct Endian order, complicated by network bitpacking in reverse order to Windows big-endian packing.
-
Protocol verification - that well known messages were correctly decoded and re-encoded using the bit-packing system.
Much time was spent using Netmon to capture real DNS challenges and verify that the C# DNS server responded appropriately.
No effort made to handle or respond to DNS-Sec challenges.
Pull Requests, Bug Reports, and Feature Requests are most welcome.
Suggested workflow for PRs is
- Make a fork of csharp-dns-server/master in your own repository.
- Create a branch in your own repo to entirely encapsulate all your proposed changes
- Make your changes, add documentation if you need it, markdown text preferred.
- Squash your commits into a single change (Find out how to squash here)
- Submit a PR, and put in comments anything that you think I'll need to help merge and evaluate the changes
All contributions must be licenced under the same MIT terms, do include a header file to that effect.