GNU/Linux >> Linux の 問題 >  >> Ubuntu

DNSdistを使用してUbuntuでDNSoverHTTPS(DoH)リゾルバーを設定する

このチュートリアルでは、独自の DNS over HTTPSを設定する方法を紹介します。 (DoH)リゾルバー UbuntuではDNSdistを使用しているため、DNSクエリを暗号化して、詮索好きな目から保護することができます。

DNSoverHTTPSとは何ですか。なぜそれが重要なのか

DNS(ドメインネームシステム)は、ドメイン名をIPアドレスに変換する役割を果たします。 1987年に設計され、セキュリティやプライバシーを考慮していません。デフォルトでは、DNSクエリは暗号化されていません。それらはネットワーク上でプレーンテキストで送信され、中間エンティティによって悪用される可能性があります。たとえば、中国のグレートファイアウォール( GFW DNSキャッシュポイズンと呼ばれる手法を使用します 中国のインターネットを検閲する。 (他の方法も使用しますが、この記事の範囲を超えています。)

GFWは、中国国外のDNSサーバーに送信されるすべてのDNSクエリをチェックします。プレーンテキストのDNSプロトコルはコネクションレス型プロトコルであるUDPに基づいているため、GFWはクライアントIPとサーバーIPの両方をスプーフィングできます。 GFWは、ブロックリストでドメイン名を見つけると、DNS応答を変更します。たとえば、中国のインターネットユーザーがgoogle.comにアクセスしたい場合、GFWはGoogleの実際のIPアドレスではなく中国にあるIPアドレスをユーザーのDNSリゾルバーに返します。次に、DNSリゾルバーが偽のIPアドレスをユーザーのコンピューターに返すため、ユーザーはgoogle.comにアクセスできません。

HTTPSは、プレーンテキストのHTTPWebページを暗号化するための標準的な方法です。 DNS over HTTPS(DoH)を使用すると、DNSクエリが暗号化されるため、第三者がDNSクエリを見ることができなくなります。

独自のDoHリゾルバーを実行する理由

1.1.1.1のようなパブリックDNSリゾルバーはすでにいくつかあります および9.9.9.9 DNS over HTTPSをサポートしているため、独自に実行するスキルや時間がない場合に使用できます。 Firefoxバージョン61以降、ブラウザの設定でDNS over HTTPSを有効にできます。これは、インターネットのセキュリティとプライバシーにとって大きな進歩です。 FirefoxはデフォルトでCloudflareリゾルバー(1.1.1.1)を使用します。ただし、これによりCloudflareがFirefoxユーザーに関する情報を収集できるようになると主張する人もいます。彼らはCloudflareよりもISPを信頼しているようです。しかし、プライバシーに偏執的である場合は、独自のDoHリゾルバーを実行する必要があると思います。そうすれば、CloudflareもISPもあなたをスパイすることはできません。

DoHとDoT

DNS over HTTPSの他に、DNSクエリの暗号化を目的とした別のプロトコルがあります。これはDNSover TLS と呼ばれます (ドット)。以前、UbuntuデスクトップでDNS over TLSを使用するためのガイドを作成しましたが、現在はDNSoverHTTPSに切り替えています。

中国のようにインターネットの検閲が厳しい国に住んでいる人にとっては、DoHを使用する方が有利です。

  • DoTはTCPポート853で動作します 、国のファイアウォールで簡単にブロックできます。
  • DoHはTCPポート443で動作します 、これはHTTPS Webサイトの標準ポートであり、DoHをブロックするのが非常に困難です。TCPポート443がブロックされると、ほぼすべてのHTTPSWebサイトもブロックされるためです。

私のDoHリゾルバーは中国国外にあるVPS(仮想プライベートサーバー)で実行されており、中国のグレートファイアウォールは私のDNSクエリを傍受できません。 DoHリゾルバーのIPアドレスをCloudflareCDN(コンテンツ配信ネットワーク)の背後に隠すこともできます。

DoHのもう1つの利点は、Webアプリケーションが既存のブラウザAPIを介してDNS情報にアクセスできるため、スタブリゾルバが不要なことです。

主要なDNSリゾルバーでのDoHサポート

  • バインド まだ開発中のバージョン9.17でDoHをサポートします。 Ubuntu20.04および21.04リポジトリにはBIND9.16が付属しています。
  • 結び目 リゾルバー バージョン4.0.0以降のDoHをサポートします。現在の最新バージョンは5.11です。 Debian、Ubuntu、CentOS、Fedoraの公式リポジトリがあります。
  • バインドされていない バージョン1.12.0以降のDoHをサポートします。
  • PowerDNSリカーサー 現在、DoHをサポートしていません。

実際、私は DNSdistでDoHリゾルバーを実行することを好みます 、バージョン1.4.0でDoHサポートが追加されました。現在の最新バージョンは1.5です。 Debian、Raspbian、Ubuntu、CentOSの公式リポジトリがあります。 DNSdistは、DNSクエリをバックエンドDNSリゾルバーに転送できるDNSロードバランサーであるため、使用しているDNSリゾルバーに関係なく、DNSdistを使用して独自のDoHサーバーを実行できます。 DNSdistはPowerDNSチームによって開発されました。

前提条件

UbuntuサーバーでDNSリゾルバーが実行されていることを前提としています。任意のDNSリゾルバー(BIND、ノットリゾルバー、アンバウンド…)を使用できます。私は個人的にBINDを使用しています。

  • Ubuntu 16.04/18.04で独自のBIND9DNSリゾルバーを設定する
  • Ubuntu20.04で独自のBIND9DNSリゾルバーを設定する

DNSリゾルバーが起動して実行されたら、以下の手順に従ってください。

ステップ1:UbuntuサーバーにDNSdistをインストールする

非LTSUbuntuを使用する場合 、デフォルトのリポジトリからdnsdistをインストールする必要があります(sudo apt install dnsdist )。 Ubuntu LTSを使用する場合 、アップストリームリポジトリからDNSdistをインストールすることをお勧めします。これにより、最新の安定バージョンを入手できます。まず、DNSdistのソースリストファイルを作成する必要があります。

Ubuntu 20.04

echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu focal-dnsdist-15 main" | sudo tee /etc/apt/sources.list.d/pdns.list

Ubuntu 18.04

echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu bionic-dnsdist-15 main" | sudo tee /etc/apt/sources.list.d/pdns.list

Ubuntu 16.04

echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu xenial-dnsdist-15 main" | sudo tee /etc/apt/sources.list.d/pdns.list

次に、パッケージを固定するためのDNSdistの設定ファイルを作成します。これにより、誤って別のリポジトリからDNSdistをインストールすることがなくなります。

sudo nano /etc/apt/preferences.d/dnsdist

次の行をファイルに追加します。

Package: dnsdist*
Pin: origin repo.powerdns.com
Pin-Priority: 600

ファイルを保存して閉じます。次に、次のコマンドを実行してPowerDNS公開鍵をインポートし、APTパッケージマネージャーがこのリポジトリからダウンロードされたソフトウェアパッケージの相互関係を確認できるようにします。

curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -

次に、リポジトリリストを更新し、DNSdistをインストールします。

sudo apt update

sudo apt install dnsdist

デフォルトでは、DNSdistはポート53にバインドしようとします。ポート53でリッスンしているBINDのような既存のDNSリゾルバーがあるため、dnsdist.service 起動に失敗します。

DoHリゾルバーを展開しているだけで、DNS負荷分散を気にしないため、別のポートでリッスンするようにDNSdistを構成できます。 DNSdist構成ファイルを編集します。

sudo nano /etc/dnsdist/dnsdist.conf

このファイルにはコンテンツがありません。今のところ、このファイルに次の行を追加するだけで、DNSdistはポート53ではなくTCPおよびUDPポート5353でリッスンします。

setLocal("127.0.0.1:5353")

ファイルを保存して閉じます。次に、DNSdistを再起動します。

sudo systemctl restart dnsdist

ステータスを確認してください。

systemctl status dnsdist

アクティブ(実行中)である必要があります 。

ステップ2:Let’s Encrypt Client(Certbot)をUbuntuサーバーにインストールする

DNS over HTTPSでは、サーバー側にTLS証明書をインストールする必要があります。 Let'sEncrypt証明書を取得してインストールします。 Let’s Encrypt証明書を使用する利点は、無料で、セットアップが簡単で、クライアントソフトウェアによって信頼されていることです。

次のコマンドを実行して、デフォルトのUbuntuリポジトリからLet’s Encryptクライアント(certbot)をインストールします。

sudo apt install certbot

バージョン番号を確認するには、

を実行します
certbot --version

サンプル出力:

certbot 0.40.0

ステップ3:Let’sEncryptから信頼できるTLS証明書を取得する

standaloneの使用をお勧めします またはwebroot dnsdistのTLS証明書を取得するためのプラグイン。

スタンドアロンプ​​ラグイン

Ubuntuサーバーで実行されているWebサーバーがない場合は、スタンドアロンプ​​ラグインを使用して、Let’sEncryptからTLS証明書を取得できます。サブドメイン(doh.example.com)のDNS Aレコードを作成してから、次のコマンドを実行します。

sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d doh.example.com

場所:

  • certonly :証明書を取得しますが、インストールしないでください。
  • --standalone :スタンドアロンプ​​ラグインを使用して証明書を取得します
  • --preferred-challenges http :http-01チャレンジを実行して、ポート80を使用するドメインを検証します。
  • --agree-tos :Let'sEncryptの利用規約に同意します。
  • --email :メールアドレスはアカウントの登録と復旧に使用されます。
  • -d :ドメイン名を指定してください。

次のスクリーンショットからわかるように、証明書を正常に取得しました。

webrootプラグインの使用

Ubuntuサーバーにポート80と443でリッスンしているWebサーバーがある場合、webrootプラグインはほとんどすべてのWebサーバーで機能し、証明書をインストールする必要がないため、webrootプラグインを使用して証明書を取得することをお勧めします。 Webサーバーで。

まず、doh.example.comの仮想ホストを作成する必要があります。

Apache

Apacheを使用している場合は、

sudo nano /etc/apache2/sites-available/doh.example.com.conf

そして、次の行をファイルに貼り付けます。

<VirtualHost *:80>        
        ServerName doh.example.com

        DocumentRoot /var/www/dnsdist
</VirtualHost>

ファイルを保存して閉じます。次に、Webルートディレクトリを作成します。

sudo mkdir /var/www/dnsdist

www-data(Apacheユーザー)をWebルートの所有者として設定します。

sudo chown www-data:www-data /var/www/dnsdist -R

この仮想ホストを有効にします。

sudo a2ensite doh.example.com

変更を有効にするためにApacheをリロードします。

sudo systemctl reload apache2

仮想ホストを作成して有効にしたら、次のコマンドを実行して、webrootプラグインを使用してLet’sEncrypt証明書を取得します。

sudo certbot certonly --webroot --agree-tos --email [email protected] -d doh.example.com -w /var/www/dnsdist

Nginx

Nginxを使用している場合は、

sudo nano /etc/nginx/conf.d/doh.example.com.conf

次の行をファイルに貼り付けます。

server {
      listen 80;
      server_name doh.example.com;

      root /var/www/dnsdist/;

      location ~ /.well-known/acme-challenge {
         allow all;
      }
}

ファイルを保存して閉じます。次に、Webルートディレクトリを作成します。

sudo mkdir -p /var/www/dnsdist

www-data(Nginxユーザー)をWebルートの所有者として設定します。

sudo chown www-data:www-data /var/www/dnsdist -R

変更を有効にするためにNginxをリロードします。

sudo systemctl reload nginx

仮想ホストを作成して有効にしたら、次のコマンドを実行して、webrootプラグインを使用してLet’sEncrypt証明書を取得します。

sudo certbot certonly --webroot --agree-tos --email [email protected] -d doh.example.com -w /var/www/dnsdist

ステップ4:DNSdistでDoHを有効にする

DNSdist構成ファイルを編集します。

sudo nano /etc/dnsdist/dnsdist.conf

次の行をファイルに追加します。

-- allow query from all IP addresses
addACL('0.0.0.0/0')

-- add a DoH resolver listening on port 443 of all interfaces
addDOHLocal("0.0.0.0:443", "/etc/letsencrypt/live/doh.example.com/fullchain.pem", "/etc/letsencrypt/live/doh.example.com/privkey.pem", { "/" }, { doTCP=true, reusePort=true, tcpFastOpenSize=0 })

-- downstream resolver
newServer({address="127.0.0.1:53",qps=5, name="resolver1"})

ファイルを保存して閉じます。 DNSdistは_dnsdistとして実行されます ユーザーなので、_dnsdistを指定する必要があります 次のコマンドを使用してTLS証明書を読み取るためのユーザー権限。

sudo apt install acl

sudo setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/

次に、構成ファイルの構文を確認します。

sudo dnsdist --check-config

構文に問題がない場合は、DNSdistを再起動します。

sudo systemctl restart dnsdist

TCPポート443でリッスンしているウェブサーバーがある場合、DNSdistは再起動に失敗することに注意してください。 Webサーバーを一時的に停止できます。この記事の最後で、WebサーバーとDNSdistがTCPポート443を同時に使用するようにする方法について説明します。

CertbotがTLS証明書を更新するときは、再度アクセス許可を付与する必要がありますが、コマンドをcrontabファイルに追加できます。

sudo crontab -e

このように:

@daily certbot renew --quiet && setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/

ステップ5:FirefoxWebブラウザーでDoHを構成する

設定に移動します ->一般 一番下までスクロールして、ネットワーク設定を構成します 。 DNS over HTTPSを有効にし、独自のDoHリゾルバーを設定します。

次に、about:configに移動して、DoH構成を微調整できます。 Firefoxのタブ。

network.trr.mode

デフォルトでは、network.trr.mode Firefoxのパラメータは2に設定されています 、つまり、DoHクエリが失敗した場合、FirefoxはDNSクエリをホストシステムに渡します。常にDoHリゾルバーを使用したいので、network.trr.modeを変更します 3へ そのため、ホストリゾルバーは使用されません。これにより、DoHリゾルバーが機能しているかどうかを簡単にテストできます。

network.trr.allow-rfc1918

これはfalseに設定されています デフォルトでは、これはDNS応答にプライベートIPアドレスが含まれている場合、使用されない間違った応答と見なされることを意味します。 BINDで応答ポリシーゾーンを使用する場合は、プライベートIPアドレスを指すホスト名がいくつかある可能性があります。次に、この値をtrueに設定します。 。

network。trr。bootstrapAddress

Firefoxは、DNSクエリを送信するために、DoHリゾルバーのIPアドレスを検索する必要があります。このフィールドにIPアドレスを入力して、この最初のクエリを削除できます。

テスト

次に、linuxbabe.comのようなドメイン名を入力します Firefoxのアドレスバーにあります。ウェブページが正常に読み込まれる場合は、DoHリゾルバーが機能していることを示しています。次に、DNSサーバーのターミナルコンソールに移動し、DNSクエリログを確認します。 BINDを使用しているので、次のコマンドを入力してDNSクエリログを確認します。

Ubuntu 20.04

sudo journalctl -eu named

Ubuntu 18.04

sudo journalctl -eu bind9

以下のBINDログからわかるように、Firefoxは次のドメインを照会しました。

  • www.linuxbabe.com :私のウェブサイト
  • fonts.gstatic.com :これは私のウェブサイトでGoogleフォントを提供します
  • cdn.shareaholic.net :私のウェブサイト上の共有ウィジェット
  • newsletter.linuxbabe.com :私の自己ホスト型メールマーケティングプラットフォーム。
  • translate.google.com :私のウェブサイトのGoogle翻訳ウィジェット

上記のクエリログは、DNSoverHTTPSリゾルバーが機能していることを示しています。 BINDリゾルバーを停止した場合(sudo systemctl stop named )、Firefoxはそのサイトが見つからないと言っています。そして、BINDを開始すると、Webページが再び読み込まれます。

ステップ6:UbuntuデスクトップでDoHクライアントを構成する

Linuxには暗号化されたDNSをサポートする3つのオープンソースDNSクライアントがあることを知っています。

  • systemd-解決済み
  • スタビー
  • dnscrypt-proxy

現在、dnscrypt-proxy Linuxでの最高のDoHクライアント実装なので、その使用方法を紹介します。次のコマンドを実行して、dnscrypt-proxyをインストールします Ubuntuデスクトップで。

sudo apt install dnscrypt-proxy

ご覧のとおり、自動的に起動します:

sudo systemctl status dnscrypt-proxy

起動しなかった場合は、次のコマンドを実行して起動できます。

sudo systemctl enable dnscrypt-proxy --now

リスニングアドレスを確認してください。

sudo ss -lnptu | grep dnscrypt-proxy

私のコンピューターでは、dnscrypt-proxyは127.0.2.1:53をリッスンします 。別のsystemdサービスがあります(dnscrypt-proxy-resolvconf.service )dnscrypt-proxyによってインストールされます

systemctl status dnscrypt-proxy-resolvconf

127.0.2.1を設定するサービスです コンピューターのリゾルバーとして。コンピュータの現在のDNSリゾルバは次のコマンドで確認できます:

cat /etc/resolv.conf

デフォルトでは、dnscrypt-proxyはアップストリームDoHリゾルバーとしてClouldflareを使用します。独自のDoHリゾルバーを使用するには、構成ファイルを編集します。

sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml

次の行を見つけます

server_names = ['cloudflare']

DoHリゾルバーのホスト名に変更します。パラメータの場所が重要であることに注意してください。 server_namesを配置しないでください このファイルの他の場所のパラメータ。

server_names = ['doh.example.com']

次に、[sources]をコメントアウトします セクション。

#[sources]
#  [sources.'public-resolvers']
#  url = 'https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md'
#  cache_file = '/var/cache/dnscrypt-proxy/public-resolvers.md'
#  minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'
#  refresh_delay = 72
#  prefix = ''

このファイルの最後に、以下のような独自のDoHリゾルバーを追加する必要があります。

[static]  
  [static.'doh.example.com']
  stamp = 'sdns://AgUAAAAAAAAAAAAOZG5zLmdvb2dsZS5jb20NL2V4cGVyaW1lbnRhbA'

スタンプには、DoHリゾルバーのホスト名、IPアドレス、およびクエリパスが含まれています。独自のスタンプを取得するには、オンラインDNSスタンプ計算機を使用してください。プロトコルとしてDNS-over-HTTPSを選択し、IPアドレス、ホスト名、およびクエリパスを入力します。このチュートリアルに従って独自のDoHリゾルバーを設定する場合は、パスを/に設定する必要があります。 。リゾルバーでDNSSECを有効にしていない場合は、[DNSSEC]チェックボックスをオフにします。

DNSスタンプを追加したら、ファイルを保存して閉じます。次に、dnscrypt-proxyを再起動します 。

sudo systemctl restart dnscrypt-proxy

ステータスを確認してください。実行されていることを確認してください。

systemctl status dnscrypt-proxy

これで、dnscrypt-proxyが機能しているかどうかをテストできます。

DNS over HTTPSリゾルバーを世界中に公開したくない場合は、dnscrypt-proxyのDNSスタンプにIPアドレスが含まれているため、DoHリゾルバーのホスト名のDNSAレコードを削除できます。

iOSでDoHを構成する

iOSは、iOS14以降のDNSover HTTPSをサポートしています。ただし、iOSには、DoHリゾルバーを設定するための簡単な構成オプションはありません。 .mobileconfigを生成する必要があります ファイルを作成してiOSにインストールします。署名されたiOS.mobileconfigを生成するのは少し複雑です ファイル。

DoHリゾルバーが公に使用されない場合は、単純な署名されていないファイルを生成できます。テキストエディタを使用して、.mobileconfigでファイルを作成します 拡大。次のテキストをコピーして貼り付けます。 IPアドレスとサーバーのURLを置き換えます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>PayloadContent</key>
        <array>
                <dict>
                        <key>DNSSettings</key>
                        <dict>
                                <key>DNSProtocol</key>
                                <string>HTTPS</string>
                                <key>ServerAddresses</key>
                                <array>
                                        <string>12.34.56.78</string>
                                </array>
                                <key>ServerURL</key>
                                <string>https://doh.example.com/</string>
                        </dict>
                        <key>PayloadDescription</key>
                        <string>Configures device to use Encrypted DNS over HTTPS</string>
                        <key>PayloadDisplayName</key>
                        <string>My own DNS over HTTPS Resolver</string>
                        <key>PayloadIdentifier</key>
                        <string>com.apple.dnsSettings.managed.9d6e5fdf-e404-4f34-ae94-27ed2f636ac4</string>
                        <key>PayloadType</key>
                        <string>com.apple.dnsSettings.managed</string>
                        <key>PayloadUUID</key>
                        <string>35d5c8a0-afa6-4b36-a9fe-099a997b44ad</string>
                        <key>PayloadVersion</key>
                        <integer>1</integer>
                        <key>ProhibitDisablement</key>
                        <false/>
                </dict>
        </array>
        <key>PayloadDescription</key>
        <string>Adds self-hosted DoH resolver to Big Sur and iOS 14 based systems</string>
        <key>PayloadDisplayName</key>
        <string>My own DNS over HTTPS</string>
        <key>PayloadIdentifier</key>
        <string>com.example.doh</string>
        <key>PayloadRemovalDisallowed</key>
        <false/>
        <key>PayloadType</key>
        <string>Configuration</string>
        <key>PayloadUUID</key>
        <string>A4475135-633A-4F15-A79B-BE15093DC97A</string>
        <key>PayloadVersion</key>
        <integer>1</integer>
</dict>
</plist>

ファイルを保存して閉じます。次に、ファイルを電子メールの添付ファイルとしてiOSに送信できます。 iOSでメールを開き、添付ファイルをタップして構成ファイルをダウンロードします。その後、iOSのSettingsに移動します ->Profile Downloaded 。プロファイルをインストールするように求められます。

[インストール]ボタンをタップし、iOSパスワードを入力してインストールします。 [インストール]ボタンをもう一度タップします。

インストールしたら、iOSのSettingsに移動します -> VPN & Network 。一番下までスクロールして、iOSシステムのDNSリゾルバーを選択します。このDoHリゾルバーは、ProtonVPNなどのVPNによって提供されるDNSリゾルバーをオーバーライドすることに注意してください。 iOSは常にDoHリゾルバーを使用します。

.mobileconfigを削除したい場合 iOSからファイルを取得するには、Settingsに移動します ->General ->Profile

DNSdistとWebサーバーが同時にポート443を使用するようにします

DNSoverHTTPSリゾルバーはポート443にバインドする必要があります。すでにApache/Nginxがポート443でリッスンしている場合、DNSdistはポート443にバインドできません。通常、ポートは1つのプロセスでのみ使用できます。ただし、HAproxy(高可用性プロキシ)とSNI(サーバー名表示)を使用して、DNSdistとApache/Nginxが同時にポート443を使用するようにすることができます。

DNSdist構成

DNSdist構成ファイルを編集します。

sudo nano /etc/dnsdist/dnsdist.conf

DoHリスニングアドレスを127.0.0.1に変更します 。

addDOHLocal("127.0.0.1:443", "/etc/letsencrypt/live/doh.example.com/fullchain.pem", "/etc/letsencrypt/live/doh.example.com/privkey.pem", { "/" }, { doTCP=true, reusePort=true, tcpFastOpenSize=0 })

ファイルを保存して閉じます。次に、DNSdistを再起動します。

sudo systemctl restart dnsdist

Nginx構成

Nginxを使用する場合は、サーバーブロックファイルを編集します。

sudo nano /etc/nginx/conf.d/example.com.conf

SSLサーバーブロックで、次のディレクティブを見つけます。

listen 443 ssl;

に変更

listen 127.0.0.2:443 ssl;

今回は127.0.0.2:443でリッスンさせます 127.0.0.1:443 すでにDNSdistによって取得されています。ファイルを保存して閉じます。 Nginxメイン構成ファイル/etc/nginx/nginx.conf およびデフォルトのサーバーブロック/etc/nginx/sites-enabled/default 443でリッスンしているデフォルトの仮想ホストが含まれている可能性があるため、このファイルも編集する必要がある場合があります。

次に、Nginxを再起動します。

sudo systemctl restart nginx

Apache構成

Apache Webサーバーを使用している場合は、仮想ホストファイルを編集します。

sudo nano /etc/apache2/sites-enabled/example.com.conf

SSL仮想ホストで変更

<VirtualHost *:443>

宛先

<VirtualHost 127.0.0.2:443>

今回は127.0.0.2:443でリッスンさせます 127.0.0.1:443 すでにDNSdistによって取得されています。ファイルを保存して閉じます。次に、/etc/apache2/ports.confを編集します ファイル。

sudo nano /etc/apache2/ports.conf

変更

Listen 443

宛先

Listen 127.0.0.2:443

ファイルを保存して閉じます。 Apacheを再起動します。

sudo systemctl restart apache2

HAProxy構成

次に、HAproxyをインストールします。

sudo apt install haproxy

HAProxyを起動します

sudo systemctl start haproxy

構成ファイルを編集します。

sudo nano /etc/haproxy/haproxy.cfg

Nginxを使用する場合 、次の行をコピーしてファイルの最後に貼り付けます。 12.34.56.78を置き換えます サーバーのパブリックIPアドレスを使用します。 doh.example.comを置き換えます DNSdistとwww.example.comで使用されるドメイン名 Webサーバーで使用されているドメイン名を使用します。

frontend https
   bind 12.34.56.78:443
   mode tcp
   tcp-request inspect-delay 5s
   tcp-request content accept if { req_ssl_hello_type 1 }

   use_backend dnsdist if { req_ssl_sni -i doh.example.com }
   use_backend nginx if { req_ssl_sni -i www.example.com }
   use_backend nginx if { req_ssl_sni -i example.com }

   default_backend dnsdist

backend dnsdist
   mode tcp
   option ssl-hello-chk
   server dnsdist 127.0.0.1:443

backend nginx
   mode tcp
   option ssl-hello-chk
   server nginx 127.0.0.2:443 check

Apacheを使用する場合 、次の行をコピーしてファイルの最後に貼り付けます。 12.34.56.78を置き換えます サーバーのパブリックIPアドレスを使用します。 doh.example.comを置き換えます DNSdistとwww.example.comで使用されるドメイン名 Webサーバーで使用されているドメイン名を使用します。

frontend https
   bind 12.34.56.78:443
   mode tcp
   tcp-request inspect-delay 5s
   tcp-request content accept if { req_ssl_hello_type 1 }

   use_backend dnsdist if { req_ssl_sni -i doh.example.com }
   use_backend apache if { req_ssl_sni -i www.example.com }
   use_backend apache if { req_ssl_sni -i example.com }

   default_backend dnsdist

backend dnsdist
   mode tcp
   option ssl-hello-chk
   server dnsdist 127.0.0.1:443

backend apache
    mode tcp
    option ssl-hello-chk
    server apache 127.0.0.2:443 check

ファイルを保存して閉じます。次に、HAproxyを再起動します。

sudo systemctl restart haproxy

上記の構成では、TLSのSNI(Server Name Indication)機能を利用して、VPNトラフィックと通常のHTTPSトラフィックを区別しました。

  • doh.example.comの場合 TLSクライアントにありますこんにちは、HAProxyはトラフィックをDNSdistバックエンドにリダイレクトします。
  • www.example.comの場合 TLSクライアントにありますこんにちは、HAProxyはトラフィックをapache/nginxバックエンドにリダイレクトします。
  • クライアントがTLSClientHelloでサーバー名を指定しない場合、HAproxyはデフォルトのバックエンド(DNSdist)を使用します。

この設定は、opensslでテストできます。 道具。まず、次のコマンドを複数回実行します。

echo | openssl s_client -connect your-server-IP:443 | grep subject

上記のコマンドでサーバー名を指定しなかったため、HAproxyは常にリクエストをデフォルトのバックエンド(DNSdist)に渡し、その証明書がクライアントに送信されます。次に、次の2つのコマンドを実行します。

echo | openssl s_client -servername www.example.com -connect your-server-IP:443 | grep subject

echo | openssl s_client -servername doh.example.com -connect your-server-IP:443 | grep subject

コマンドでサーバー名を指定したので、HAproxyは定義したSNIルールに従ってリクエストを渡します。

WebサイトのLet'sEncrypt証明書を更新するときは、http-01を使用することをお勧めします。 tls-alpn-01の代わりにチャレンジ HAproxyはパブリックIPアドレスのポート443をリッスンしているため、更新プロセスに干渉する可能性があるため、課題があります。

sudo certbot renew --preferred-challenges http-01

Ubuntu
  1. Ubuntu18.04でUFWを使用してファイアウォールを設定する方法

  2. Ubuntu20.04でDnsmasqを使用してローカルDNSリゾルバーをセットアップする方法

  3. Ubuntu20.04でUnboundDNSリゾルバーを設定する方法

  1. Ubuntu 20.04/18.04でLetsEncryptを使用してNginxを保護する方法

  2. Ubuntu20.04でDNSネームサーバーを設定する方法

  3. Ubuntu18.04でDNSネームサーバーを設定する方法

  1. Ubuntu20.04でUFWを使用してファイアウォールを設定する方法

  2. DNSdistを使用してDebianでDNSoverHTTPS(DoH)リゾルバーを設定する

  3. BIND9を使用してDebian10Busterで独自のDNSリゾルバーを設定する