serverless-dnsは、Pi-Hole 風のコンテンツ ブロッキング、サーバーレス、スタブ DNS-over-HTTPS (DoH) および DNS-over-TLS (DoT) リゾルバーです。Cloudflare Workers、Deno Deploy、およびFly.ioですぐに実行できます。これらすべてのサービスの無料利用枠は、1 か月あたり 10 ~ 20 台のデバイスに相当する DNS トラフィックをカバーするのに十分なはずです.
RethinkDNS は
serverless-dns、次のエンドポイントで本番環境で実行されます。
クラウド プラットフォーム | サーバーの場所 | プロトコル | ドメイン | 使用法 |
---|---|---|---|---|
|
200+ ( ping ) | DoH | basic.rethinkdns.com |
構成、設定 |
|
30+ ( ping ) | DoH | プライベートベータ | |
|
30+ ( ping ) | DoH と DoT | max.rethinkdns.com |
構成、設定 |
サーバー側の処理には 0 ミリ秒 (ms) から 2 ミリ秒 (中央値) かかり、エンドツーエンドの待機時間 (地域やネットワークによって異なります) は 10 ミリ秒から 30 ミリ秒 (中央値) です。
Cloudflare Workers はセットアップが最も簡単なプラットフォームです
serverless-dns。
詳しい手順については、次を参照してください。
プラットホーム | 困難 | ランタイム | ドク |
---|---|---|---|
|
簡単 | v8 分離株 | Cloudflare ワーカーでのホスティング |
|
適度 | デノ 分離株 | Deno.com でのホスティング |
|
難しい | ノード MicroVM | Fly.io でのホスティング |
ブロックリストをセットアップするには、ブラウザーからアクセスします ( RethinkDNS の構成ページ
https://<my-domain>.tld/configureに似たものが読み込まれるはずです)。
ヘルプやサポートが必要な場合は、お気軽に問題を開くか、パッチを送信してください。
コード:
# navigate to work dir
cd /my/work/dir
# clone this repository
git clone https://github.com/serverless-dns/serverless-dns.git
# navigate to serverless-dns
cd ./serverless-dns
ノード:
# install node v16+ via nvm, if required
# https://github.com/nvm-sh/nvm#installing-and-updating
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
nvm install --lts
# get js dependencies
npm i
# (optional) update dependencies
npm update
# run serverless-dns on node
./run n
# run a clinicjs.org profiler
./run n [cpu|fn|mem]
での:
# install deno.land v1.18+
# https://github.com/denoland/deno/#install
curl -fsSL https://deno.land/install.sh | sh
# run serverless-dns on deno
./run d
ラングラー:
# install Cloudflare Workers (cli) aka Wrangler
# https://developers.cloudflare.com/workers/cli-wrangler/install-update
npm i @cloudflare/wrangler -g
# run serverless-dns on Cloudflare Workers (cli)
# Make sure to setup Wrangler first:
# https://developers.cloudflare.com/workers/cli-wrangler/authentication
./run w
# profile wrangler with Chrome DevTools
# blog.cloudflare.com/profiling-your-workers-with-wrangler
このリポジトリでコミットすると、Google JavaScript スタイル ガイドが適用されます (参照: .eslintrc.cjs )。
pre-commitファイルに対してリンター (eslint) とフォーマッター (prettier) を実行する gitフック
.js。
git commit --no-verifyこのフックをバイパスするために使用します。
プル リクエストのコード スタイル違反もチェックされ、可能な場合は自動的に修正されます。
構成
.env( ref ) または
env.jsデフォルトを微調整する必要がある場合。ファイル内の値は、に
.env設定された対応する変数よりも優先され
env.jsます。Cloudflare Workers の場合は
wrangler.toml、代わりに で環境変数をセットアップします。
src/server-[node|workers|deno]<->
doh.js<->
plugin.js
plugin.js流れ: -
userOperation.js>
cacheResponse.js->
cc.js->
dnsResolver.js
Deno Deploy (クラウド) と Deno (ランタイム) は同じ API サーフェスを公開しません (たとえば、Deno Deploy は HTTP/S サーバーリスナーのみをサポートしますが、Deno はプレーンな HTTP と HTTP に加えて raw TCP/UDP/TLS をサポートします) /S)。
ノードを除き、環境変数/
serverless-dnsで定義された DoH アップストリームを使用します。Node では、デフォルトの DNS アップストリームは( ref ) です。
CF_DNS_RESOLVER_URL
CF_DNS_RESOLVER_URL_2
1.1.1.2
Node と Deno のエントリポイントはそれぞれ でありsrc/server-node.js
、src/server-deno.ts
どちらも TCP-over-TLS、HTTP/S 接続をリッスンします。一方、HTTP (cli) または HTTP/S (prod) のみをリッスンする Cloudflare ワーカーのエントリポイントはsrc/server-workers.js
.
Deno での prod セットアップと Node でのローカル (非 prod) セットアップの場合、
key(プライベート) および
cert(パブリック チェーン) ファイルは、デフォルトで、env vars
TLS_KEY_PATHおよび
TLS_CRT_PATH.
Node (Fly.io) での prod セットアップの場合は、次のように、env var ( ref ) でエンコードされたbase64またはに
TLS_OFFLOAD設定する必要が あります。
true
key
cert
TLS_CERTKEY
# EITHER: offload tls to fly.io and set tls_offload to true
TLS_OFFLOAD="true"
# OR: base64 representation of both key (private) and cert (public chain)
TLS_CERTKEY="KEY=b64_key_content\nCRT=b64_cert_content"
プロセスの起動は、これらのランタイムごとに異なります。ノードの場合、起動src/core/node/config.js
を管理します。一方、Deno の場合はで、Workers の場合はです。
pub-sub は、さまざまなモジュール間で起動フェーズを調整します。src/core/deno/config.ts
src/core/workers/config.js
src/system.js
Node と Deno では、インプロセス DNS キャッシング@serverless-dns/lfu-cache
が使用されます。Cloudflare ワーカーでは、キャッシュ Web APIとインプロセス キャッシュの両方が使用されます。3 つのプラットフォームすべてでキャッシュを完全に無効にするには、env var, を設定し
PROFILE_DNS_RESOLVES=trueます。
Cloudflare Workers と Deno Deploy は一時的なものです。つまり、クライアント リクエストを処理するプロセスは長続きせず、実際には、2 つの連続したリクエストが 2 つの異なるアイソレート(プロセス) によって処理される可能性があります。Node を実行する Fly.io 上のリゾルバーは、永続的な VMによって支えられているため、従来の「サーバーフル」環境のように長寿命です。
Cloudflare ワーカーのビルド時およびランタイム構成は で定義されていwrangler.toml
ます。
Webpack5 はファイルを ESM モジュールにバンドルし、Wranglerによって Cloudflare にアップロードします。
Deno Deploy の場合、コードベースは単一の JavaScript ファイルにまとめられ、
deno bundleDeno.com に渡されます。
Node を実行する Fly.io の場合、ランタイム ディレクティブは(およびデプロイメント タイプfly.toml
によって使用される) で定義され、デプロイ ディレクティブは で定義されます。それに応じて、Fly.io のインフラストラクチャにセットアップします。
dev
live
node.Dockerfile
flyctl
serverless-dns
TLS ターミネーションを Fly.io にオフロードするデプロイ (
B1デプロイ タイプ) の場合、代わりにランタイム ディレクティブが で定義され
fly.tls.toml、ポート 443 で HTTP2 Cleartext と HTTP/1.1 を設定し、ポート 853 で DNS over TCP を設定します。
参照: github/ワークフロー.
190 以上のブロックリストがSuccinct Radix Trie ( Steve Hanov の impl に基づく)で圧縮され、lookup
「簡潔さ」を犠牲にして文字列検索 ( ) を高速化するための変更が加えられています。ブロックリストは unix タイムスタンプ (env var: ) でバージョン管理され、毎週 1 回生成されます
CF_LATEST_BLOCKLIST_TIMESTAMPが、できれば毎日または毎時間生成したいと考えています。 実行時のブリングアップ中、またはDNS リクエストの 処理中にレイジーに基数トライをセットアップするために必要な3 つのブロックリスト ファイルをダウンロードします。
CF_BLOCKLIST_URL
serverless-dns
serverless-dns約 500 万のエントリ (2022 年 2 月現在) を、約 190 以上のブロックリストから簡潔な基数トライにコンパイルします。これらはserverless-dns/blocklistsリポジトリで定義されています。