#dns-server #chinadns #dnsmasq

bin+lib zerodns

A DNS server in Rust, which is inspired from chinadns/dnsmasq

2 releases

0.1.0-alpha.3 Mar 3, 2024
0.1.0-alpha.2 Feb 20, 2024
0.1.0-alpha+1 Feb 12, 2024

#22 in #dns-server

Download history 23/week @ 2024-02-12 135/week @ 2024-02-19 144/week @ 2024-02-26 35/week @ 2024-03-04 7/week @ 2024-03-11 47/week @ 2024-04-01

56 downloads per month

MIT license

120KB
3.5K SLoC

logo

ZeroDNS

GitHub Actions Workflow Status Codecov Crates.io Version Crates.io Total Downloads GitHub Tag GitHub License

a DNS server in Rust, which is inspired from chinadns/dnsmasq.

WARNING: still in an active development!!!

Goals

  • multiple protocols: UDP/TCP/DoT/DoT/DNSCrypt
  • user-defined filters, includes lua or native rust codes

Quick Start

Notice: ensure you have just installed on your machine!

run an example:

$ just r
$ dig @127.0.0.1 -p5454 www.youtube.com

Configuration

Here's an example configuration file:


# The settings of server
[server]
# will listen on tcp+udp
listen = "0.0.0.0:5454"
# use LRU cache with 1000 capacity
cache_size = 1000

##### FILTERS BEGIN #####

# alidns over udp
[filters.alidns]
kind = "proxyby"
props = { servers = ["223.5.5.5", "223.6.6.6"] }

# opendns over tcp
[filters.opendns]
kind = "proxyby"
props = { servers = ["tcp://208.67.222.222:443", "tcp://208.67.220.220:443"] }

# a chinadns filter:
#  - use trusted dns servers for oversea domain
#  - use mistrusted dns servers for Chinese domain
# NOTICE: require 'geoip_database', you can download from https://git.io/GeoLite2-Country.mmdb
[filters.chinadns]
kind = "chinadns"
props = { trusted = ["tcp://208.67.222.222:443", "tcp://208.67.220.220:443"], mistrusted = ["223.5.5.5", "223.6.6.6"], geoip_database = "GeoLite2-Country.mmdb" }

##### FILTERS END #####

##### RULES BEGIN #####

# NOTICE:
# - will check rules below one by one
# - the 'domain' field follows the glob syntax

# for domain of '*.cn', use alidns filter
[[rules]]
domain = "*.cn"
filter = "alidns"

# for domain of '*apple.com', use alidns filter
[[rules]]
domain = "*.apple.com"
filter = "alidns"

# for domain of '*google*', use opendns filter
[[rules]]
domain = "*google*"
filter = "opendns"

# FINAL: use chinadns for others
[[rules]]
domain = "*"
filter = "chinadns"

##### RULES END #####


Dependencies

~14–29MB
~415K SLoC