serverless-dns - Cloudflare Workers、Deno Deploy、および Fly.io にデプロイする RethinkDNS リゾルバー

(The RethinkDNS resolver that deploys to Cloudflare Workers, Deno Deploy, and Fly.io)

Created at: 2021-03-10 22:35:30
Language: JavaScript
License: MPL-2.0

それは鳥であり、飛行機であり、それは...自己ホスト型の pi-hole 風の DNS リゾルバーです

serverless-dnsは、Pi-Hole 風のコンテンツ ブロッキング、サーバーレス、スタブ DNS-over-HTTPS (DoH) および DNS-over-TLS (DoT) リゾルバーです。Cloudflare Workers、Deno Deploy、およびFly.ioですぐに実行できます。これらすべてのサービスの無料利用枠は、1 か月あたり 10 ~ 20 台のデバイスに相当する DNS トラフィックをカバーするのに十分なはずです.

RethinkDNS リゾルバー

RethinkDNS は

serverless-dns
、次のエンドポイントで本番環境で実行されます。

クラウド プラットフォーム サーバーの場所 プロトコル ドメイン 使用法
Cloudflare ワーカー 200+ ( ping ) DoH
basic.rethinkdns.com
構成、設定
🦕デノデプロイ 30+ ( ping ) DoH プライベートベータ
🪂Fly.io 30+ ( ping ) DoH と DoT
max.rethinkdns.com
構成、設定

サーバー側の処理には 0 ミリ秒 (ms) から 2 ミリ秒 (中央値) かかり、エンドツーエンドの待機時間 (地域やネットワークによって異なります) は 10 ミリ秒から 30 ミリ秒 (中央値) です。

セルフホスト

Cloudflare Workers はセットアップが最も簡単なプラットフォームです

serverless-dns

Cloudflare ワーカーにデプロイする

詳しい手順については、次を参照してください。

プラットホーム 困難 ランタイム ドク
クラウドフレア 簡単 v8 分離株 Cloudflare ワーカーでのホスティング
🦕Deno.com 適度 デノ 分離株 Deno.com でのホスティング
🪂Fly.io 難しい ノード 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
、代わりに で環境変数をセットアップします。

ご依頼の流れ

  1. リクエスト/レスポンス フロー: client <->
    src/server-[node|workers|deno]
    <->
    doh.js
    <->
    plugin.js
  2. 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 bundle
Deno.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リポジトリで定義されています。