「DNSCrypt」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
12行目: 12行目:
 
== 設定 ==
 
== 設定 ==
   
  +
{{Tip|サンプル設定ファイルの {{ic|/etc/dnscrypt-proxy.conf.example}} が存在しますが、systemd は[[#ポートの変更|ソケットファイル]]によって {{ic|LocalAddress}} オプションを上書きするので注意してください。}}
{{Tip|DNSCrypt が自動的にリゾルバを選ぶようにしたい場合、[[AUR]] の {{AUR|dnscrypt-autoinstall}} を使って下さい。}}
 
   
  +
以下の手順に従って ''dnscrypt-proxy'' を設定してください:
デフォルトで ({{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 パブリックリゾルバのリスト] を見て下さい。できるかぎり遅延を抑えるために、地理的に近いリゾルバを選択してください。
 
  +
  +
=== リゾルバの選択 ===
  +
  +
{{ic|/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv}} からリゾルバを選択して {{ic|/etc/dnscrypt-proxy.conf}} を編集してください。csv ファイルの最初のカラムの省略名 ({{ic|Name}}) を使います。例えば、リゾルバとして ''dnscrypt.eu-nl'' を選択する場合:
  +
  +
ResolverName dnscrypt.eu-nl
  +
  +
{{Tip|
  +
* 最新のリストは [https://github.com/jedisct1/dnscrypt-proxy/blob/master/dnscrypt-resolvers.csv 上流のページ] から直接ダウンロードできます。
  +
* この段階で dnscrypt を実行するための非特権ユーザーを追加しても良いでしょう。[[#root 権限で dnscrypt が実行される]]を参照してください。}}
  +
  +
=== resolv.conf の編集 ===
  +
  +
dnscrypt リゾルバを選択したら [[resolv.conf]] ファイルを編集してリゾルバのアドレスを ''localhost'' のアドレスに置き換えてください:
   
デフォルトの設定では、[[resolv.conf]] ファイルを変更してリゾルバのアドレスをローカルホストに置き換える必要があります:
 
 
nameserver 127.0.0.1
 
nameserver 127.0.0.1
   
他のプログラムによって [[resolv.conf]] 換えられないようにしてください。詳しくは [[resolv.conf#DNS 設定の保護]] を参照。
+
他のプログラムによって上記の設定上書れないように注意してください。詳しくは [[resolv.conf#DNS 設定の保護]]を参照。
   
== 起動 ==
+
=== systemd サービスの起動 ===
   
[[systemd]] サービスを使って起動できます: {{ic|dnscrypt-proxy.service}}
+
最後に、{{ic|dnscrypt-proxy.service}} を[[起動]]・[[有効化]]してください。
   
 
== Tips and tricks ==
 
== Tips and tricks ==
   
=== DNSCrypt で DNS ローカルキャッシュを転送 ===
+
=== ローカル DNS キャッシュの設定 ===
   
DNSCrypt をローカル DNS キャッシュのフォワーダとして実行することが推奨されています。そうしないと全てのクエリーが上流のリゾルバを往復することになります。ローカル DNS キャッシュプログラムならどれでも動作します。以下では [[Unbound]], [[dnsmasq]], [[pdnsd]] の設定例を紹介します。
+
DNSCrypt をローカル DNS キャッシュのフォワーダとして実行することが推奨されています。そうしないと全てのクエリーが上流のリゾルバを往復することになります。ローカル DNS キャッシュプログラムならどれでも動作します。''dnscrypt-proxy'' の設定に加えて、ローカル DNS キャッシュプログラムの設定も必要です。
   
==== 例: Unbound 設定 ====
+
==== ポート変更 ====
   
  +
{{Note|パッケージに同梱されている systemd ユニットを使用している場合、{{ic|/etc/dnscrypt-proxy.conf}} で IP アドレスやポートを変更しても反映されません [https://github.com/jedisct1/dnscrypt-proxy/issues/528]。以下に書かれているようにパッケージに含まれている systemd ソケットを変更する必要があります。}}
自由に [[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
 
   
  +
ローカル DNS キャッシュに転送するには、''dnscrypt-proxy'' がデフォルトの {{ic|53}} ポートと異なるポートを listen する必要があります。{{ic|53}} を使用するのは DNS キャッシュにして、異なるポートから ''dnscrypt-proxy'' に問い合わせるようにするためです。このセクションでは例としてポート番号 {{ic|5353}} を使っています。ポート番号が 1024 より大きいため ''dnscrypt-proxy'' を root で実行する必要はありません。{{ic|dnscrypt-proxy.socket}} を以下の内容で[[systemd#ユニットファイルの編集|編集]]してください:
{{Note|Port 40 is given as an example as Unbound by default listens to 53, these must be different.}}
 
   
  +
[Socket]
{{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}}.}}
 
  +
ListenStream=
  +
ListenDatagram=
  +
ListenStream=127.0.0.1:5353
  +
ListenDatagram=127.0.0.1:5353
   
  +
==== ローカル DNS キャッシュの設定例 ====
[[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
 
   
  +
以下の設定で ''dnscrypt-proxy'' をポート {{ic|5353}} から使うようになります。
{{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}}.}}
 
   
  +
===== Unbound =====
{{ic|dnscrypt-proxy.service}} と {{ic|unbound.service}} を再起動すると変更が適用されます。
 
   
  +
([[Unbound#ローカル DNS サーバー]]を見ながら) 自由に [[Unbound]] を設定してから {{ic|/etc/unbound/unbound.conf}} の {{ic|server}} セクションの最後に以下の行を追加してください:
==== 例: dnsmasq の設定 ====
 
   
  +
do-not-query-localhost: no
dnsmasq を[[dnsmasq#DNS キャッシュの設定|ローカル DNS キャッシュ]]として設定してください。DNSCrypt を使用する場合の基本設定:
 
  +
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行目: 89行目:
 
}}
 
}}
   
  +
{{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行目: 97行目:
 
{{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
  +
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|bind-tools}} パッケージに含まれているコマンドラインツール ''dig'' を使って ''rs.dns-oarc.net'' の TXT クエリを実行してみてください:
$ dig +short rs.dns-oarc.net txt
+
$ dig +short rs.dns-oarc.net TXT
   
'''EDNS0''' がサポートされていれば、以下のような出力がされます:
+
'''EDNS0''' がサポートされていれば、出力は以下のようます:
 
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行目: 173行目:
 
"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 権限を使わない場合、手動で非特権ユーザーを作成してください。
  +
  +
以下のように[[ユーザーとグループ#ユーザー管理|ユーザーを作成]]してください:
  +
  +
# useradd -r -d /var/dnscrypt -m -s /sbin/nologin dnscrypt
  +
  +
{{ic|/etc/dnscrypt-proxy.conf}} を編集して、新しいユーザーを追加:
  +
  +
User dnscrypt
  +
  +
もしくは、{{ic|dnscrypt-proxy.service}} ユニットで {{ic|1=User=}} を使用:
  +
  +
[Service]
  +
User=dnscrypt
  +
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
  +
  +
unbound などのキャッシュサーバーを使用する場合は後者の方法を使うことが推奨されます。非特権ポートに[[#ポートの変更|ポートを変更]]した場合は (例: 5353)、{{ic|1=CapabilityBoundingSet=CAP_NET_BIND_SERVICE}} は不要です。上記の設定は[[#サンドボックス化]]の設定と組み合わせることができます。

2017年3月19日 (日) 22:17時点における版

DNSCrypt はユーザーと DNS リゾルバの間の DNS トラフィックを暗号化するソフトウェアです。盗聴や改竄、中間者攻撃を防ぎます。

インストール

公式リポジトリから dnscrypt-proxyインストールしてください。

設定

ヒント: サンプル設定ファイルの /etc/dnscrypt-proxy.conf.example が存在しますが、systemd はソケットファイルによって LocalAddress オプションを上書きするので注意してください。

以下の手順に従って dnscrypt-proxy を設定してください:

リゾルバの選択

/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv からリゾルバを選択して /etc/dnscrypt-proxy.conf を編集してください。csv ファイルの最初のカラムの省略名 (Name) を使います。例えば、リゾルバとして dnscrypt.eu-nl を選択する場合:

ResolverName dnscrypt.eu-nl
ヒント:

resolv.conf の編集

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

nameserver 127.0.0.1

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

systemd サービスの起動

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

Tips and tricks

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

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

ポートの変更

ノート: パッケージに同梱されている systemd ユニットを使用している場合、/etc/dnscrypt-proxy.conf で IP アドレスやポートを変更しても反映されません [1]。以下に書かれているようにパッケージに含まれている 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

ローカル 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
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 を利用して、bind-tools パッケージに含まれているコマンドラインツール dig を使って rs.dns-oarc.net の TXT クエリを実行してみてください:

$ dig +short rs.dns-oarc.net TXT

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

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 権限を使わない場合、手動で非特権ユーザーを作成してください。

以下のようにユーザーを作成してください:

# useradd -r -d /var/dnscrypt -m -s /sbin/nologin dnscrypt

/etc/dnscrypt-proxy.conf を編集して、新しいユーザーを追加:

User dnscrypt

もしくは、dnscrypt-proxy.service ユニットで User= を使用:

[Service]
User=dnscrypt
CapabilityBoundingSet=CAP_NET_BIND_SERVICE

unbound などのキャッシュサーバーを使用する場合は後者の方法を使うことが推奨されます。非特権ポートにポートを変更した場合は (例: 5353)、CapabilityBoundingSet=CAP_NET_BIND_SERVICE は不要です。上記の設定は#サンドボックス化の設定と組み合わせることができます。