日記帳
本ページはプロモーションが含まれています
カテゴリー
Links
blog(ブログ)マスター
アンドロイドの巣
ゼロから始めるベランダ菜園
タイトル
2024年11月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

Windows ホストにDNSサーバーを立てる

カテゴリー: General
2021-07-18
Windows ホストにDNSサーバーを立てる

執筆:2021.07.18
編集:2021.07.18
編集:2021.11.19
編集:2021.12.5


注)2021-11-19

DNSサーバーを立てると WSLサービス Ubuntu、docker が利用できません。
エラー: 0xffffffff
Press any key to continue...

参考:WslRegisterDistribution failed with error: 0xffffffff #4364
https://github.com/microsoft/WSL/issues/4364


DNSサービスは、別マシンに作ったほうがいいかもです


注)2021-12-5

Atermの上位機種のルーターにDNS機能がないので、まさかの買い替え前の低速の低価格のほうのルーターに「DNSルーティング設定」という簡易DNS機能が搭載されていました。

Aterm 買い替え前
のAterm
(脆弱性あり:
メーカー未対応)

脆弱性問題解決
と高速化のために
数年前に買ったルーター

Aterm WG1800HP4

簡易NAS ×
DNSルーティング ×
中継機能/子機モード ×
付属品:USB子機 ×
速度 WIFI
300Mbps
1300Mbps
450Mbps
速度 有線 1000Mbps 1000Mbps
WIFIバージョン WIFI4 WIFI5

WIFIの脆弱性があるのでセキュリティ的に問題がありますが、古いルーターから wifiを飛ばせば、簡単に名前解決でき、スマホ、タブレットでプライベートドメイン名でアクセスできました。

必要な時だけ電源いれて、出力を12.5%に絞っているので外にはほとんど漏れていないと思います。

いろいろ触ってわかったこと
中継機能/子機モードは、WIFIを使ったブリッジ接続で、中継機能/子機モードの違いはWIFIのアクセスポイントの有無だけ。
親機がスマホの場合、中継機能/子機モードは、DHCP機能がなくなるので、任意の固定プライベートIPを割り当てるには もう1個ルーターを挟む必要がある。

「DNSルーティング設定」がある最新のルーターに買い替えれば、脆弱性も含めて解決ですね
来年以降、WIFI6の安くていいのがあれば買い換えてみようと思います。

手持ちのルーターで解決できる問題でしたので
WSL2と競合するのでWindowsのDNSアプリは撤去しました。

Aterm WG1800HP4は、先日解約したトリオモデムと相性が悪く、NECサポートに問い合わせて教えてもらった設定にしないと 不定期にインターネット未接続になる(WAN端子切断)現象があったので、
また次のプロバイダでAtermでデフォルト設定で接続できないとか発生すると、目から涙になるので
WIFIルーターは脆弱性問題で長く使える製品ではないし
今度は、お試しで 他のメーカーにしようと思います!



C:\WINDOWS\SYSTEM32\DRIVERS\etc\hosts
/etc/hosts
に設定を加えていましたが管理が面倒です

https://www.nic.ad.jp/ja/newsletter/No22/080.html
> HOSTS.TXTからDNSへ
なるほど私は原始的なことをしていたわけですね 😅

ホストOSのほうは、コメントを入れたりしているので、手書きでいいのですが
ゲストOSにもドメインと固定IPを割りあてているため毎回入力更新はとても面倒です。

ゲストOSは、ホストのDNSサーバー指定するだけで解決するので
アプリで管理したほうがいいかも
ということで、検討に入りました。

アプリで対応する場合
・Windows付属のDNSサーバー
 (Windows Serverを持っていないので詳細不明)
・WSL2のゲスト内のDNSサーバー
・仮想マシンのゲストOSのDNSサーバー
・DNS専用 Windowsアプリ

機材で対応する場合
・DNSサーバー機能のあるなんらかの端末
ルーター、NAS、パソコンなど


フリーアプリは、余計な機能があると思うので、自前で調達。

さて、3分クッキングで完成できるのがありますよね。
TIdDNSServerを貼り付けて、入力して、Buildしたら完成。
カップラーメンより早い出来。

設定値をディスクに保存する場合は、書き込み権限などセキュリティを意識しないといけないし面倒。
設定値を変更したい場合は、コードを直接修正してアプリを再構築すればいいでしょう。

とにかく複数のこまかい管理は したくないのです.
取り合えず、下記の仕様で暫定運用してみようと思います
・アプリの多重起動を禁止しておく
・一定周期で、ホストOSのhostファイル更新時刻を確認する
・ホストOSの hostファイルを読み込んで、192.168.* の設定を取り込む
# private IP address
# 10.0.0.0 10.255.255.255 10\.
# 172.16.0.0 172.31.255.255 172\.(1[6-9]|2[0-9]|3[01])\.
# 192.168.0.0 192.168.255.255 192\.168\.
・不足分のドメインリストをアプリで設定する

一度構築してしまえばアプリは、ほぼ無管理で運用できそうな予感
セキュリティ対応のDNSにしないとよくないらしいですが、ルーター管理のローカルネットワーク内だから大丈夫でしょう。

【続き】

hostファイルの自動ロードと
タスクトレイのコンポーネントとタスクバー非表示を実装するだけで、実用できました。
ゲストOSの 192.168の個別定義を無事廃止できました🌻

ワームが侵入して、ローカルのDNSに割り込みかけてすり替わると危険ですね。
その辺のセキュリティは、ファイルのプロパティでアクセスできる権限を指定する。

ゲストOSでの確認
nslookup ドメイン名




TIdDNSServer : テストコード

下記のコードは最小のテスト用コードなのでタスクトレイなどは入れていません

procedure TForm1.FormCreate(Sender: TObject);
function AddDNSEntryA(AIP, AHost : String; ATTL:Integer=18000): Boolean;
var
LRR_A : TIdRR_A;
LIdDNS_UDPServer : TIdDNS_UDPServer;
begin
LIdDNS_UDPServer := IdDNSServer1.UDPTunnel;
LRR_A := TIdRR_A.Create; // Do not call Free.
if TextEndsWith(AHost, '.') then
LRR_A.RRName := AHost
else
LRR_A.RRName := AHost + '.';
LRR_A.Address := AIP;
LRR_A.TTL := ATTL;
LIdDNS_UDPServer.UpdateTree(LIdDNS_UDPServer.Handed_Tree, LRR_A);
if Assigned(LIdDNS_UDPServer.FindHandedNodeByName(LRR_A.RRName, TypeCode_A))
and
(LIdDNS_UDPServer.Handed_DomainList.IndexOf(LRR_A.RRName) = -1) then
LIdDNS_UDPServer.Handed_DomainList.Add(LRR_A.RRName);
Result := True;
end;
begin
with IdDNSServer1 do
begin
// RootDNS_NET : Default timeout 5000msec (hard coding) : TIdDNS_UDPServer.ExternalSearch
UDPTunnel.RootDNS_NET.Clear; // Clear invalid Indy's buildin DNS address
UDPTunnel.RootDNS_NET.Add('1.1.1.2'); // 1.1.1.1 for Families adds a layer of malware protection
Bindings.Clear();
UDPTunnel.Bindings.Clear();

AddDNSEntryA('127.0.0.1', 'localhost'); // add localhost
AddDNSEntryA('127.0.0.1', 'localhost.home');

//InitForm;
end;
GetIPAdressFromHostName,GetHostNameFromIPAddress

uses IdGlobal, IdDNSCommon, IdSocketHandle;

function GetIPAdressFromHostName(AHostName : string; ADNS : string = '1.1.1.1') : string;
var i : Integer;
begin
Result := '';
with TIdDNSResolver.Create(nil) do
try
Host := ADNS;
QueryType := [qtA];
Resolve(AHostName);
for i := 0 to QueryResult.Count -1 do
if QueryResult.Items[i].RecType = qtA then
begin
Result := TARecord(QueryResult.Items[i]).IPAddress;
Break;
end;
finally
Free;
end;
end;

function GetHostNameFromIPAddress(AIP : string; ADNS : string = '1.1.1.1') : string;
var i : Integer;
begin
Result := AIP;
with TIdDNSResolver.Create(nil) do
try
Host := ADNS;
QueryType := [qtPTR];
Resolve(AIP);
for i := 0 to QueryResult.Count -1 do
if QueryResult.Items[i].RecType = qtPTR then
begin
Result := TPTRRecord(QueryResult.Items[i]).HostName;
Break;
end;
finally
Free;
end;
end;


キーワード:
Network Programing Delphi Indy
TIdDNSServer サンプルコード
TIdDNSServer example code


PR

[PR]