Dnscrypt-proxy

提供: ArchWiki
2022年7月22日 (金) 15:45時点におけるKgx (トーク | 投稿記録)による版 (→‎設定: スタートアップを翻訳して追加)
ナビゲーションに移動 検索に移動

dnscrypt-proxy は、暗号化された DNS プロトコル DNSoverHTTPS[1] をサポートする DNS プロキシクライアントです。これは、man-in-the-middle 攻撃や盗聴を防ぐために使用できます。dnscrypt-proxyDNSSEC とも互換性があります。

インストール

dnscrypt-proxy パッケージを インストール してください。

設定

スタートアップ

ノート: プロキシを起動する方法は2つありますが、upstream では service の方を推奨しています [2] [3]

このサービスは2つの互いに排他的な方法で 起動 することができます (つまり、どちらか一方しか 有効化 できません。)

  1. systemd サービス dnscrypt-proxy.service を利用する場合。
    • サービスを利用する際には、設定ファイルに listen_addresses オプションを設定 (例:listen_addresses = ['127.0.0.1:53', '[::1]:53']) しなければなりません。
  2. dnscrypt-proxy.socket によるソケットアクティベーションを経て。
    • ソケットの設定は systemd が行うので、設定ファイルの listen_addresses オプションは空にしておく必要があります。 (つまり listen_addresses = [ ])

リゾルバの選択

設定ファイル server_names をコメントアウトしたままにしておくと、dnscrypt-proxy は既に [sources] で設定されているソースから最も速いサーバを選択するようになります。[4]で設定済みです。 リストはダウンロードされ、検証され、自動的に更新されます [5] このように、特定のサーバを設定することは任意です。

どのサーバを使用するかを手動で設定するには、 /etc/dnscrypt-proxy/dnscrypt-proxy.toml を編集して server_names 変数のコメントを外し、サーバの一つまたは複数を選択します。例えば、Cloudflare のサーバを利用する場合。

server_names = ['cloudflare', 'cloudflare-ipv6']

リゾルバの全リストは upstream page または Github にあります。以前、dnscrypt-proxyがシステム上で正常に動作していた場合、 /var/cache/dnscrypt-proxy/public-resolvers.md にもリストが含まれています。DNSSEC を検証し、ログを取らず、検閲されないサーバについては、その説明を見てください。これらの要件は require_dnssec, require_nolog, require_nofilter オプションでグローバルに設定することが可能です。

resolv.conf の編集

dnscrypt リゾルバを選択したら resolv.conf ファイルを編集してリゾルバのアドレスを localhost のアドレスに置き換えてください:

nameserver 127.0.0.1

他のプログラムによって上記の設定が上書きされないように注意してください。詳しくは resolv.conf#DNS 設定の保護 を参照。

systemd サービスの起動

最後に、dnscrypt-proxy.service起動有効化 してください。

ヒントとテクニック

ローカル DNS キャッシュの設定

ノート: dnscrypt はエントリをキャッシュするとき他のプログラムを必要としません。キャッシュ機能を使うには dnscrypt の設定ファイルで LocalCache on となっていることを確認してください。

DNSCrypt はローカル DNS キャッシュのフォワーダとして実行することが推奨されています。キャッシュ機能を使わないと全てのクエリーが上流のリゾルバを往復することになります。ローカル DNS キャッシュプログラムならどれでも動作します。dnscrypt-proxy の設定に加えて、ローカル DNS キャッシュプログラムの設定も必要です。

ポートの変更

ノート: パッケージに同梱されている systemd ユニットを使用している場合、/etc/dnscrypt-proxy.conf で IP アドレスやポートを変更しても反映されません [6]。以下に書かれているようにパッケージに含まれている systemd ソケットを変更する必要があります。

ローカル DNS キャッシュに転送するには、dnscrypt-proxy がデフォルトの 53 ポートと異なるポートを listen する必要があります。53 を使用するのは DNS キャッシュにして、異なるポートから dnscrypt-proxy に問い合わせるようにするためです。このセクションでは例としてポート番号 5353 を使っています。ポート番号が 1024 より大きいため dnscrypt-proxy を root で実行する必要はありません。dnscrypt-proxy.socket を以下の内容で編集してください:

[Socket]
ListenStream=
ListenDatagram=
ListenStream=127.0.0.1:5353
ListenDatagram=127.0.0.1:5353
ノート: UDP ポートの 5353Avahi が使用するため、(Avahi をインストール・起動している場合) ジャーナルに警告が表示され Avahi の mDNS が不安定になる可能性があります。

ローカル DNS キャッシュの設定例

以下の設定で dnscrypt-proxy をポート 5353 から使うようになります。

Unbound

(Unbound#ローカル DNS サーバーを見ながら) 自由に Unbound を設定してから /etc/unbound/unbound.confserver セクションの最後に以下の行を追加してください:

do-not-query-localhost: no
forward-zone:
  name: "."
  forward-addr: 127.0.0.1@5353
ヒント: サーバーを設定するとき、server: セクションの中に interface: 0.0.0.0@53access-control: your-network/subnet-mask allow を追加することで他のコンピュータもサーバーに接続できるようになります。クライアントの方では /etc/resolv.confnameserver address-of-your-server と設定してください。

unbound.service再起動すると変更が適用されます。

dnsmasq

dnsmasq をローカル DNS キャッシュとして設定してください。DNSCrypt を使用する場合の基本設定:

/etc/dnsmasq.conf
no-resolv
server=127.0.0.1#5353
listen-address=127.0.0.1

DNSSEC が有効になっているリゾルバを使うように DNSCrypt を設定した場合、dnsmasq でも DNSSEC を有効にするようにしてください:

/etc/dnsmasq.conf
proxy-dnssec

dnsmasq.service再起動すると変更が適用されます。

pdnsd

pdnsd をインストールしてください。DNSCrypt を使用する基本設定:

/etc/pdnsd.conf
global {
    perm_cache = 1024;
    cache_dir = "/var/cache/pdnsd";
    run_as = "pdnsd";
    server_ip = 127.0.0.1;
    status_ctl = on;
    query_method = udp_tcp;
    min_ttl = 15m;       # Retain cached entries at least 15 minutes.
    max_ttl = 1w;        # One week.
    timeout = 10;        # Global timeout option (10 seconds).
    neg_domain_pol = on;
    udpbufsize = 1024;   # Upper limit on the size of UDP messages.
}

server {
    label = "dnscrypt-proxy";
    ip = 127.0.0.1;
    port = 5353;
    timeout = 4;
    proxy_only = on;
}

source {
    owner = localhost;
    file = "/etc/hosts";
}

pdnsd.service を再起動すれば変更が適用されます。

サンドボックス化

dnscrypt-proxy.service編集して以下の行を記述してください:

[Service]
CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID
ProtectSystem=strict
ProtectHome=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
PrivateTmp=true
PrivateDevices=true
MemoryDenyWriteExecute=true
NoNewPrivileges=true
RestrictRealtime=true
RestrictAddressFamilies=AF_INET AF_INET6
SystemCallArchitectures=native
SystemCallFilter=~@clock @cpu-emulation @debug @keyring @ipc @module @mount @obsolete @raw-io

詳しくは systemd.exec(5)Systemd#アプリケーション環境のサンドボックス化を参照してください。また、上流のコメント も見てください。

上記の設定は #root 権限で dnscrypt が実行されるの設定と組み合わせることができます。

EDNS0 の有効化

Extension Mechanisms for DNS を使うことで UDP の応答のサイズを指定することができます。

以下の行を /etc/resolv.conf に追加してください:

options edns0

また、以下を /etc/dnscrypt-proxy.conf に追加すると良いでしょう:

EDNSPayloadSize <bytes>

<bytes> は適当な数字に置き換えてください。デフォルトのサイズは 1252 ですが、4096 バイトまでなら問題なく設定できます。512 バイト以下の値に設定するとクライアントがペイロードのサイズが含まれた OPT セクションが付随するパケットを送信しないかぎり、EDNS は無効化されます。

EDNS0 のテスト

DNS Reply Size Test Server を利用して、ldns パッケージに含まれているコマンドラインツール drill を使って rs.dns-oarc.net の TXT クエリを実行してみてください:

$ drill rs.dns-oarc.net TXT

EDNS0 がサポートされていれば、出力の "answer section" は以下のようになります:

rst.x3827.rs.dns-oarc.net.
rst.x4049.x3827.rs.dns-oarc.net.
rst.x4055.x4049.x3827.rs.dns-oarc.net.
"2a00:d880:3:1::a6c1:2e89 DNS reply size limit is at least 4055 bytes"
"2a00:d880:3:1::a6c1:2e89 sent EDNS buffer size 4096"

DNSCrypt プロバイダの冗長性

オリジナルの dnscrypt-proxy.servicednscrypt-proxy.socket をコピーすることで複数の異なる dnscrypt プロバイダを使うことが可能です。コピーしたサービスのコマンドラインパラメータを変更して、新しい設定ファイルを指定するか、別のリゾルバを直接指定してください。そして新しくコピーしたソケットのポートを変更してください。最後に、ローカル DNS キャッシュプログラムの設定を変更して新しいサービスのポートを使うようにしてください。例えば、オリジナルのソケットで 5353 ポートを使って新しいソケットでは 5354 を使うようにする場合、unbound の設定ファイルは以下のようになります:

/etc/unbound/unbound.conf
 do-not-query-localhost: no
 forward-zone:
   name: "."
   forward-addr: 127.0.0.1@5353
   forward-addr: 127.0.0.1@5354

インスタンス化した systemd サービスの作成

systemd サービスをコピーする代わりにインスタンス化したサービスを使用するという方法もあります。

systemd ファイルの作成

まず、以下の内容で /etc/systemd/system/dnscrypt-proxy@.service を作成:

[Unit]
Description=DNSCrypt client proxy
Documentation=man:dnscrypt-proxy(8)
Requires=dnscrypt-proxy@%i.socket

[Service]
Type=notify
NonBlocking=true
ExecStart=/usr/bin/dnscrypt-proxy \
    --resolver-name=%i
Restart=always

上記のサービスで指定されたインスタンス systemd サービスは対応する .socket ファイルの @ 記号の後に入力されたサービス名を使って dnscrypt-proxy を起動します。

dnscrypt-sockets の追加

複数の dnscrypt-proxy ソケットを作成するために、/usr/lib/systemd/system/dnscrypt-proxy.socket を新しいファイル (/etc/systemd/system/dnscrypt-proxy@short-name.here.socket) にコピーしてソケットのインスタンス名を dnscrypt-resolvers.csv に記載されている省略名のどれかに置き換えてポートを変更してください。インスタンスごとに別々のポートを使用するようにしてください (5353, 5354 など)。

新しい systemd 設定の適用

設定したら systemd の設定をリロードする必要があります:

# systemctl daemon-reload

デフォルトのサービスを別の名前で置き換えるため、dnscrypt-proxy.servicednscrypt-proxy.socket を明示的に停止無効化する必要があります。

その後、dnscrypt-proxy@dnscrypt.eu-nl などの新しいサービスを起動有効化してください。

最後に unbound.service再起動してください。

トラブルシューティング

root 権限で dnscrypt が実行される

詳しくは FS#49881 を見てください。root 権限を使わない場合、dnscrypt-proxy.service編集して以下のように設定してください:

[Service]
DynamicUser=yes

上記の設定は#サンドボックス化の設定と組み合わせることができます。