「Dnscrypt-proxy」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
 
(4人の利用者による、間の13版が非表示)
1行目: 1行目:
[[Category:Domain Name System]]
+
[[Category:ドメインネームシステム]]
[[Category:セキュリティ]]
+
[[Category:暗号化]]
 
[[en:DNSCrypt]]
 
[[en:DNSCrypt]]
 
[[es:DNSCrypt]]
 
[[es:DNSCrypt]]
 
[[pt:DNSCrypt]]
 
[[pt:DNSCrypt]]
  +
[https://github.com/jedisct1/dnscrypt-proxy dnscrypt-proxy] は、暗号化された DNS プロトコル [[ドメイン名前解決#DNS 設定の保護|DNSoverHTTPS]] と [https://dnscrypt.info/DNSCrypt] をサポートする DNS プロキシクライアントです。これは、man-in-the-middle 攻撃や盗聴を防ぐために使用できます。''dnscrypt-proxy'' は [[DNSSEC]] とも互換性があります。
[http://dnscrypt.org/ DNSCrypt] はユーザーと DNS リゾルバの間の DNS トラフィックを暗号化するソフトウェアです。盗聴や改竄、中間者攻撃を防ぎます。
 
   
 
== インストール ==
 
== インストール ==
   
[[公式リポジトリ]]から {{Pkg|dnscrypt-proxy}} を[[インストール]]してください。
+
{{Pkg|dnscrypt-proxy}} パッケージ [[インストール]] してください。
   
 
== 設定 ==
 
== 設定 ==
   
  +
=== スタートアップ ===
{{Tip|DNSCrypt が自動的にリゾルバを選ぶようにしたい場合、[[AUR]] の {{AUR|dnscrypt-autoinstall}} を使って下さい。}}
 
   
  +
{{Note|プロキシを起動する方法は2つありますが、upstream では {{ic|service}} の方を推奨しています [https://github.com/DNSCrypt/dnscrypt-proxy/wiki/Installation-linux#systemd-sockets-activation] [https://github.com/DNSCrypt/dnscrypt-proxy/wiki/systemd]}}
デフォルトで ({{ic|dnscrypt-proxy.service}} から読み込まれる) {{ic|/etc/conf.d/dnscrypt-proxy}} に ''dnscrypt-proxy'' が設定されており、{{ic|127.0.0.1}} から [https://opendns.com OpenDNS] リゾルバへのリクエストを承諾するようになっています。他に使えるリゾルバは [https://github.com/jedisct1/dnscrypt-proxy/blob/master/dnscrypt-resolvers.csv パブリックリゾルバのリスト] を見て下さい。できるかぎり遅延を抑えるために、地理的に近いリゾルバを選択してください。
 
   
  +
このサービスは2つの互いに排他的な方法で [[起動]] することができます (つまり、どちらか一方しか [[有効化]] できません。)
デフォルトの設定では、[[resolv.conf]] ファイルを変更してリゾルバのアドレスをローカルホストに置き換える必要があります:
 
  +
  +
# systemd サービス {{ic|dnscrypt-proxy.service}} を利用する場合。
  +
#* サービスを利用する際には、設定ファイルに {{ic|listen_addresses}} オプションを設定 (例:{{ic|1=listen_addresses = ['127.0.0.1:53', '[::1]:53']}}) しなければなりません。
  +
# {{ic|dnscrypt-proxy.socket}} によるソケットアクティベーションを経て。
  +
#* ソケットの設定は systemd が行うので、設定ファイルの {{ic|listen_addresses}} オプションは空にしておく必要があります。 (つまり {{ic|1=listen_addresses = [ ]}})
  +
  +
=== リゾルバの選択 ===
  +
  +
設定ファイル {{ic|server_names}} をコメントアウトしたままにしておくと、''dnscrypt-proxy'' は既に {{ic|[sources]}} で設定されているソースから最も速いサーバを選択するようになります。[https://github.com/jedisct1/dnscrypt-proxy/wiki/Configuration#an-example-static-server-entry]で設定済みです。 リストはダウンロードされ、検証され、自動的に更新されます [https://github.com/jedisct1/dnscrypt-proxy/wiki/Configuration-Sources#what-is-the-point-of-these-lists]
  +
このように、特定のサーバを設定することは任意です。
  +
  +
どのサーバを使用するかを手動で設定するには、 {{ic|/etc/dnscrypt-proxy/dnscrypt-proxy.toml}} を編集して {{ic|server_names}} 変数のコメントを外し、サーバの一つまたは複数を選択します。例えば、Cloudflare のサーバを利用する場合。
  +
  +
server_names = ['cloudflare', 'cloudflare-ipv6']
  +
  +
リゾルバの全リストは [https://download.dnscrypt.info/resolvers-list/v3/public-resolvers.md upstream page] または [https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/public-resolvers.md Github] にあります。以前、''dnscrypt-proxy''がシステム上で正常に動作していた場合、 {{ic|/var/cache/dnscrypt-proxy/public-resolvers.md}} にもリストが含まれています。[[DNSSEC]] を検証し、ログを取らず、検閲されないサーバについては、その説明を見てください。これらの要件は {{ic|require_dnssec}}, {{ic|require_nolog}}, {{ic|require_nofilter}} オプションでグローバルに設定することが可能です。
  +
  +
=== ポート53にバインドされているサービスをすべて無効にする ===
  +
  +
{{Tip|ローカル DNS キャッシュとして [[DNSCrypt#Unbound|Unbound]] を使っている場合、''unbound'' はデフォルトでポート 53 で動作するので、このセクションは無視してもかまいません。}}
  +
  +
ポート53を使用しているプログラムがあるかどうかを確認するには、以下を実行してください。
  +
  +
$ ss -lp 'sport = :domain'
  +
  +
{{Accuracy|systemd-resolved は 127.0.0.53:53 で待ち受けますが、127.0.0.1:53 で待ち受ける dnscrypt-proxy には影響しないはずです。}}
  +
  +
出力に最初の行以上のカラム名が含まれている場合、ポート53を使用しているサービスを無効化する必要があります。よくある原因は {{ic|systemd-resolved.service}}([https://wiki.archlinux.org/title/NetworkManager#Unit_dbus-org.freedesktop.resolve1.service_not_found NetworkManager#Unit dbus-org.freedesktop.resolve1.service not found]) ですが、他のネットワークマネージャにも類似のコンポーネントがあるかもしれません。上記のコマンドで次の行以外何も出力されなくなったら、次に進む準備ができています。
  +
  +
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
  +
  +
=== resolv.conf の編集 ===
  +
  +
dnscrypt リゾルバを選択したら [[resolv.conf]] ファイルを編集してリゾルバのアドレスを ''localhost'' のアドレスに置き換えてください
  +
  +
アドレスとオプション [https://github.com/jedisct1/dnscrypt-proxy/wiki/Installation-linux# step-4-change-the-system-dns-settings]
  +
  +
nameserver ::1
 
nameserver 127.0.0.1
 
nameserver 127.0.0.1
  +
options edns0
   
他のプログラムによって [[resolv.conf]] 換えられないようにしてください。詳しくは [[resolv.conf#DNS 設定の保護]] を参照。
+
他のプログラムによって上記の設定上書れないように注意してください。詳しくは [[resolv.conf#DNS 設定の保護]] を参照。
   
== 起動 ==
+
=== systemd サービスの起動 ===
   
[[systemd]] サービスを使って起動できます: {{ic|dnscrypt-proxy.service}}
+
最後に、{{ic|dnscrypt-proxy.service}} を [[起動]]・[[有効化]] してください。
   
  +
=== dnscrypt-proxy が動作しているかどうかの確認 ===
== Tips and tricks ==
 
   
  +
ブラウザを開き、[https://dnsleaktest.com DnsLeakTest] にアクセスし、拡張テストを行います。結果が設定ファイルに設定したサーバを表示していれば、dnscrypt-proxy が機能していることになります。そうでなければ、何かが間違っていることになります。
=== DNSCrypt で DNS ローカルキャッシュを転送 ===
 
   
  +
== ヒントとテクニック ==
DNSCrypt をローカル DNS キャッシュのフォワーダとして実行することが推奨されています。そうしないと全てのクエリーが上流のリゾルバを往復することになります。ローカル DNS キャッシュプログラムならどれでも動作します。以下では [[Unbound]], [[dnsmasq]], [[pdnsd]] の設定例を紹介します。
 
   
==== 例: Unbound の設定 ====
+
=== ローカル DNS キャッシュの設定 ===
   
  +
{{Note|''dnscrypt'' はエントリをキャッシュするとき他のプログラムを必要としません。キャッシュ機能を使うには dnscrypt の設定ファイルで {{ic|LocalCache on}} となっていることを確認してください。}}
自由に [[Unbound]] を設定 ([[Unbound#Set /etc/resolv.conf to use the local DNS server|ローカル DNS サーバーを使うように /etc/resolv.conf を設定]]するのを忘れずに]) してから以下の行を {{ic|/etc/unbound/unbound.conf}} の {{ic|server}} セクションの最後に追加してください:
 
do-not-query-localhost: no
 
forward-zone:
 
name: "."
 
forward-addr: 127.0.0.1@40
 
   
  +
DNSCrypt はローカル DNS キャッシュのフォワーダとして実行することが推奨されています。キャッシュ機能を使わないと全てのクエリーが上流のリゾルバを往復することになります。ローカル DNS キャッシュプログラムならどれでも動作します。''dnscrypt-proxy'' の設定に加えて、ローカル DNS キャッシュプログラムの設定も必要です。
{{Note|Port 40 is given as an example as Unbound by default listens to 53, these must be different.}}
 
   
  +
==== ポートの変更 ====
{{Tip|If you are setting up a server add {{ic|interface: 0.0.0.0@53}} and {{ic|access-control: ''your-network''/''subnet-mask'' allow}} inside the {{ic|server:}} section so that the other computers of your LAN can connect to the server. A client must be configured with {{ic|nameserver ''address-of-your-server''}} in {{ic|/etc/resolv.conf}}.}}
 
   
  +
{{Note|パッケージに同梱されている systemd ユニットを使用している場合、{{ic|/etc/dnscrypt-proxy.conf}} で IP アドレスやポートを変更しても反映されません [https://web.archive.org/web/20171215112100/https://github.com/jedisct1/dnscrypt-proxy/issues/528]。以下に書かれているようにパッケージに含まれている systemd ソケットを変更する必要があります。}}
[[systemd]] サービス {{ic|unbound.service}} を起動してください。そして Unbound の {{ic|forward-zone}} IP とポートを DNSCrypt の {{ic|/etc/conf.d/dnscrypt-proxy}} に設定します:
 
DNSCRYPT_LOCALIP=127.0.0.1
 
DNSCRYPT_LOCALPORT=40
 
   
  +
ローカル DNS キャッシュに転送するには、''dnscrypt-proxy'' がデフォルトの {{ic|53}} ポートと異なるポートを listen する必要があります。{{ic|53}} を使用するのは DNS キャッシュにして、異なるポートから ''dnscrypt-proxy'' に問い合わせるようにするためです。このセクションでは例としてポート番号 {{ic|5353}} を使っています。ポート番号が 1024 より大きいため ''dnscrypt-proxy'' を root で実行する必要はありません。{{ic|dnscrypt-proxy.socket}} を以下の内容で[[systemd#ユニットファイルの編集|編集]]してください:
{{Note|DNSCrypt needs to start before Unbound, so include {{ic|unbound.service}} on a {{ic|1=Before=}} line in the {{ic|[Unit]}} section of {{ic|dnscrypt-proxy.service}}.}}
 
   
  +
[Socket]
{{ic|dnscrypt-proxy.service}} と {{ic|unbound.service}} を再起動すると変更が適用されます。
 
  +
ListenStream=
  +
ListenDatagram=
  +
ListenStream=127.0.0.1:5353
  +
ListenDatagram=127.0.0.1:5353
   
  +
{{Note|UDP ポートの {{ic|5353}} は [[Avahi#ファイアウォール|Avahi]] が使用するため、(Avahi をインストール・起動している場合) ジャーナルに警告が表示され [[Avahi]] の mDNS が不安定になる可能性があります。}}
==== 例: dnsmasq の設定 ====
 
   
dnsmasq を[[dnsmasq#DNS キャッシュの設定|ローカル DNS キャッシュ]]として設定してください。DNSCrypt を使用する場合の基本設定:
+
==== ローカル DNS キャッシュ設定 ====
  +
  +
以下の設定で ''dnscrypt-proxy'' をポート {{ic|5353}} から使うようになります。
  +
  +
===== Unbound =====
  +
  +
([[Unbound#ローカル DNS サーバー]]を見ながら) 自由に [[Unbound]] を設定してから {{ic|/etc/unbound/unbound.conf}} の {{ic|server}} セクションの最後に以下の行を追加してください:
  +
  +
do-not-query-localhost: no
  +
forward-zone:
  +
name: "."
  +
forward-addr: 127.0.0.1@5353
  +
  +
{{Tip|サーバーを設定するとき、{{ic|server:}} セクションの中に {{ic|interface: 0.0.0.0@53}} と {{ic|access-control: ''your-network''/''subnet-mask'' allow}} を追加することで他のコンピュータもサーバーに接続できるようになります。クライアントの方では {{ic|/etc/resolv.conf}} に {{ic|nameserver ''address-of-your-server''}} と設定してください。}}
  +
  +
{{ic|unbound.service}} を[[再起動]]すると変更が適用されます。
  +
  +
===== dnsmasq =====
  +
  +
dnsmasq を[[dnsmasq#DNS キャッシュの設定|ローカル DNS キャッシュ]]として設定してください。DNSCrypt を使用する場合の基本設定:
   
 
{{hc|/etc/dnsmasq.conf|2=
 
{{hc|/etc/dnsmasq.conf|2=
 
no-resolv
 
no-resolv
server=127.0.0.2#2053
+
server=127.0.0.1#5353
 
listen-address=127.0.0.1
 
listen-address=127.0.0.1
 
}}
 
}}
67行目: 123行目:
 
}}
 
}}
   
  +
{{ic|dnsmasq.service}} を[[再起動]]すると変更が適用されます。
dnsmasq がクエリーを飛ばす {{ic|127.0.0.2}} で待機するように DNSCrypt を設定:
 
   
  +
===== pdnsd =====
{{hc|/etc/conf.d/dnscrypt-proxy|2=
 
DNSCRYPT_LOCALIP=127.0.0.2
 
DNSCRYPT_LOCALPORT=2053
 
}}
 
 
{{ic|dnscrypt-proxy.service}} と {{ic|dnsmasq.service}} を再起動すれば変更が適用されます。
 
 
==== 例: pdnsd の設定 ====
 
   
 
[[pdnsd]] をインストールしてください。DNSCrypt を使用する基本設定:
 
[[pdnsd]] をインストールしてください。DNSCrypt を使用する基本設定:
82行目: 131行目:
 
{{hc|/etc/pdnsd.conf|2=
 
{{hc|/etc/pdnsd.conf|2=
 
global {
 
global {
perm_cache=16384;
+
perm_cache = 1024;
cache_dir="/var/cache/pdnsd";
+
cache_dir = "/var/cache/pdnsd";
run_as="pdnsd";
+
run_as = "pdnsd";
server_ip = 127.0.0.1;
+
server_ip = 127.0.0.1;
status_ctl = on;
+
status_ctl = on;
query_method=udp_tcp;
+
query_method = udp_tcp;
min_ttl=15m; # Retain cached entries at least 15 minutes.
+
min_ttl = 15m; # Retain cached entries at least 15 minutes.
max_ttl=1w; # One week.
+
max_ttl = 1w; # One week.
timeout=10; # Global timeout option (10 seconds).
+
timeout = 10; # Global timeout option (10 seconds).
neg_domain_pol=on;
+
neg_domain_pol = on;
udpbufsize=1024; # Upper limit on the size of UDP messages.
+
udpbufsize = 1024; # Upper limit on the size of UDP messages.
 
}
 
}
   
 
server {
 
server {
label = "dnscrypt-proxy";
+
label = "dnscrypt-proxy";
ip = 127.0.0.2;
+
ip = 127.0.0.1;
port = 53;
+
port = 5353;
timeout = 4;
+
timeout = 4;
  +
proxy_only = on;
uptest = query;
 
interval = 15m;
 
proxy_only=on;
 
 
}
 
}
   
 
source {
 
source {
owner=localhost;
+
owner = localhost;
file="/etc/hosts";
+
file = "/etc/hosts";
 
}
 
}
  +
}}
   
  +
{{ic|pdnsd.service}} を再起動すれば変更が適用されます。
   
  +
=== サンドボックス化 ===
rr {
 
name=localhost;
 
reverse=on;
 
a=127.0.0.1;
 
owner=localhost;
 
soa=localhost,root.localhost,42,86400,900,86400,86400;
 
}
 
}}
 
   
  +
{{ic|dnscrypt-proxy.service}} を[[systemd#ユニットファイルの編集|編集]]して以下の行を記述してください:
Configure DNSCrypt to listen on {{ic|127.0.0.2:53}} where pdnsd will be querying. The following has an example provider already in place. Be sure to use the provider you have chosen.
 
   
  +
[Service]
{{hc|/etc/conf.d/dnscrypt-proxy|2=
 
  +
CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID
DNSCRYPT_LOCALIP=127.0.0.2
 
  +
ProtectSystem=strict
DNSCRYPT_LOCALPORT=53
 
  +
ProtectHome=true
DNSCRYPT_USER=nobody
 
  +
ProtectKernelTunables=true
DNSCRYPT_PROVIDER_NAME=2.dnscrypt-cert.opendns.com
 
  +
ProtectKernelModules=true
DNSCRYPT_PROVIDER_KEY=B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79
 
  +
ProtectControlGroups=true
DNSCRYPT_RESOLVERIP=208.67.220.220
 
  +
PrivateTmp=true
DNSCRYPT_RESOLVERPORT=443
 
  +
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
   
  +
詳しくは {{man|5|systemd.exec}} と [[Systemd#アプリケーション環境のサンドボックス化]]を参照してください。また、[https://github.com/jedisct1/dnscrypt-proxy/pull/601#issuecomment-284171727 上流のコメント] も見てください。
Be sure you have [[#設定|configured resolv.conf properly]] for {{ic|127.0.0.1}}.
 
   
  +
上記の設定は [[#root 権限で dnscrypt が実行される]]の設定と組み合わせることができます。
{{ic|dnscrypt-proxy.service}} を[[systemd#ユニットファイルの編集|編集]]して {{ic|1=Before=pdnsd.service}} をアンコメントしてください。そして {{ic|pdnsd}} と {{ic|dnscrypt-proxy}} サービスを[[有効化]]します。
 
   
 
=== EDNS0 の有効化 ===
 
=== EDNS0 の有効化 ===
   
[[wikipedia:Extension_mechanisms_for_DNS|Extension Mechanisms for DNS]] that, among other things, allows a client to specify how large a reply over UDP can be.
+
[[wikipedia:Extension_mechanisms_for_DNS|Extension Mechanisms for DNS]] を使うことで UDP の応答のサイズを指定することができます。
   
 
以下の行を {{ic|/etc/resolv.conf}} に追加してください:
 
以下の行を {{ic|/etc/resolv.conf}} に追加してください:
 
options edns0
 
options edns0
   
  +
また、以下を {{ic|/etc/dnscrypt-proxy.conf}} に追加すると良いでしょう:
You may also wish to add the following argument to ''dnscrypt-proxy'':
 
--edns-payload-size=<bytes>
+
EDNSPayloadSize ''<bytes>''
   
  +
''<bytes>'' は適当な数字に置き換えてください。デフォルトのサイズは '''1252''' ですが、'''4096''' バイトまでなら問題なく設定できます。'''512''' バイト以下の値に設定するとクライアントがペイロードのサイズが含まれた OPT セクションが付随するパケットを送信しないかぎり、EDNS は無効化されます。
The default size being '''1252''' bytes, with values up to '''4096''' bytes being purportedly safe. A value below or equal to '''512''' bytes will disable this mechanism, unless a client sends a packet with an OPT section providing a payload size.
 
   
 
==== EDNS0 のテスト ====
 
==== EDNS0 のテスト ====
   
Make use of the [https://www.dns-oarc.net/oarc/services/replysizetest DNS Reply Size Test Server], use the ''dig'' command line tool from the {{Pkg|bind-tools}} package to issue a TXT query for the name ''rs.dns-oarc.net'':
+
[https://www.dns-oarc.net/oarc/services/replysizetest DNS Reply Size Test Server] を利用して、{{Pkg|ldns}} パッケージに含まれているコマンドラインツール ''drill'' を使って ''rs.dns-oarc.net'' の TXT クエリを実行してみてください:
$ dig +short rs.dns-oarc.net txt
+
$ drill rs.dns-oarc.net TXT
   
'''EDNS0''' がサポートされていれば、以下のような出力がされます:
+
'''EDNS0''' がサポートされていれば、出力の "answer section" は以下のようます:
 
rst.x3827.rs.dns-oarc.net.
 
rst.x3827.rs.dns-oarc.net.
 
rst.x4049.x3827.rs.dns-oarc.net.
 
rst.x4049.x3827.rs.dns-oarc.net.
159行目: 207行目:
 
"2a00:d880:3:1::a6c1:2e89 DNS reply size limit is at least 4055 bytes"
 
"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"
 
"2a00:d880:3:1::a6c1:2e89 sent EDNS buffer size 4096"
  +
  +
=== DNSCrypt プロバイダの冗長性 ===
  +
  +
オリジナルの {{ic|dnscrypt-proxy.service}} と {{ic|dnscrypt-proxy.socket}} をコピーすることで複数の異なる dnscrypt プロバイダを使うことが可能です。コピーしたサービスのコマンドラインパラメータを変更して、新しい設定ファイルを指定するか、別のリゾルバを直接指定してください。そして新しくコピーしたソケットのポートを変更してください。最後に、ローカル DNS キャッシュプログラムの設定を変更して新しいサービスのポートを使うようにしてください。例えば、オリジナルのソケットで {{ic|5353}} ポートを使って新しいソケットでは {{ic|5354}} を使うようにする場合、[[unbound]] の設定ファイルは以下のようになります:
  +
  +
{{hc|/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 ファイルの作成 =====
  +
  +
まず、以下の内容で {{ic|/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 ソケットを作成するために、{{ic|/usr/lib/systemd/system/dnscrypt-proxy.socket}} を新しいファイル ({{ic|/etc/systemd/system/dnscrypt-proxy@''short-name.here''.socket}}) にコピーしてソケットのインスタンス名を [[#リゾルバの選択|{{ic|dnscrypt-resolvers.csv}}]] に記載されている省略名のどれかに置き換えて[[#ポートの変更|ポートを変更]]してください。インスタンスごとに別々のポートを使用するようにしてください (5353, 5354 など)。
  +
  +
===== 新しい systemd 設定の適用 =====
  +
  +
設定したら systemd の設定をリロードする必要があります:
  +
  +
# systemctl daemon-reload
  +
  +
デフォルトのサービスを別の名前で置き換えるため、{{ic|dnscrypt-proxy.service}} と {{ic|dnscrypt-proxy.socket}} を明示的に[[停止]]・[[無効化]]する必要があります。
  +
  +
その後、{{ic|dnscrypt-proxy@dnscrypt.eu-nl}} などの新しいサービスを[[起動]]・[[有効化]]してください。
  +
  +
最後に {{ic|unbound.service}} を[[再起動]]してください。
  +
  +
== トラブルシューティング ==
  +
  +
=== root 権限で dnscrypt が実行される ===
  +
  +
詳しくは {{Bug|49881}} を見てください。root 権限を使わない場合、{{ic|dnscrypt-proxy.service}} を[[systemd#ユニットファイルの編集|編集]]して以下のように設定してください:
  +
  +
[Service]
  +
DynamicUser=yes
  +
  +
上記の設定は[[#サンドボックス化]]の設定と組み合わせることができます。

2024年8月15日 (木) 13:38時点における最新版

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 オプションでグローバルに設定することが可能です。

ポート53にバインドされているサービスをすべて無効にする

ヒント: ローカル DNS キャッシュとして Unbound を使っている場合、unbound はデフォルトでポート 53 で動作するので、このセクションは無視してもかまいません。

ポート53を使用しているプログラムがあるかどうかを確認するには、以下を実行してください。

 $ ss -lp 'sport = :domain'
この記事またはセクションの正確性には問題があります。
理由: systemd-resolved は 127.0.0.53:53 で待ち受けますが、127.0.0.1:53 で待ち受ける dnscrypt-proxy には影響しないはずです。 (議論: トーク:Dnscrypt-proxy#)

出力に最初の行以上のカラム名が含まれている場合、ポート53を使用しているサービスを無効化する必要があります。よくある原因は systemd-resolved.service(NetworkManager#Unit dbus-org.freedesktop.resolve1.service not found) ですが、他のネットワークマネージャにも類似のコンポーネントがあるかもしれません。上記のコマンドで次の行以外何も出力されなくなったら、次に進む準備ができています。

 Netid               State                 Recv-Q                Send-Q                                 Local Address:Port                                   Peer Address:Port

resolv.conf の編集

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

アドレスとオプション step-4-change-the-system-dns-settings

nameserver ::1
nameserver 127.0.0.1
options edns0

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

systemd サービスの起動

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

dnscrypt-proxy が動作しているかどうかの確認

ブラウザを開き、DnsLeakTest にアクセスし、拡張テストを行います。結果が設定ファイルに設定したサーバを表示していれば、dnscrypt-proxy が機能していることになります。そうでなければ、何かが間違っていることになります。

ヒントとテクニック

ローカル 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

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