Dnscrypt-proxy
dnscrypt-proxy は、暗号化された DNS プロトコル DNSoverHTTPS と [1] をサポートする DNS プロキシクライアントです。これは、man-in-the-middle 攻撃や盗聴を防ぐために使用できます。dnscrypt-proxy は DNSSEC とも互換性があります。
インストール
dnscrypt-proxy パッケージを インストール してください。
設定
スタートアップ
このサービスは2つの互いに排他的な方法で 起動 することができます (つまり、どちらか一方しか 有効化 できません。)
- systemd サービス
dnscrypt-proxy.service
を利用する場合。- サービスを利用する際には、設定ファイルに
listen_addresses
オプションを設定 (例:listen_addresses = ['127.0.0.1:53', '[::1]:53']
) しなければなりません。
- サービスを利用する際には、設定ファイルに
dnscrypt-proxy.socket
によるソケットアクティベーションを経て。- ソケットの設定は systemd が行うので、設定ファイルの
listen_addresses
オプションは空にしておく必要があります。 (つまりlisten_addresses = [ ]
)
- ソケットの設定は systemd が行うので、設定ファイルの
リゾルバの選択
設定ファイル 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 はローカル DNS キャッシュのフォワーダとして実行することが推奨されています。キャッシュ機能を使わないと全てのクエリーが上流のリゾルバを往復することになります。ローカル DNS キャッシュプログラムならどれでも動作します。dnscrypt-proxy の設定に加えて、ローカル DNS キャッシュプログラムの設定も必要です。
ポートの変更
ローカル 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
ローカル DNS キャッシュの設定例
以下の設定で dnscrypt-proxy をポート 5353
から使うようになります。
Unbound
(Unbound#ローカル DNS サーバーを見ながら) 自由に Unbound を設定してから /etc/unbound/unbound.conf
の server
セクションの最後に以下の行を追加してください:
do-not-query-localhost: no forward-zone: name: "." forward-addr: 127.0.0.1@5353
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.service
と dnscrypt-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.service
と dnscrypt-proxy.socket
を明示的に停止・無効化する必要があります。
その後、dnscrypt-proxy@dnscrypt.eu-nl
などの新しいサービスを起動・有効化してください。
最後に unbound.service
を再起動してください。
トラブルシューティング
root 権限で dnscrypt が実行される
詳しくは FS#49881 を見てください。root 権限を使わない場合、dnscrypt-proxy.service
を編集して以下のように設定してください:
[Service] DynamicUser=yes
上記の設定は#サンドボックス化の設定と組み合わせることができます。