Windows ホストにDNSサーバーを立てる
カテゴリー: General
2021-07-18
Windows ホストにDNSサーバーを立てる
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.* の設定を取り込む
一度構築してしまえばアプリは、ほぼ無管理で運用できそうな予感
セキュリティ対応のDNSにしないとよくないらしいですが、ルーター管理のローカルネットワーク内だから大丈夫でしょう。
【続き】
hostファイルの自動ロードと
タスクトレイのコンポーネントとタスクバー非表示を実装するだけで、実用できました。
ゲストOSの 192.168の個別定義を無事廃止できました🌻
ワームが侵入して、ローカルのDNSに割り込みかけてすり替わると危険ですね。
その辺のセキュリティは、ファイルのプロパティでアクセスできる権限を指定する。
ゲストOSでの確認
TIdDNSServer : テストコード
下記のコードは最小のテスト用コードなのでタスクトレイなどは入れていません
キーワード:
執筆:2021.07.18
編集:2021.07.18
編集:2021.11.19
編集:2021.12.5
編集: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サービスは、別マシンに作ったほうがいいかもです
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機能が搭載されていました。
WIFIの脆弱性があるのでセキュリティ的に問題がありますが、古いルーターから wifiを飛ばせば、簡単に名前解決でき、スマホ、タブレットでプライベートドメイン名でアクセスできました。
必要な時だけ電源いれて、出力を12.5%に絞っているので外にはほとんど漏れていないと思います。
いろいろ触ってわかったこと
中継機能/子機モードは、WIFIを使ったブリッジ接続で、中継機能/子機モードの違いはWIFIのアクセスポイントの有無だけ。
親機がスマホの場合、中継機能/子機モードは、DHCP機能がなくなるので、任意の固定プライベートIPを割り当てるには もう1個ルーターを挟む必要がある。
「DNSルーティング設定」がある最新のルーターに買い替えれば、脆弱性も含めて解決ですね
来年以降、WIFI6の安くていいのがあれば買い換えてみようと思います。
手持ちのルーターで解決できる問題でしたので
WSL2と競合するのでWindowsのDNSアプリは撤去しました。
Aterm WG1800HP4は、先日解約したトリオモデムと相性が悪く、NECサポートに問い合わせて教えてもらった設定にしないと 不定期にインターネット未接続になる(WAN端子切断)現象があったので、
また次のプロバイダでAtermでデフォルト設定で接続できないとか発生すると、目から涙になるので
WIFIルーターは脆弱性問題で長く使える製品ではないし
今度は、お試しで 他のメーカーにしようと思います!
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\.
・不足分のドメインリストをアプリで設定する# 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 : テストコード
下記のコードは最小のテスト用コードなのでタスクトレイなどは入れていません
GetIPAdressFromHostName,GetHostNameFromIPAddress
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;
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
TIdDNSServer サンプルコード
TIdDNSServer example code