このチュートリアルでは、独自の DNS over HTTPSを設定する方法を紹介します。 (DoH)リゾルバー DNSdistを使用するDebianで、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は、プレーンテキストのHTTP接続を暗号化する標準的な方法です。 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クエリの暗号化を目的とした別のプロトコルがあります。これはDNSover TLS と呼ばれます (ドット)。 DNS over HTTPSを使用する利点は何ですか?
中国のようにインターネットの検閲が厳しい国に住む人々にとっては、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をサポートします。 Debian10にはBIND9.11が同梱されています。
- 結び目 リゾルバー バージョン4.0.0以降のDoHをサポートします。現在の最新バージョンは5.3.2です。 Debian、Debian、CentOS、Fedoraの公式リポジトリがあります。
- バインドされていない バージョン1.12.0以降のDoHをサポートします。
- PowerDNSリカーサー 現在、DoHをサポートしていません。
実際、私は DNSdistでDoHリゾルバーを実行することを好みます 、バージョン1.4でDoHサポートが追加されました。現在の最新バージョンは1.6です。 Debian、Raspbian、Debian、CentOSの公式リポジトリがあります。 DNSdistは、DNSクエリをバックエンドDNSリゾルバーに転送できるDNSロードバランサーであるため、使用しているDNSリゾルバーに関係なく、DNSdistを使用して独自のDoHサーバーを実行できます。 DNSdistはPowerDNSチームによって開発されました。
要件
DebianサーバーでDNSリゾルバーが実行されていることを前提としています。任意のDNSリゾルバー(BIND、ノットリゾルバー、アンバウンド…)を使用できます。私は個人的にBINDを使用しています。
- Debian10バスターで独自のBIND9DNSリゾルバーを設定する
DNSリゾルバーが起動して実行されたら、以下の手順に従ってください。
ステップ1:DebianサーバーにDNSdistをインストールする
最新の安定バージョンを入手できるように、アップストリームリポジトリからDNSdistをインストールすることをお勧めします。まず、DNSdistのソースリストファイルを作成する必要があります。
Debian 10
echo "deb [arch=amd64] http://repo.powerdns.com/debian buster-dnsdist-16 main" | sudo tee /etc/apt/sources.list.d/pdns.list
Debian 9
echo "deb [arch=amd64] http://repo.powerdns.com/debian stretch-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)をDebianサーバーにインストールする
DNS over HTTPSでは、サーバー側にTLS証明書をインストールする必要があります。 Let'sEncrypt証明書を取得してインストールします。 Let’s Encrypt証明書を使用する利点は、無料で、セットアップが簡単で、クライアントソフトウェアによって信頼されていることです。
次のコマンドを実行して、デフォルトのDebianリポジトリからLet’s Encryptクライアント(certbot)をインストールします。
sudo apt install certbot
バージョン番号を確認するには、
を実行しますcertbot --version
サンプル出力:
certbot 0.31.0
ステップ3:Let’sEncryptから信頼できるTLS証明書を取得する
standaloneの使用をお勧めします またはwebroot dnsdistのTLS証明書を取得するためのプラグイン。
スタンドアロンプラグイン
Debianサーバーで実行されている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プラグインの使用
Debianサーバーにポート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を同時に使用するようにする方法について説明します。
ステップ5:FirefoxWebブラウザーでDoHを構成する
設定に移動します ->一般 一番下までスクロールして、ネットワーク設定を構成します 。 DNS over HTTPSを有効にし、独自のDoHリゾルバーを設定します。
次に、about:configに移動して、DoH構成を微調整できます。 Firefoxのタブ。
network.trr.mode
デフォルトでは、network. 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クエリログを確認します。
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:DebianデスクトップでDoHクライアントを設定する
Linuxには暗号化されたDNSをサポートする3つのオープンソースDNSクライアントがあることを知っています。
- systemd-解決済み
- スタビー
- dnscrypt-proxy
現在、dnscrypt-proxy (バージョン2.x)はLinux上で最高のDoHクライアント実装であるため、その使用方法を紹介します。次のコマンドを実行して、dnscrypt-proxyをインストールします Debianデスクトップ上。
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