
質問に入る前に、背景情報を少し簡単に説明します。
私は、Windows 7 を実行しているコンピューターと連携して動作する小さな実験を構築しました。このコンピューターには、実験から取得したステータス情報で継続的に更新される Web ページを提供する小さな Web サーバーがあります。この実験は、いくつかのイベント (MakerFaire など) で公開される予定です。できるだけ設定を少なくして、スマートフォン (またはラップトップ) を使用してこの Web ページを直接表示できるようにしていただければ幸いです。
基本的に私が達成しようとしていることは次のとおりです。
Wi-Fiアクセスポイントを作成するコンピュータの内蔵Wi-Fiアダプタを使用するユーザーが接続できるもの(オープンまたはパスワード保護)
DNS および/または HTTP リクエストを傍受してリダイレクトし、ブラウザを開いたときに実験 Web ページが表示されるようにします (キャプティブ ポータルのように)
これまでのところ、Windows 7 のホスト ネットワーク機能を使用してポイント 1 を達成できました。この機能は、Wifi AP の部分では非常にうまく機能します。ただし、DHCP 応答を変更してカスタム DNS サーバーを提供し、すべてのトラフィックを Web サーバーに転送するというところで行き詰まっています。これを実行する方法はありますか?
私が抱えている制約がいくつかあります (そうでないと簡単すぎてしまいます ;-) ):
- 私は Windows 7 で行き詰まっています (Linux ならこの問題はずっと前に解決されていたはずです!)
- コンピューターはスタンドアロン マシンです。つまり、他のネットワークやインターネットにアクセスすることはできません。つまり、ルーターやその他の外部デバイスも不要になります。
ご協力やご提案をいただければ幸いです。
答え1
- MaraDNSを入手
MaraDNS は、Windows および Linux 用の無料かつ軽量で、比較的簡単に設定できる DNS サーバーです。ここからダウンロードして、任意のフォルダーに解凍してください。
- MaraDNS を設定する
「secret.txt」を開き、値を別の値(ランダムな文字)に変更します。
MaraDNS の設定は、同じディレクトリの「mararc」ファイルにあります。DNS サーバーには 2 セットの機能があります。これらは、「権威ネーム サーバー」または「再帰/キャッシュ ネーム サーバー」として機能します。
権威ネーム サーバーは、ドメイン名の IP アドレスを指定します。再帰ネーム サーバーは、権威ネーム サーバーからの情報を保存し、再帰的にクエリを渡します。
MaraDNS で権威機能と再帰機能の両方を構成します。
2.1 権限のある構成
LAN ドメイン名の権威ある名前を提供するようにサーバーを構成します。任意のドメインを選択します。私は「local.com」を選択しました (ただし、既存のドメイン名を選択した場合は、実際の「local.com」Web サイトにアクセスできないことに注意してください)。
次のような設定行を「mararc」に追加します。
csv2 = {}
csv2["local.com."] = "db.lan.txt"
ここで、local.com は選択したドメイン名、db.lan.txt は次に作成する 2 番目の構成ファイルの名前です (2 番目の構成ファイルに名前を付ける場合は変更してください)。
MaraDNSと同じディレクトリに「db.lan.txt」という名前の新しいファイルを作成します。
名前を解決する各コンピューターごとに、「db.lan.txt」に行を追加します。たとえば、1 台が「dev.local.com」、もう 1 台が「blog.local.com」の 2 台のコンピューターの場合は、次の行を追加します。
dev.% 192.168.1.4 ~
blog.% 192.168.1.6 ~
終わり!
2.2 再帰構成
他のすべてのドメインのデフォルトのネーム サーバーに問い合わせるように MaraDNS を設定し、他のすべてのドメイン名を正しい IP アドレスに解決できるようにします。
ISP の DNS サーバー アドレスを確認します。これらのアドレスは、ルーターのステータス ページに表示されるか、ネットワーク アダプターの詳細を確認することで確認できます。
次に、ISP の DNS サーバーを「mararc」のアップストリーム サーバーとして追加します。
upstream_servers = {}
upstream_servers["."] = "xxx.xxx.xxx.xxx, yyy.yyy.yyy.yyy"
ここで、xxx.xxx.xxx.xxx と yyy.yyy.yyy.yyy は ISP の DNS サーバーです。
終わり!
- MaraDNSを実行し、askmara.exeを使用してテストします。
「runmara.bat」をダブルクリックし、サーバーを実行したままにします。
コマンド プロンプトを開き、MaraDNS ディレクトリに移動して、次のコマンドを実行してみてください。
askmara.exe Agoogle.com.
そして
askmara.exe Ablog.local.com.
次のような返信が返ってくるはずです:
# Querying the server with the IP 127.0.0.1
# Question: Agoogle.com.
google.com. +300 a 74.125.67.100
google.com. +300 a 74.125.53.100
google.com. +300 a 74.125.45.100
# NS replies:
# AR replies:
そして:
# Querying the server with the IP 127.0.0.1
# Question: Ablog.local.com.
blog.local.com. +86400 a 192.168.1.6
# NS replies:
#local.com. +86400 ns synth-ip-7f000001.local.com.
# AR replies:
#synth-ip-7f000001.local.com. +86400 a 127.0.0.1
最初のクエリで問題が発生する場合は、再帰 DNS 設定が間違っています (ISP DNS サーバー アドレスは正しいですか?)。また、2 番目のクエリでエラーが発生する場合は、権限のある設定が間違っています。
- MaraDNS を変更して LAN からのクエリに応答する
MaraDNS ウィンドウをシャットダウンし、「mararc」の最初の 2 行を次のように変更します。
ipv4_bind_addresses = "192.168.1.2
recursive_acl = "192.168.1.0/24"
ここで、192.168.1.2 はサーバーが実行されるコンピューターの IP アドレスであり、recursive_acl の「192.168.1」の部分はネットワーク上のものと同じです (192.168.0.0/24 の場合もあります)。
MaraDNS を再度起動し、実行したままにします。
- 新しいDNSサーバーを配布するようにルーターを設定する
ルーターの Web インターフェイスを開き、DHCP サーバー設定を見つけます。DNS サーバーを設定するオプションがあるはずです。DNS サーバーを実行するコンピューターの IP アドレスを入力します。
各コンピューターで、ネットワークを切断します (たとえば、Windows ではネットワークを無効にしてから有効にするか、Linux では「ifconfig eth0 down」/「ifconfig eth0 up」を使用します)。
これで完了です。LAN コンピュータをドメイン名で参照できるようになります。