DNSCrypt

提供: ArchWiki
移動先: 案内検索

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起動有効化してください。

ヒントとテクニック

ローカル 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 は不要です。上記の設定は#サンドボックス化の設定と組み合わせることができます。