「Dnscrypt-proxy」の版間の差分
(同期) |
|||
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#DNS 設定の保護]]を参照。 |
− | == 起動 == |
+ | === systemd サービスの起動 === |
− | + | 最後に、{{ic|dnscrypt-proxy.service}} を[[起動]]・[[有効化]]してください。 |
|
== Tips and tricks == |
== Tips and tricks == |
||
− | === |
+ | === ローカル DNS キャッシュの設定 === |
− | DNSCrypt をローカル DNS キャッシュのフォワーダとして実行することが推奨されています。そうしないと全てのクエリーが上流のリゾルバを往復することになります。ローカル DNS キャッシュプログラムならどれでも動作します。 |
+ | DNSCrypt をローカル DNS キャッシュのフォワーダとして実行することが推奨されています。そうしないと全てのクエリーが上流のリゾルバを往復することになります。ローカル DNS キャッシュプログラムならどれでも動作します。''dnscrypt-proxy'' の設定に加えて、ローカル DNS キャッシュプログラムの設定も必要です。 |
− | ==== |
+ | ==== ポートの変更 ==== |
+ | {{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. |
+ | 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 = 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 { |
server { |
||
− | + | label = "dnscrypt-proxy"; |
|
− | + | ip = 127.0.0.1; |
|
− | + | port = 5353; |
|
− | + | timeout = 4; |
|
+ | proxy_only = on; |
||
− | uptest = query; |
||
− | interval = 15m; |
||
− | proxy_only=on; |
||
} |
} |
||
source { |
source { |
||
− | + | owner = localhost; |
|
− | + | 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]] |
+ | [[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'': |
||
− | + | 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 のテスト ==== |
||
− | + | [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 |
+ | $ 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 をインストールしてください。
設定
以下の手順に従って 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 キャッシュプログラムの設定も必要です。
ポートの変更
ローカル 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 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.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 権限を使わない場合、手動で非特権ユーザーを作成してください。
以下のようにユーザーを作成してください:
# 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
は不要です。上記の設定は#サンドボックス化の設定と組み合わせることができます。