/DNSTurbo

A middleware between browser and DNS client/server, to speed up the Internet according to the network speed

Primary LanguageC++MIT LicenseMIT

Build Status Docker Pulls license GitHub release GitHub tag GitHub code size in bytes

DNSTurbo

A middleware between browser and local DNS client/server, to speed up the Internet according to the network speed. It optimizes the A/AAAA records by latency detection mechanism, offer the best records the user wanted.

Why the GEO-based DNS is not enough? As we know, there are a lot of GEO-based DNS services, like openDNS, google DNS, etc. They can calculate the distance of the user location to the target host, to return the nearest records, but unfortunately it's hard to say the returned records are always the best ones, since the real user experience depends on the user local network quality, for the different time, different ISP and different website, the results are totally different.

So, it's better to have another program to detect the quality of the DNS records from user's point of view, then filter the bad ones out, and keep the good ones as much as possible. DNSTurbo was born under this situation, plug it into the DNS pipeline, always keep the records as good as possible for the users.

DNSTurbo do the Latency Detection, and does not do the Bandwidth Detection, because it's highly depend on the Congestion Control(For TCP connections), different congestion module would give the different results, and the Bandwidth Detection is not only very heavy especially for the mobile device in LTE network, but also would compete with Browser to make the network worse than ever. And another hand, all the records returned should have the very similar network quality, so to maximize the Bandwidth, we should rely on the target program or TCP Congestion Control (Like Linux-4.9, the new CC module would try the best to use the Bandwidth by the new algo)

Trailer

DNSTurbo Logo

Architecture

DNSTurbo-arch

Compatible Environments

  • Linux
  • 32/64 bit compatible
  • x86/ARM compatible

Features

  • Builtin
  • Optimized A Record
  • Optimized AAAA Record
  • Http Latency Detection
  • Docker Image
  • Coming Soon:
  • ICMP Latency Detection

Install Dependencies

# Install System Dependencies
sudo apt-get install autoconf valgrind expect libyaml-dev python3-dev python3-pip libc-ares-dev;
sudo pip3 install PyYAML pympler WebOb dnslib;

# Fork/Clone and Build Project Dependencies (For example: project folder is 'DNSTurbo')
cd DNSTurbo
git submodule update --init --recursive
make dep; sudo make install-dep; make skull; sudo make install-skull;

Build

skull build && skull deploy

Start

sudo skull start -D

Docker Images

The Docker images are ready now, if people who don't want to waste time to build it from scratch, it's super easy to run it via docker image.

Assume that we've already installed Docker, then apply the below commands:

bash$> docker pull finaldie/dnsturbo:0.8
bash$> docker run -p 53:53/udp finaldie/dnsturbo:0.8

DNSTurbo-Docker

Setup

Now, the DNSTurbo is all set, let's chain it in DNS pipe. For example, the DNSTurbo is set up in 192.168.31.221

  • For Mac: Open System Preferences -> Network -> Advanced -> DNS, then add 192.168.31.221 in the left window.

DNSTurbo-mac-setting

  • For Windows7/10: Open Network Apaptor -> Property -> TCP/IPv4, then select Manual DNS option, and add 192.168.31.221 there.

After that, enjoy the new experience :)

Environment Variables

Sometimes we don't want to use the default upstream DNS from resolv.conf, then there is an Shell Environment Variable can override it, just define an ENV var SKULL_DNS_NS, e.g.:

export SKULL_DNS_NS=192.168.1.1
export SKULL_DNS_NS=8.8.8.8