From 08328c95fe7cc4e35dff5c5faecc8f32ca6f69ec Mon Sep 17 00:00:00 2001 From: Revertron Date: Sun, 5 Sep 2021 19:05:30 +0200 Subject: [PATCH] Added DNS-over-HTTPS support for forwarded queries. --- Cargo.lock | 842 ++++++++++++++++++++++++++++++++++++++- Cargo.toml | 3 + alfis.toml | 7 +- src/blockchain/filter.rs | 2 +- src/dns/client.rs | 142 ++++++- src/dns/context.rs | 21 +- src/dns/resolve.rs | 14 +- src/dns_utils.rs | 3 +- src/main.rs | 2 + src/settings.rs | 7 + 10 files changed, 1005 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a8c59ec..4a24193 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,6 +65,17 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "ahash" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98" +dependencies = [ + "getrandom 0.2.2", + "once_cell", + "version_check", +] + [[package]] name = "alfis" version = "0.6.6" @@ -77,11 +88,13 @@ dependencies = [ "chrono", "derive_more", "digest", + "dnsclient", "ecies-ed25519", "ed25519-dalek", "getopts", "lazy_static", "log", + "lru", "mio", "num-bigint", "num-traits", @@ -101,13 +114,149 @@ dependencies = [ "thread-priority", "tinyfiledialogs", "toml", + "ureq", "uuid", "web-view", - "winapi", + "winapi 0.3.9", "winres", "x25519-dalek", ] +[[package]] +name = "anyhow" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28ae2b3dec75a406790005a200b1bd89785afc02517a00ca99ecfe093ee9e6cf" + +[[package]] +name = "async-channel" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-executor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "once_cell", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9586ec52317f36de58453159d48351bc244bc24ced3effc1fce22f3d48664af6" +dependencies = [ + "async-channel", + "async-executor", + "async-io", + "async-mutex", + "blocking", + "futures-lite", + "num_cpus", + "once_cell", +] + +[[package]] +name = "async-io" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" +dependencies = [ + "concurrent-queue", + "futures-lite", + "libc", + "log", + "once_cell", + "parking", + "polling", + "slab", + "socket2", + "waker-fn", + "winapi 0.3.9", +] + +[[package]] +name = "async-lock" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-mutex" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-process" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b21b63ab5a0db0369deb913540af2892750e42d949faacc7a61495ac418a1692" +dependencies = [ + "async-io", + "blocking", + "cfg-if 1.0.0", + "event-listener", + "futures-lite", + "libc", + "once_cell", + "signal-hook", + "winapi 0.3.9", +] + +[[package]] +name = "async-std" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8056f1455169ab86dd47b47391e4ab0cbd25410a70e9fe675544f49bafaf952" +dependencies = [ + "async-channel", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "num_cpus", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0" + [[package]] name = "atk-sys" version = "0.10.0" @@ -120,12 +269,43 @@ dependencies = [ "system-deps", ] +[[package]] +name = "atomic-waker" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" + [[package]] name = "autocfg" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "backtrace" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "150ae7828afa7afb6d474f909d64072d21de1f3365b6e8ad8029bf7b1c6350a0" +dependencies = [ + "backtrace-sys", + "cfg-if 0.1.10", + "dbghelp-sys", + "debug-builders", + "kernel32-sys", + "libc", + "winapi 0.2.8", +] + +[[package]] +name = "backtrace-sys" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fbebbe1c9d1f383a9cc7e8ccdb471b91c8d024ee9c2ca5b5346121fe8b4399" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "base64" version = "0.13.0" @@ -141,6 +321,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitflags" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" + [[package]] name = "bitflags" version = "1.2.1" @@ -177,18 +363,44 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e170dbede1f740736619b776d7251cb1b9095c435c34d8ca9f57fcd2f335e9" +dependencies = [ + "async-channel", + "async-task", + "atomic-waker", + "fastrand", + "futures-lite", + "once_cell", +] + [[package]] name = "boxfnonce" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5988cb1d626264ac94100be357308f29ff7cbdd3b36bda27f450a4ee3f713426" +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + [[package]] name = "byteorder" version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "cache-padded" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" + [[package]] name = "cairo-sys-rs" version = "0.10.0" @@ -205,6 +417,12 @@ version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -217,7 +435,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5d87765c99be3d2cb08d11a3c14820ecaf2c7ad45d301c533103d2d8a146c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cipher 0.3.0", "cpufeatures 0.2.1", "zeroize", @@ -236,6 +454,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "chomp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f74ad218e66339b11fd23f693fb8f1d621e80ba6ac218297be26073365d163d" +dependencies = [ + "bitflags 0.7.0", + "conv", + "debugtrace", + "either", +] + [[package]] name = "chrono" version = "0.4.19" @@ -247,9 +477,15 @@ dependencies = [ "num-traits", "serde", "time", - "winapi", + "winapi 0.3.9", ] +[[package]] +name = "chunked_transfer" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" + [[package]] name = "cipher" version = "0.2.5" @@ -268,6 +504,24 @@ dependencies = [ "generic-array", ] +[[package]] +name = "concurrent-queue" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +dependencies = [ + "cache-padded", +] + +[[package]] +name = "conv" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ff10625fd0ac447827aa30ea8b861fead473bb60aeb73af6c1c58caf0d1299" +dependencies = [ + "custom_derive", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -298,6 +552,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" +[[package]] +name = "crossbeam-utils" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +dependencies = [ + "cfg-if 1.0.0", + "lazy_static", +] + [[package]] name = "crypto-mac" version = "0.8.0" @@ -318,6 +582,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "ctor" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "ctr" version = "0.6.0" @@ -340,6 +614,37 @@ dependencies = [ "zeroize", ] +[[package]] +name = "custom_derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9" + +[[package]] +name = "dbghelp-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "debug-builders" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f5d8e3d14cabcb2a8a59d7147289173c6ada77a0bc526f6b85078f941c0cf12" + +[[package]] +name = "debugtrace" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e432bd83c5d70317f6ebd8a50ed4afb32907c64d6e2e1e65e339b06dc553f3" +dependencies = [ + "backtrace", +] + [[package]] name = "derive_more" version = "0.99.16" @@ -362,6 +667,32 @@ dependencies = [ "generic-array", ] +[[package]] +name = "dnsclient" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca5429947886eabb8da7268aa9d61ba4348347417b04452310bf3b5b5258ac7" +dependencies = [ + "async-std", + "dnssector", + "rand 0.8.4", +] + +[[package]] +name = "dnssector" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef40cef9c349123274f45efc0021dcd1bd4b5b35226eafe4b84a9d8a2a6deeeb" +dependencies = [ + "anyhow", + "byteorder", + "chomp", + "hex", + "libc", + "rand 0.8.4", + "thiserror", +] + [[package]] name = "ecies-ed25519" version = "0.5.1" @@ -402,6 +733,73 @@ dependencies = [ "zeroize", ] +[[package]] +name = "either" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a39bffec1e2015c5d8a6773cb0cf48d0d758c842398f624c34969071f5499ea7" + +[[package]] +name = "event-listener" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" + +[[package]] +name = "fastrand" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" +dependencies = [ + "instant", +] + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" + +[[package]] +name = "futures-io" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" + +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + [[package]] name = "gdk-pixbuf-sys" version = "0.10.0" @@ -457,7 +855,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] @@ -468,7 +866,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi 0.10.2+wasi-snapshot-preview1", ] @@ -493,7 +891,7 @@ dependencies = [ "gobject-sys", "libc", "system-deps", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -506,6 +904,19 @@ dependencies = [ "system-deps", ] +[[package]] +name = "gloo-timers" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47204a46aaff920a1ea58b11d03dec6f704287d27561724a4631e450654a891f" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "gobject-sys" version = "0.10.0" @@ -541,6 +952,15 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62aca2aba2d62b4a7f5b33f3712cb1b0692779a56fb510499d5c0aa594daeaf3" +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + [[package]] name = "heck" version = "0.3.2" @@ -585,6 +1005,26 @@ dependencies = [ "digest", ] +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "instant" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "itoa" version = "0.4.7" @@ -600,6 +1040,34 @@ dependencies = [ "libc", ] +[[package]] +name = "js-sys" +version = "0.3.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4bf49d50e2961077d9c99f4b7997d770a1114f087c3c2e0069b36c13fc2979d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -618,9 +1086,31 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", + "value-bag", ] +[[package]] +name = "lru" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ea2d928b485416e8908cff2d97d621db22b27f7b3b6729e438bcf42c671ba91" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + [[package]] name = "mio" version = "0.7.13" @@ -631,7 +1121,7 @@ dependencies = [ "log", "miow", "ntapi", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -640,7 +1130,7 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -649,7 +1139,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -692,6 +1182,12 @@ dependencies = [ "libc", ] +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + [[package]] name = "opaque-debug" version = "0.3.0" @@ -705,7 +1201,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b46b233de7d83bc167fe43ae2dda3b5b84e80e09cceba581e4decb958a4896bf" dependencies = [ "pathdiff", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -720,12 +1216,24 @@ dependencies = [ "system-deps", ] +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + [[package]] name = "pathdiff" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877630b3de15c0b64cc52f659345724fbf6bdad9bd9566699fc53688f3c34a34" +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + [[package]] name = "pest" version = "2.1.3" @@ -735,12 +1243,37 @@ dependencies = [ "ucd-trie", ] +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "pkg-config" version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" +[[package]] +name = "polling" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "log", + "wepoll-ffi", + "winapi 0.3.9", +] + [[package]] name = "poly1305" version = "0.7.0" @@ -868,6 +1401,21 @@ dependencies = [ "rand_core 0.6.2", ] +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi 0.3.9", +] + [[package]] name = "rustc_version" version = "0.3.3" @@ -877,12 +1425,35 @@ dependencies = [ "semver", ] +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64", + "log", + "ring", + "sct", + "webpki", +] + [[package]] name = "ryu" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "semver" version = "0.11.0" @@ -958,12 +1529,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9204c41a1597a8c5af23c82d1c921cb01ec0a4c59e07a9c7306062829a3903f3" dependencies = [ "block-buffer", - "cfg-if", + "cfg-if 1.0.0", "cpufeatures 0.2.1", "digest", "opaque-debug", ] +[[package]] +name = "signal-hook" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c98891d737e271a2954825ef19e46bd16bdb98e2746f2eec4f7a4ef7946efd1" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "1.3.1" @@ -981,13 +1571,29 @@ dependencies = [ "termcolor", ] +[[package]] +name = "slab" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" + +[[package]] +name = "socket2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "soup-sys" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3c7adf08565630bbb71f955f11f8a68464817ded2703a3549747c235b58a13e" dependencies = [ - "bitflags", + "bitflags 1.2.1", "gio-sys", "glib-sys", "gobject-sys", @@ -996,6 +1602,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "sqlite" version = "0.26.0" @@ -1124,7 +1736,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbb8681124ddad2b07e677d7a99f564c9edbd289cc53cdc0010fd110cb4818ec" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1134,7 +1746,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1147,6 +1759,21 @@ dependencies = [ "libc", ] +[[package]] +name = "tinyvec" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + [[package]] name = "toml" version = "0.5.8" @@ -1168,6 +1795,21 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +[[package]] +name = "unicode-bidi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.7.1" @@ -1196,6 +1838,40 @@ dependencies = [ "subtle", ] +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "ureq" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3131cd6cb18488da91da1d10ed31e966f453c06b65bf010d35638456976a3fd7" +dependencies = [ + "base64", + "chunked_transfer", + "log", + "once_cell", + "rustls", + "url", + "webpki", + "webpki-roots", +] + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + [[package]] name = "urlencoding" version = "1.1.1" @@ -1212,6 +1888,16 @@ dependencies = [ "serde", ] +[[package]] +name = "value-bag" +version = "1.0.0-alpha.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd320e1520f94261153e96f7534476ad869c14022aee1e59af7c778075d840ae" +dependencies = [ + "ctor", + "version_check", +] + [[package]] name = "version-compare" version = "0.0.10" @@ -1224,6 +1910,12 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -1236,6 +1928,82 @@ version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +[[package]] +name = "wasm-bindgen" +version = "0.2.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce9b1b516211d33767048e5d47fa2a381ed8b76fc48d2ce4aa39877f9f183e0" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe8dc78e2326ba5f845f4b5bf548401604fa20b1dd1d365fb73b6c1d6364041" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95fded345a6559c2cfee778d562300c581f7d4ff3edb9b0d230d69800d213972" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44468aa53335841d9d6b6c023eaab07c0cd4bddbcfdee3e2bb1e8d2cb8069fef" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0195807922713af1e67dc66132c7328206ed9766af3858164fb583eedc25fbad" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdb075a845574a1fa5f09fd77e43f7747599301ea3417a9fbffdeedfc1f4a29" + +[[package]] +name = "web-sys" +version = "0.3.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224b2f6b67919060055ef1a67807367c2066ed520c3862cc013d26cf893a783c" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "web-view" version = "0.7.3" @@ -1255,7 +2023,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389e5138c85a0d111b9bda05b59efa8562315e1d657d72451410e12c858f0619" dependencies = [ "atk-sys", - "bitflags", + "bitflags 1.2.1", "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", @@ -1270,6 +2038,25 @@ dependencies = [ "soup-sys", ] +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki", +] + [[package]] name = "webview-sys" version = "0.6.2" @@ -1288,6 +2075,21 @@ dependencies = [ "webkit2gtk-sys", ] +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" +dependencies = [ + "cc", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + [[package]] name = "winapi" version = "0.3.9" @@ -1298,6 +2100,12 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -1310,7 +2118,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 9f12325..a0c6a1c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,9 @@ rand-old = { package = "rand", version = "0.7.0" } # For ed25519-dalek sqlite = "0.26.0" uuid = { version = "0.8.2", features = ["serde", "v4"] } mio = { version = "0.7.13", features = ["os-poll", "net"] } +ureq = "2.2" +dnsclient = "0.1" +lru = "0.6" derive_more = "0.99.16" lazy_static = "1.4.0" diff --git a/alfis.toml b/alfis.toml index 267e9de..1a9c021 100644 --- a/alfis.toml +++ b/alfis.toml @@ -23,9 +23,12 @@ listen = "127.0.0.1:53" # How many threads to spawn by DNS server threads = 50 # AdGuard DNS servers to filter ads and trackers -forwarders = ["94.140.14.14:53", "94.140.15.15:53"] +forwarders = ["https://dns.adguard.com/dns-query", "94.140.14.14:53", "94.140.15.15:53"] # Cloudflare servers -#forwarders = ["1.1.1.1:53", "1.0.0.1:53"] +#forwarders = ["https://cloudflare-dns.com/dns-query", "1.1.1.1:53", "1.0.0.1:53"] + +# Bootstrap DNS-servers to resolve domains of DoH providers +bootstraps = ["9.9.9.9:53", "94.140.14.140:53"] # Hosts file support (resolve local names or block ads) #hosts = ["system", "adblock.txt"] diff --git a/src/blockchain/filter.rs b/src/blockchain/filter.rs index d11b3a6..37b56cb 100644 --- a/src/blockchain/filter.rs +++ b/src/blockchain/filter.rs @@ -44,7 +44,7 @@ impl DnsFilter for BlockchainFilter { subdomain = String::from(parts[2]); } } - trace!("Searching record type '{:?}', name '{}' for domain '{}'", &qtype, &subdomain, &search); + //trace!("Searching record type '{:?}', name '{}' for domain '{}'", &qtype, &subdomain, &search); let data = self.context.lock().unwrap().chain.get_domain_info(&search); let zone = parts[0].to_owned(); diff --git a/src/dns/client.rs b/src/dns/client.rs index 7ce7520..e705f4c 100644 --- a/src/dns/client.rs +++ b/src/dns/client.rs @@ -1,20 +1,25 @@ //! client for sending DNS queries to other servers -use std::io::Write; +use std::io::{Write, Read}; use std::marker::{Send, Sync}; -use std::net::{SocketAddr, TcpStream, ToSocketAddrs, UdpSocket}; +use std::net::{SocketAddr, TcpStream, ToSocketAddrs, UdpSocket, IpAddr}; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::mpsc::{channel, Sender}; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, RwLock}; use std::thread::{sleep, Builder}; use std::time::Duration as SleepDuration; use chrono::*; use derive_more::{Display, Error, From}; -use crate::dns::buffer::{BytePacketBuffer, PacketBuffer, StreamPacketBuffer}; +#[allow(unused_imports)] +use log::{debug, error, info, trace, warn}; + +use crate::dns::buffer::{BytePacketBuffer, PacketBuffer, StreamPacketBuffer, VectorPacketBuffer}; use crate::dns::netutil::{read_packet_length, write_packet_length}; use crate::dns::protocol::{DnsPacket, DnsQuestion, QueryType}; +use dnsclient::UpstreamServer; +use lru::LruCache; #[derive(Debug, Display, From, Error)] pub enum ClientError { @@ -38,7 +43,7 @@ pub trait DnsClient { /// The UDP client /// /// This includes a fair bit of synchronization due to the stateless nature of UDP. -/// When many queries are sent in parallell, the response packets can come back +/// When many queries are sent in parallel, the response packets can come back /// in any order. For that reason, we fire off replies on the sending thread, but /// handle replies on a single thread. A channel is created for every response, /// and the caller will block on the channel until the a response is received. @@ -337,11 +342,136 @@ impl DnsClient for DnsNetworkClient { return Ok(packet); } - println!("Truncated response - resending as TCP"); + info!("Truncated response - resending as TCP"); self.send_tcp_query(qname, qtype, server, recursive) } } +pub struct HttpsDnsClient { + agent: ureq::Agent, + /// Counter for assigning packet ids + seq: AtomicUsize, +} + +impl HttpsDnsClient { + pub fn new(bootstraps: Vec) -> Self { + let client_name = format!("ALFIS/{}", env!("CARGO_PKG_VERSION")); + let servers = bootstraps + .iter() + .filter_map(|addr| addr.parse().ok()) + .map(|addr: SocketAddr| UpstreamServer::new(addr.clone())) + .collect::>(); + trace!("Using bootstraps: {:?}", &servers); + + let dns_client = dnsclient::sync::DNSClient::new(servers); + let cache: LruCache> = LruCache::new(10); + let cache = RwLock::new(cache); + + let agent = ureq::AgentBuilder::new() + .user_agent(&client_name) + .timeout(std::time::Duration::from_secs(3)) + .resolver(move |addr: &str| { + let addr = match addr.find(":") { + Some(index) => addr[0..index].to_string(), + None => addr.to_string() + }; + trace!("Resolving {}", addr); + if let Some(addrs) = cache.write().unwrap().get(&addr) { + trace!("Found bootstrap ip in cache"); + return Ok(addrs.clone()); + } + + let mut result: Vec = Vec::new(); + if let Ok(addrs) = dns_client.query_a(&addr) { + result.extend(addrs.into_iter().map(|ip| IpAddr::V4(ip))) + } + if let Ok(addrs) = dns_client.query_aaaa(&addr) { + result.extend(addrs.into_iter().map(|ip| IpAddr::V6(ip))); + } + + let addrs = result + .into_iter() + .map(|ip| SocketAddr::new(ip, 443)) + .collect::>(); + trace!("Resolved addresses: {:?}", &addrs); + cache.write().unwrap().put(addr, addrs.clone()); + Ok(addrs) + }) + .build(); + Self { agent, seq: AtomicUsize::new(1) } + } +} + +impl DnsClient for HttpsDnsClient { + fn get_sent_count(&self) -> usize { + // No statistics for now + 0 + } + + fn get_failed_count(&self) -> usize { + // No statistics for now + 0 + } + + fn run(&self) -> Result<()> { + debug!("Started DoH client"); + Ok(()) + } + + fn send_query(&self, qname: &str, qtype: QueryType, doh_url: &str, recursive: bool) -> Result { + // Create DnsPacket + let mut packet = DnsPacket::new(); + packet.header.id = self.seq.fetch_add(1, Ordering::SeqCst) as u16; + if packet.header.id + 1 == 0xFFFF { + let _ = self.seq.compare_exchange(0xFFFF, 0, Ordering::SeqCst, Ordering::SeqCst); + } + + packet.header.questions = 1; + packet.header.recursion_desired = recursive; + packet.questions.push(DnsQuestion::new(String::from(qname), qtype)); + + let mut req_buffer = VectorPacketBuffer::new(); + packet.write(&mut req_buffer, 512).expect("Preparing DnsPacket failed!"); + + let response = self.agent + .post(doh_url) + .set("Content-Type", "application/dns-message") + .send_bytes(&req_buffer.buffer.as_slice()); + + match response { + Ok(response) => { + match response.status() { + 200 => { + match response.header("Content-Length") { + None => warn!("No 'Content-Length' header in DoH response!"), + Some(str) => { + match str.parse::() { + Ok(size) => { + let mut bytes: Vec = Vec::with_capacity(size); + response.into_reader() + .take(4096) + .read_to_end(&mut bytes)?; + let mut buffer = VectorPacketBuffer::new(); + buffer.buffer.extend_from_slice(&bytes.as_slice()); + if let Ok(packet) = DnsPacket::from_buffer(&mut buffer) { + return Ok(packet); + } + warn!("Error parsing DoH result!"); + } + Err(e) => warn!("Error parsing 'Content-Length' in DoH response! {}", e) + } + } + } + } + _ => warn!("Error getting DoH response") + } + } + Err(e) => warn!("DoH error: {}", &e.to_string()) + } + Err(ClientError::LookupFailed) + } +} + #[cfg(test)] pub mod tests { use super::*; diff --git a/src/dns/context.rs b/src/dns/context.rs index 2fce375..5550494 100644 --- a/src/dns/context.rs +++ b/src/dns/context.rs @@ -7,7 +7,7 @@ use derive_more::{Display, Error, From}; use crate::dns::authority::Authority; use crate::dns::cache::SynchronizedCache; -use crate::dns::client::{DnsClient, DnsNetworkClient}; +use crate::dns::client::{DnsClient, DnsNetworkClient, HttpsDnsClient}; use crate::dns::filter::DnsFilter; use crate::dns::resolve::{DnsResolver, ForwardingDnsResolver, RecursiveDnsResolver}; @@ -44,7 +44,8 @@ pub struct ServerContext { pub authority: Authority, pub cache: SynchronizedCache, pub filters: Vec>, - pub client: Box, + pub old_client: Box, + pub doh_client: Box, pub dns_listen: String, pub api_port: u16, pub resolve_strategy: ResolveStrategy, @@ -58,18 +59,19 @@ pub struct ServerContext { impl Default for ServerContext { fn default() -> Self { - ServerContext::new() + ServerContext::new(String::from("0.0.0.0:53"), Vec::new()) } } impl ServerContext { - pub fn new() -> ServerContext { + pub fn new(dns_listen: String, bootstraps: Vec) -> ServerContext { ServerContext { authority: Authority::new(), cache: SynchronizedCache::new(), filters: Vec::new(), - client: Box::new(DnsNetworkClient::new(10000 + (rand::random::() % 20000))), - dns_listen: String::from("0.0.0.0:53"), + old_client: Box::new(DnsNetworkClient::new(10000 + (rand::random::() % 20000))), + doh_client: Box::new(HttpsDnsClient::new(bootstraps)), + dns_listen, api_port: 5380, resolve_strategy: ResolveStrategy::Recursive, allow_recursive: true, @@ -83,7 +85,9 @@ impl ServerContext { pub fn initialize(&mut self) -> Result<()> { // Start UDP client thread - self.client.run()?; + self.old_client.run()?; + // Start DoH client + self.doh_client.run()?; // Load authority data self.authority.load()?; @@ -117,7 +121,8 @@ pub mod tests { authority: Authority::new(), cache: SynchronizedCache::new(), filters: Vec::new(), - client: Box::new(DnsStubClient::new(callback)), + old_client: Box::new(DnsStubClient::new(callback)), + doh_client: Box::new(HttpsDnsClient::new()), dns_listen: String::from("0.0.0.0:53"), api_port: 5380, resolve_strategy: ResolveStrategy::Recursive, diff --git a/src/dns/resolve.rs b/src/dns/resolve.rs index efbae04..4444560 100644 --- a/src/dns/resolve.rs +++ b/src/dns/resolve.rs @@ -87,7 +87,13 @@ impl DnsResolver for ForwardingDnsResolver { let mut random = rand::thread_rng(); let upstream = self.upstreams.iter().choose(&mut random).unwrap(); let result = match self.context.cache.lookup(qname, qtype) { - None => self.context.client.send_query(qname, qtype, upstream, true)?, + None => { + if is_url(upstream) { + self.context.doh_client.send_query(qname, qtype, upstream, true)? + } else { + self.context.old_client.send_query(qname, qtype, upstream, true)? + } + }, Some(packet) => packet }; @@ -150,7 +156,7 @@ impl DnsResolver for RecursiveDnsResolver { let ns_copy = ns.clone(); let server = format!("{}:{}", ns_copy.as_str(), 53); - let response = self.context.client.send_query(qname, qtype.clone(), &server, false)?; + let response = self.context.old_client.send_query(qname, qtype.clone(), &server, false)?; // If we've got an actual answer, we're done! if !response.answers.is_empty() && response.header.rescode == ResultCode::NOERROR { @@ -198,6 +204,10 @@ impl DnsResolver for RecursiveDnsResolver { } } +fn is_url(url: &str) -> bool { + url.starts_with("https://") +} + #[cfg(test)] mod tests { diff --git a/src/dns_utils.rs b/src/dns_utils.rs index aed9b7a..4067bb2 100644 --- a/src/dns_utils.rs +++ b/src/dns_utils.rs @@ -31,9 +31,8 @@ pub fn start_dns_server(context: &Arc>, settings: &Settings) { /// Creates DNS-context with all needed settings fn create_server_context(context: Arc>, settings: &Settings) -> Arc { - let mut server_context = ServerContext::new(); + let mut server_context = ServerContext::new(settings.dns.listen.clone(), settings.dns.bootstraps.clone()); server_context.allow_recursive = true; - server_context.dns_listen = settings.dns.listen.clone(); server_context.resolve_strategy = match settings.dns.forwarders.is_empty() { true => ResolveStrategy::Recursive, false => ResolveStrategy::Forward { upstreams: settings.dns.forwarders.clone() } diff --git a/src/main.rs b/src/main.rs index 5b48cf7..12fc870 100644 --- a/src/main.rs +++ b/src/main.rs @@ -227,6 +227,8 @@ fn setup_logger(opt_matches: &Matches) { } let config = ConfigBuilder::new() .add_filter_ignore_str("mio::poll") + .add_filter_ignore_str("rustls::client") + .add_filter_ignore_str("ureq::") .set_thread_level(LevelFilter::Off) .set_location_level(LevelFilter::Off) .set_target_level(LevelFilter::Error) diff --git a/src/settings.rs b/src/settings.rs index de0662e..729529f 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -67,6 +67,8 @@ pub struct Dns { #[serde(default = "default_threads")] pub threads: usize, pub forwarders: Vec, + #[serde(default = "default_dns_bootstraps")] + pub bootstraps: Vec, #[serde(default)] pub hosts: Vec } @@ -77,6 +79,7 @@ impl Default for Dns { listen: String::from("127.0.0.1:53"), threads: 20, forwarders: vec![String::from("94.140.14.14:53"), String::from("94.140.15.15:53")], + bootstraps: default_dns_bootstraps(), hosts: Vec::new() } } @@ -137,4 +140,8 @@ fn default_key_files() -> Vec { String::from("key4.toml"), String::from("key5.toml"), ] +} + +fn default_dns_bootstraps() -> Vec { + vec![String::from("9.9.9.9:53"), String::from("94.140.14.140:53")] } \ No newline at end of file