このチュートリアルでは、 DNS overTLSを使用してUbuntu20.04/18.04デスクトップでDNSプライバシーを保護する方法を説明します。 。 stubbyというツールを使用します それを達成するために。しかし、最初に、DNSが安全でない理由をお話ししましょう。
DNSの脆弱性
DNSクエリは暗号化されていないため、DNSは安全ではありません。これは、中間エンティティによって悪用される可能性があります。 DNSキャッシュポイズンは、中国のインターネットを検閲するためにグレートファイアウォールオブチャイナ(GFW)によって広く使用されているDNSの悪用の1つです。 GFWは、中国国外のDNSサーバーに送信されるすべてのDNSクエリをチェックします。プレーンテキストのDNSプロトコルはコネクションレス型プロトコルであるUDPに基づいているため、GFWはクライアントIPとサーバーIPの両方をスプーフィングできます。 GFWは、ブロックリストでドメイン名を見つけると、DNS応答を変更します。たとえば、中国のインターネットユーザーがgoogle.comにアクセスしたい場合、中国のグレートファイアウォールは、Googleの実際のIPアドレスではなく、中国にあるIPアドレスをDNSリゾルバーに返します。次に、DNSリゾルバーは偽のIPアドレスをユーザーのコンピューターに返します。
DNS over TLSとは何ですか?プライバシーをどのように保護しますか?
DNS over TLSは、DNSクエリがTLSで暗号化された安全な接続を介して送信されることを意味します。これは、HTTPトラフィックを暗号化するのと同じテクノロジーであるため、第三者がDNSクエリを見ることができません。 HTTPSおよび暗号化されたSNI(Server Name Indication)とともに、閲覧履歴はISPスパイから完全に保護されます。
Stubbyは、getdnsチームによって開発されたオープンソースのDNSスタブリゾルバーです。 getdnsライブラリを使用します。スタブリゾルバーは、FirefoxなどのアプリケーションからDNS要求を受信し、1.1.1.1や8.8.8.8などの再帰的リゾルバーに要求を転送するエンドユーザーのコンピューター上の小さなDNSクライアントです。 Stubbyは、DNSoverTLSをサポートするという点で特別です。デフォルトでは、暗号化されたDNSリクエストのみを送信します。 cloudflared
と呼ばれる別のオープンソーススタブリゾルバーがあります DNS over HTTPSをサポートしていますが、stubbyはすでにUbuntu 20.04 / 18.04リポジトリにあり、非常に使いやすいです。
Ubuntu 20.04/18.04デスクトップにStubbyをインストールして使用する方法
StubbyはUbuntu20.04/18.04リポジトリにあります。ターミナルウィンドウを開き、次のコマンドを実行してインストールします。
sudo apt install stubby
これにより、ずんぐりしたものと getdns
がインストールされます 図書館。インストールすると、スタビーはバックグラウンドで実行されます。次のコマンドでステータスを確認します:
systemctl status stubby
Stubbyは、次のコマンドを実行するとわかるように、ローカルホスト(127.0.0.1)のTCPおよびUDPポート53でリッスンします。
sudo netstat -lnptu | grep stubby
systemd-resolved
によって提供されるデフォルトのスタブリゾルバー 127.0.0.53のTCPおよびUDPポート53でリッスンします。
sudo netstat -lnptu | grep systemd-resolv
注:dnsmasqが127.0.0.1のTCPポート53でリッスンしている場合、Stubbyは127.0.0.1のUDPポート53でのみリッスンします。
メインの設定ファイルは/etc/stubby/stubby.yml
です。 。通常、別のリゾルバまたは独自の再帰リゾルバを使用する場合を除いて、変更を加える必要はありません。いくつかのデフォルト構成について説明します。次のコマンドでファイルを開くことができます:
sudo nano /etc/stubby/stubby.yml
次の行は、stubbyを完全な再帰的リゾルバーではなくスタブリゾルバーとして実行するため、stubbyという名前が付けられています。
resolution_type: GETDNS_RESOLUTION_STUB
次の構成では、TLSで暗号化されたDNSクエリをずんぐりして送信します。プレーンテキストでクエリを送信することはありません。
dns_transport_list: - GETDNS_TRANSPORT_TLS
この次の行には、リモート再帰リゾルバーに有効なTLS証明書が必要です。
tls_authentication: GETDNS_AUTHENTICATION_REQUIRED
次の行は、スタビーデーモンのリッスンアドレスを設定します。デフォルトでは、IPv4とIPv6の両方が有効になっています。
listen_addresses: - 127.0.0.1 - 0::1
次の行は、ラウンドロビン方式でずんぐりしたクエリの再帰的リゾルバを作成します。 0
に設定されている場合 、Stubbyは、使用できなくなるまで各アップストリームサーバーを順番に使用し、次に次のサーバーを使用します。
round_robin_upstreams: 1
デフォルトでは、スタビー構成ファイルで3つの再帰リゾルバーが有効になっています。それらはずんぐりした開発者によって実行され、TLSを介したDNSをサポートします。推奨されるサーバーの完全なリストは、DNSプライバシーWebサイトで確認できます。
dnsovertls.sinodun.com 145.100.185.15 dnsovertls1.sinodun.com 145.100.185.16 getdnsapi.net 185.49.141.37
追加サーバー
には他のDNSサーバーがあります デフォルトで無効になっているセクション。
dns.quad9.net unicast.censurfridns.dk dnsovertls3.sinodun.com (supporting TLS1.2 and TLS 1.3) dnsovertls2.sinodun.com dns.cmrg.net dns.larsdebruin.net ......
ポート443でリッスンしているDNSサーバーもあります。ネットワークでポート853がブロックされている場合は、それらのサーバーのコメントを解除して、これらのサーバーを使用できます。
dnsovertls.sinodun.com dnsovertls1.sinodun.com dns.cmrg.net dns.neutopia.org
これで、 Ctrl + X
を押してnanoテキストエディタを終了できます。 。
スタビーへの切り替え
/etc/resolve.conf
の編集 ネームサーバーを変更するファイルはもうお勧めしません。以下の手順に従って、 systemd-resolved
を作成します DNSクエリをずんぐりしたものに送信します。
GNOMEデスクトップ
デスクトップの右上隅にあるNetworkManagerアイコンをクリックします。次に、有線設定を選択します。 (Wi-Fiを使用している場合は、Wi-Fi設定を選択します。)
歯車ボタンをクリックします。
IPv4
を選択します タブをクリックし、DNS設定で自動
を切り替えます オフにすると、UbuntuシステムがルーターからDNSサーバーアドレスを取得できなくなります。 127.0.0.1
と入力します DNSフィールドに入力します。 適用コード>をクリックします ボタンをクリックして変更を保存します。
次に、NetworkManagerを再起動して、変更を有効にします。
sudo systemctl restart NetworkManager
再接続すると、Ubuntuシステムが Details
のDNSサーバーとして127.0.0.1を使用していることがわかります。 タブ。
ユニティデスクトップ
推奨読書:Ubuntu 20.04/18.04にUnityデスクトップ環境をインストールする方法。
デスクトップの右上隅にあるネットワークマネージャーアイコンをクリックしてから、接続の編集コード>をクリックします 。
接続名を選択し、歯車のアイコンをクリックします。
[IPv4設定]タブを選択し、 Automatic(DHCP)
からメソッドを変更します 自動(DHCP)アドレスのみ
へ 、これにより、UbuntuシステムがルーターからDNSサーバーアドレスを取得できなくなります。次に、DNSサーバー(127.0.0.1)を指定します。 Stubbyは127.0.0.1でリッスンします。
変更を保存します。次に、NetworkManagerを再起動して、変更を有効にします。
sudo systemctl restart NetworkManager
再接続したら、Network Managerアイコンをもう一度クリックして、接続情報
を選択します。 。 UbuntuシステムがDNSサーバーとして127.0.0.1を使用していることがわかります。
コマンドラインからDNSサーバーを変更する
デスクトップ環境でNetworkManagerを使用している限り、以下の方法を使用してDNSサーバーを変更できます。
ターミナルウィンドウを開き、NetworkManager接続プロファイルディレクトリに移動します。
cd /etc/NetworkManager/system-connections/
次に、システムで使用可能な接続名を一覧表示します。
ls
ご覧のとおり、システムにはいくつかの接続があり、そのうちの1つは有線接続です。一部はワイヤレス接続で、1つはVPN接続です。デスクトップコンピューターはイーサネットケーブルを介してルーターに接続されているため、 nano
を使用して有線接続プロファイルを編集する必要があります。 コマンドラインテキストエディタ。
sudo nano 'Wired connection 1'
コンピューターがWi-Fi経由で接続されている場合は、ワイヤレス接続プロファイルを編集する必要があります。このファイルで、 [ipv4]
を見つけます 構成。デフォルトでは、次のようになります。
[ipv4] dns-search= method=auto
システムでStubbyを使用するには、構成を次のように変更します。
[ipv4] dns=127.0.0.1; dns-search= ignore-auto-dns=true method=auto
Nanoテキストエディタでファイルを保存するには、 Ctrl + O
を押します。 、Enterキーを押して確認します。 Ctrl + X
を押します 出る。次に、ネットワークマネージャーを再起動して、変更を有効にします。
sudo systemctl restart NetworkManager
次のコマンドを実行して、現在のDNSサーバーを確認できるようになりました。
systemd-resolve --status
サンプル出力:
Link 2 (enp5s0) Current Scopes: DNS LLMNR setting: yes MulticastDNS setting: no DNSSEC setting: no DNSSEC supported: no DNS Servers: 127.0.0.1
127.0.0.1がDNSサーバーとしてリストされている場合、システムはStubbyを使用しています。
DHCPサーバーによって提供されるDNS設定を無視する
Ubuntuサーバーエディションを使用する場合 、 systemdを構成できます DHCPサーバーによって提供されるDNS設定を無視して、システムが誤って間違ったDNSサーバーを使用しないようにします。
まず、ネットワークインターフェースのステータスを確認します。
networkctl status enp5s0
このインターフェースのネットワークファイルが表示されます。このネットワークファイルを編集します。
sudo nano /run/systemd/network/10-netplan-enp5s0.network
[DHCP]
を見つけます セクションを作成し、次の行を追加します。
UseDNS=false
このように:
[DHCP] RouteMetric=100 UseMTU=true UseDNS=false
ファイルを保存して閉じます。次に、 systemd-netweorkd.service
を再起動します 変更を有効にするため。
sudo systemctl restart systemd-networkd
次のコマンドを実行して、各ネットワークインターフェイスのDNSサーバーを確認します。すべてが正しければ、DHCPサーバーによって提供されるDNSサーバーは表示されません。
resolvectl status
ネットワークファイルの変更は、新しいパッケージの更新によって上書きできます。サーバーがnetplanを使用している場合 ネットワーク接続を管理するために、DHCPDNS設定を無視するようにnetplanを構成することもできます。
sudo nano /etc/netplan/50-cloud-init.yaml
次の2行をファイルに追加します。
dhcp4-overrides: use-dns: no
このように:
network: ethernets: eth0: dhcp4: true dhcp4-overrides: use-dns: no optional: true set-name: eth0 nameservers: search: [ invalid ] addresses: 127.0.0.1 version: 2
ファイルを保存して閉じます。次に、変更を適用します。
sudo netplan apply
DNSトラフィックが暗号化されているかどうかを確認する方法
WireSharkを使用してDNSトラフィックを監視できます。 Ubuntu 20.04/18.04リポジトリからWireSharkをインストールします。
sudo apt install wireshark
「スーパーユーザー以外のユーザーがパケットをキャプチャできるようにする必要がありますか?」という質問が表示された場合は、「はい」と答えます。インストールしたら、次のコマンドを実行してユーザーアカウントをwiresharkグループに追加し、パケットをキャプチャできるようにします。
sudo adduser your-username wireshark
変更を有効にするには、ログアウトしてから再度ログインします。次に、アプリケーションメニューからWireSharkを開き、WireSharkでネットワークインターフェイスを選択します。たとえば、私のイーサネットインターフェイス名はenp5s0です。次に、 port 853
と入力します キャプチャフィルターとして。これにより、WireSharkはDNSoverTLSで使用されるポートであるポート853でのみトラフィックをキャプチャします。
左上隅のボタンをクリックして、キャプチャを開始します。その後、ターミナルウィンドウで次のコマンドを実行し、 dig
を使用してドメイン名を照会します。 効用。たとえば、ドメイン名のAレコードをクエリできます。
dig A linuxbabe.com
これで、キャプチャされたDNSトラフィックをWireSharkで確認できます。ご覧のとおり、私のDNSクエリは 185.49.141.37
に送信されました 、 145.100.185.15
および145.100.185.16
、スタビー構成ファイルで定義されている3つのデフォルトDNSリゾルバーです。接続はTCPを介して行われ、TLSで暗号化されました。これが私が望んでいることです。
DNSクエリが暗号化なしで送信された場合、コンピュータはポート53でDNSサーバーに接続します。ポート53
を使用してパケットを再度キャプチャできます。 キャプチャフィルタとして使用しますが、WireSharkにはパケットが表示されません。これは、スタビーがDNSクエリを暗号化していることを意味します。
CloudFlareDNSをStubbyに追加する方法
コンピューターと3つのデフォルトDNSサーバーの間に高いレイテンシー(200ミリ秒以上)があるのに対し、CloudFlare DNSサーバー(1.1.1.1、1.0.0.1)では非常に低いレイテンシー(20ミリ秒未満)であることがわかりました。 CloudFlareはDNSoverTLSもサポートしています。 CloudFlare DNSサーバーを追加するには、ずんぐりした構成ファイルを編集します。
sudo nano /etc/stubby/stubby.yml
upload_recursive_servers:
まで下にスクロールします セクションを作成し、他のDNSサーバーの上に次のテキストを追加します。
#CloudFlare servers - address_data: 1.1.1.1 tls_auth_name: "cloudflare-dns.com" - address_data: 1.0.0.1 tls_auth_name: "cloudflare-dns.com"
次に、次の行を見つけます。
round_robin_upstreams: 1
1
を変更します 0
へ 。これにより、ずんぐりした人は常にCloudFlareDNSサーバーを使用するようになります。 CloudFlareが利用できない場合、stubbyは他のDNSサーバーを使用します。ファイルを保存し、変更を有効にするためにスタビーを再起動します。
sudo systemctl restart stubby
DNSoverHTTPSサポート
Stubbyは、バージョン0.3でDNSoverHTTPSをサポートします。 Ubuntu20.10にはバージョン0.2.6が付属しています。 Stubbyのバージョンを確認するには、
を実行します。stubby -V