「Dnscrypt-proxy」の版間の差分
(ページの作成:「Category:Domain Name System Category:セキュリティ en:DNSCrypt es:DNSCrypt pt:DNSCrypt [http://dnscrypt.org/ DNSCrypt] はユーザーと DNS リ...」) |
Kusanaginoturugi (トーク | 投稿記録) |
||
(4人の利用者による、間の14版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category: |
+ | [[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}} パッケージを [[インストール]] してください。 |
|
== 設定 == |
== 設定 == |
||
+ | === スタートアップ === |
||
− | {{Tip|To automatically configure DNSCrypt and choose a resolver, use {{AUR|dnscrypt-autoinstall}} from the [[AUR]].}} |
||
+ | {{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]}} |
||
− | By default ''dnscrypt-proxy'' is pre-configured in {{ic|/etc/conf.d/dnscrypt-proxy}} (read by {{ic|dnscrypt-proxy.service}}) to accept incoming requests on {{ic|127.0.0.1}} to an [https://opendns.com OpenDNS] resolver. See the [https://github.com/jedisct1/dnscrypt-proxy/blob/master/dnscrypt-resolvers.csv list of public resolvers] for alternatives. |
||
+ | このサービスは2つの互いに排他的な方法で [[起動]] することができます (つまり、どちらか一方しか [[有効化]] できません。) |
||
− | With this setup, it will be necessary to alter your [[resolv.conf]] file and replace your current set of resolver addresses with localhost: |
||
+ | |||
+ | # 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#DNS 設定の保護]] を参照。 |
||
− | You might need to prevent other programs from overwriting it, see [[resolv.conf#Preserve DNS settings]] for details. |
||
− | == 起動 == |
+ | === systemd サービスの起動 === |
− | + | 最後に、{{ic|dnscrypt-proxy.service}} を [[起動]]・[[有効化]] してください。 |
|
+ | === dnscrypt-proxy が動作しているかどうかの確認 === |
||
− | == Tips and tricks == |
||
+ | ブラウザを開き、[https://dnsleaktest.com DnsLeakTest] にアクセスし、拡張テストを行います。結果が設定ファイルに設定したサーバを表示していれば、dnscrypt-proxy が機能していることになります。そうでなければ、何かが間違っていることになります。 |
||
− | === DNSCrypt で DNS ローカルキャッシュを転送 === |
||
+ | == ヒントとテクニック == |
||
− | It is recommended to run DNSCrypt as a forwarder for a local DNS cache, otherwise every single query will make a round-trip to the upstream resolver. Any local DNS caching program should work, examples below show configuration for [[Unbound]], [[dnsmasq]], and [[pdnsd]]. |
||
− | + | === ローカル DNS キャッシュの設定 === |
|
+ | |||
+ | {{Note|''dnscrypt'' はエントリをキャッシュするとき他のプログラムを必要としません。キャッシュ機能を使うには dnscrypt の設定ファイルで {{ic|LocalCache on}} となっていることを確認してください。}} |
||
+ | |||
+ | DNSCrypt はローカル DNS キャッシュのフォワーダとして実行することが推奨されています。キャッシュ機能を使わないと全てのクエリーが上流のリゾルバを往復することになります。ローカル DNS キャッシュプログラムならどれでも動作します。''dnscrypt-proxy'' の設定に加えて、ローカル DNS キャッシュプログラムの設定も必要です。 |
||
+ | |||
+ | ==== ポートの変更 ==== |
||
+ | |||
+ | {{Note|パッケージに同梱されている systemd ユニットを使用している場合、{{ic|/etc/dnscrypt-proxy.conf}} で IP アドレスやポートを変更しても反映されません [https://web.archive.org/web/20171215112100/https://github.com/jedisct1/dnscrypt-proxy/issues/528]。以下に書かれているようにパッケージに含まれている systemd ソケットを変更する必要があります。}} |
||
+ | |||
+ | ローカル DNS キャッシュに転送するには、''dnscrypt-proxy'' がデフォルトの {{ic|53}} ポートと異なるポートを listen する必要があります。{{ic|53}} を使用するのは DNS キャッシュにして、異なるポートから ''dnscrypt-proxy'' に問い合わせるようにするためです。このセクションでは例としてポート番号 {{ic|5353}} を使っています。ポート番号が 1024 より大きいため ''dnscrypt-proxy'' を root で実行する必要はありません。{{ic|dnscrypt-proxy.socket}} を以下の内容で[[systemd#ユニットファイルの編集|編集]]してください: |
||
+ | |||
+ | [Socket] |
||
+ | ListenStream= |
||
+ | ListenDatagram= |
||
+ | ListenStream=127.0.0.1:5353 |
||
+ | ListenDatagram=127.0.0.1:5353 |
||
+ | |||
+ | {{Note|UDP ポートの {{ic|5353}} は [[Avahi#ファイアウォール|Avahi]] が使用するため、(Avahi をインストール・起動している場合) ジャーナルに警告が表示され [[Avahi]] の mDNS が不安定になる可能性があります。}} |
||
+ | |||
+ | ==== ローカル DNS キャッシュの設定例 ==== |
||
+ | |||
+ | 以下の設定で ''dnscrypt-proxy'' をポート {{ic|5353}} から使うようになります。 |
||
+ | |||
+ | ===== Unbound ===== |
||
+ | |||
+ | ([[Unbound#ローカル DNS サーバー]]を見ながら) 自由に [[Unbound]] を設定してから {{ic|/etc/unbound/unbound.conf}} の {{ic|server}} セクションの最後に以下の行を追加してください: |
||
− | Configure [[Unbound]] to your liking (remember to [[Unbound#Set /etc/resolv.conf to use the local DNS server|set /etc/resolv.conf to use the local DNS server]]) and add the following lines to the end of the {{ic|server}} section in {{ic|/etc/unbound/unbound.conf}}: |
||
do-not-query-localhost: no |
do-not-query-localhost: no |
||
forward-zone: |
forward-zone: |
||
name: "." |
name: "." |
||
− | forward-addr: 127.0.0.1@ |
+ | forward-addr: 127.0.0.1@5353 |
− | |||
− | {{Note|Port 40 is given as an example as Unbound by default listens to 53, these must be different.}} |
||
+ | {{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''}} と設定してください。}} |
||
− | Start the [[systemd]] service {{ic|unbound.service}}. Then configure DNScrypt to match Unbound's new {{ic|forward-zone}} IP and port in {{ic|/etc/conf.d/dnscrypt-proxy}}: |
||
− | DNSCRYPT_LOCALIP=127.0.0.1 |
||
− | DNSCRYPT_LOCALPORT=40 |
||
+ | {{ic|unbound.service}} を[[再起動]]すると変更が適用されます。 |
||
− | {{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}}.}} |
||
+ | ===== dnsmasq ===== |
||
− | Restart {{ic|dnscrypt-proxy.service}} and {{ic|unbound.service}} to apply the changes. |
||
+ | dnsmasq を[[dnsmasq#DNS キャッシュの設定|ローカル DNS キャッシュ]]として設定してください。DNSCrypt を使用する場合の基本設定: |
||
− | ==== 例: dnsmasq の設定 ==== |
||
− | |||
− | Configure dnsmasq as a [[dnsmasq#DNS Cache Setup|local DNS cache]]. The basic configuration to work with 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 |
||
}} |
}} |
||
+ | DNSSEC が有効になっているリゾルバを使うように DNSCrypt を設定した場合、dnsmasq でも DNSSEC を有効にするようにしてください: |
||
− | If you configured DNSCrypt to use a resolver with enabled DNSSEC validation, make sure to enable it also in dnsmasq: |
||
{{hc|/etc/dnsmasq.conf|2= |
{{hc|/etc/dnsmasq.conf|2= |
||
65行目: | 123行目: | ||
}} |
}} |
||
+ | {{ic|dnsmasq.service}} を[[再起動]]すると変更が適用されます。 |
||
− | Configure DNSCrypt to listen on {{ic|127.0.0.2}}, where dnsmasq will be querying: |
||
+ | ===== pdnsd ===== |
||
− | {{hc|/etc/conf.d/dnscrypt-proxy|2= |
||
− | DNSCRYPT_LOCALIP=127.0.0.2 |
||
− | DNSCRYPT_LOCALPORT=2053 |
||
− | }} |
||
− | |||
− | Restart {{ic|dnscrypt-proxy.service}} and {{ic|dnsmasq.service}} to apply the changes. |
||
− | |||
− | ==== 例: pdnsd の設定 ==== |
||
+ | [[pdnsd]] をインストールしてください。DNSCrypt を使用する基本設定: |
||
− | Install [[pdnsd]]. A basic configuration to work with DNSCrypt is: |
||
{{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"; |
|
− | } |
||
− | |||
− | |||
− | rr { |
||
− | name=localhost; |
||
− | reverse=on; |
||
− | a=127.0.0.1; |
||
− | owner=localhost; |
||
− | soa=localhost,root.localhost,42,86400,900,86400,86400; |
||
} |
} |
||
}} |
}} |
||
+ | {{ic|pdnsd.service}} を再起動すれば変更が適用されます。 |
||
− | 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. |
||
+ | === サンドボックス化 === |
||
− | {{hc|/etc/conf.d/dnscrypt-proxy|2= |
||
− | DNSCRYPT_LOCALIP=127.0.0.2 |
||
− | DNSCRYPT_LOCALPORT=53 |
||
− | DNSCRYPT_USER=nobody |
||
− | DNSCRYPT_PROVIDER_NAME=2.dnscrypt-cert.opendns.com |
||
− | DNSCRYPT_PROVIDER_KEY=B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79 |
||
− | DNSCRYPT_RESOLVERIP=208.67.220.220 |
||
− | DNSCRYPT_RESOLVERPORT=443 |
||
− | }} |
||
+ | {{ic|dnscrypt-proxy.service}} を[[systemd#ユニットファイルの編集|編集]]して以下の行を記述してください: |
||
− | Be sure you have [https://wiki.archlinux.org/index.php/DNSCrypt#Configuration configured resolv.conf properly] for {{ic|127.0.0.1}}. |
||
+ | [Service] |
||
− | Uncomment the following line in {{ic|pdnsd.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 |
||
+ | 詳しくは {{man|5|systemd.exec}} と [[Systemd#アプリケーション環境のサンドボックス化]]を参照してください。また、[https://github.com/jedisct1/dnscrypt-proxy/pull/601#issuecomment-284171727 上流のコメント] も見てください。 |
||
− | Before=pdnsd.service |
||
+ | 上記の設定は [[#root 権限で dnscrypt が実行される]]の設定と組み合わせることができます。 |
||
− | Now [https://wiki.archlinux.org/index.php/Systemd#Using_units enable] both the {{ic|pdnsd}} and {{ic|dnscrypt-proxy}} services. |
||
=== 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}} に追加してください: |
|
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|ldns}} パッケージに含まれているコマンドラインツール ''drill'' を使って ''rs.dns-oarc.net'' の TXT クエリを実行してみてください: |
|
− | $ |
+ | $ drill rs.dns-oarc.net TXT |
+ | '''EDNS0''' がサポートされていれば、出力の "answer section" は以下のようになります: |
||
− | With '''EDNS0''' supported, the output should look similar to this: |
||
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. |
||
161行目: | 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-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
オプションでグローバルに設定することが可能です。
ポート53にバインドされているサービスをすべて無効にする
ポート53を使用しているプログラムがあるかどうかを確認するには、以下を実行してください。
$ ss -lp 'sport = :domain'
出力に最初の行以上のカラム名が含まれている場合、ポート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 はローカル 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
上記の設定は#サンドボックス化の設定と組み合わせることができます。