Dnscrypt-proxy
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
を起動・有効化してください。
ヒントとテクニック
ローカル 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
は不要です。上記の設定は#サンドボックス化の設定と組み合わせることができます。