Tiny 11をMicrosoftと通信させない名前解決変更

Tiny 11をMicrosoftと通信させない名前解決変更

システム要件を満たさない低スペックのPCでWindows 11を使用した場合、2022年前半頃までは比較的快適に動作しており、むしろWindows 10より軽いと感じることさえありました。しかし、その後の更新に伴い、挙動が不安定になり、プチフリーズや長時間のフリーズが頻発するようになりました。古いインストールメディアを使用して再インストールすると、更新を適用するまでは軽快に動作するため、最新バージョンに更新することで問題が生じることが分かります。そして2023年2月以降、システム要件を満たさないPCでは画面右下に警告が表示されるようになり、さらに使い勝手が悪化。重さや警告表示の問題から、このOSは事実上使用に耐えなくなってしまいました。

そんな中、新たに登場したのが「Tiny 11」です。Tiny 11はWindows 11から様々な機能を省いて軽量化されたバージョンで、起動後の操作可能になるまでの時間が非常に短く、動作も軽快です。また、テレメトリ(使用状況データの送信)も減少していると考えられます。少し試してみた限りでは、純正のWindows 11よりも明らかに快適な使用感です。ただし、ウェブ上で見かける「メモリ使用量が1GB未満」という情報は正しくなく、実際には2GB程度のメモリを使用しています(これはb2版の場合)。Tiny 11に怪しい点が全くないわけではないため、メインPCでの使用は推奨されませんが、2015年以前の低スペックPCでWindows 11を使いたい場合、このような軽量版を検討する価値があります。

一方で、Tiny 11をシステム要件を満たさない低スペックPCにインストールした場合、Windowsの更新を適用すると動作が重くなる傾向があります。特に、起動後にシステムがビジー状態になる時間が長引き、せっかくの軽量化が台無しになってしまいます。したがって、Tiny 11ではWindows Updateの適用を控えることが望ましいです。しかし、Tiny 11は標準でWindows Updateが有効になっており、何も対策しないと自動で更新されてしまう可能性があります。今回は、Tiny 11の通信を調べてMicrosoftとの通信を制限する方法を紹介します。ファイアウォールで遮断する方法ではなく、名前解決を制限するだけで十分な対策となります。この作業をWindows側ではなく、LAN環境のDNSサーバで行うことで、Tiny 11を再インストールした場合や複数のPCで使用する場合も簡単に対応できます。

Tiny 11をMicrosoftと通信させない名前解決変更 1
実際に、いつもの低スペックノートPCにTiny 11(b2版、no sysreq)をインストールしてみました。これはWindows 11 Proエディションで、22H2アップデート相当の状態です。スクリーンショット撮影時には日本語化と最新状態への更新を行っていますが、この更新がトラブルの原因になったため、この記事を作成することになりました。

Tiny 11をMicrosoftと通信させない名前解決変更 2
通信内容を調べるには、ルーターなどにtcpdumpやWiresharkを仕掛けるのが一般的ですが、名前解決だけを確認したい場合は、Windows用の「DNSQuerySniffer」が簡単で便利です(ただし、システム起動完了前の情報は取得できません)。このツールを使うには、別途パケットキャプチャ用のドライバが必要です。Wiresharkのインストール時に一緒に導入されるPcapドライバを利用すれば問題ありません。ネットワークインターフェイスのIPアドレスで待ち受け設定を行い、「0.0.0.0」を選択しないよう注意します。動作中に名前解決が発生すると、新しい行が追加されます。左端列には名前解決を試みたホスト名が表示され、右端列には対応するIPアドレスが表示されます。この例では、LANのDNSでMicrosoft関連の通信先IPを全て「0.0.0.0」に書き換えた結果を示しています。

Tiny 11 b2の通信相手(Microsoft)

  • slscr.update.microsoft.com
  • fe2cd.update.microsoft.com
  • fe2cr.update.microsoft.com
  • fe3cr.update.microsoft.com
  • fe3cr.delivery.mp.microsoft.com
  • kv801.prod.do.dsp.mp.microsoft.com
  • cp801.prod.do.dsp.mp.microsoft.com
  • settings-win.data.microsoft.com
  • settings-win.data.mp.microsoft.com
  • geo.prod.do.dsp.mp.microsoft.com
  • geover.prod.do.dsp.mp.microsoft.com
  • download.windowsupdate.com
  • ctldl.windowsupdate.com
  • go.microsoft.com
  • wdcp.microsoft.com
  • wdcpalt.microsoft.com
  • cxcs.microsoft.com
  • www.msftconnecttest.com
  • windows.msn.com
  • time.windows.com
  • dns.msftncsi.com
  • www.bing.com
  • login.live.com
  • dmd.metaservices.microsoft.com
  • displaycatalog.mp.microsoft.com
  • storecatalogrevocation.storequality.microsoft.com
  • tsfe.trafficshaping.dsp.mp.microsoft.com
  • fd.api.iris.microsoft.com
  • watson.events.data.microsoft.com
  • msedge.api.cdp.microsoft.com
  • edge.microsoft.com
  • edgeassetservice.azureedge.net
  • a-ring.msedge.net
  • k-ring.msedge.net
  • spo-ring.msedge.net
  • dual-s-ring.msedge.net
  • s-ring.msedge.net
  • fp-vs-nocache.azureedge.net
  • config.edge.skype.com
  • static-ecst.licdn.com
  • msedge.b.tlu.dl.delivery.mp.microsoft.com
  • msedge.f.dl.delivery.mp.microsoft.com
  • nav.smartscreen.microsoft.com
  • nav-edge.smartscreen.microsoft.com
  • smartscreen-prod.microsoft.com
  • 2.au.download.windowsupdate.com
  • 3.au.download.windowsupdate.com
  • 4.au.download.windowsupdate.com
  • 7.au.download.windowsupdate.com
  • 9.au.download.windowsupdate.com

漏れがあるかもしれませんが、1日程度通信を監視した範囲では、Microsoft関連の通信先は以下のホストでした。リスト以外にも、 footprintdns.com や azureedge.us のホストが複数(多数)確認されましたが、ここでは省略しています。
これらの中で、 footprintdns.com 、 azureedge.net 、 azureedge.us 、 msedge.net 、 microsoft.com 、 windowsupdate.com のサブドメインは、unboundを使用してまとめて処理することが可能です。
なお、Tiny 11は純正のWindowsとは異なり、テレメトリの送信量が少ないようです。

Unboundで名前解決の設定を行う

これらのホスト/ドメインのIPアドレスを0.0.0.0に書き換えるunbound用ルールは以下です。(IPアドレス書き換え部分だけです)
    local-zone: "footprintdns.com." redirect
    local-data: "footprintdns.com. A 0.0.0.0"
    local-zone: "azureedge.net." redirect
    local-data: "azureedge.net. A 0.0.0.0"
    local-zone: "azureedge.us." redirect
    local-data: "azureedge.us. A 0.0.0.0"
    local-zone: "msedge.net." redirect
    local-data: "msedge.net. A 0.0.0.0"
    local-zone: "microsoft.com." redirect
    local-data: "microsoft.com. A 0.0.0.0"
    local-zone: "windowsupdate.com." redirect
    local-data: "windowsupdate.com. A 0.0.0.0"

#   local-data: "www.msftconnecttest.com. IN A 0.0.0.0"
    local-data: "windows.msn.com. IN A 0.0.0.0"
    local-data: "time.windows.com. IN A 0.0.0.0"
    local-data: "dns.msftncsi.com. IN A 0.0.0.0"
    local-data: "www.bing.com. IN A 0.0.0.0"
    local-data: "login.live.com. IN A 0.0.0.0"
    local-data: "config.edge.skype.com. IN A 0.0.0.0"
    local-data: "static-ecst.licdn.com. IN A 0.0.0.0"
サブドメインを纏めると少なくすっきりしたルールになりました。www.msftconnecttest.comの行をコメントにしていますが理由は次。

Tiny 11をMicrosoftと通信させない名前解決変更 3
上記の通信先の中で、 www.msftconnecttest.com は、Windowsがインターネット接続を確認するために利用しているようです。このドメインのIPアドレスを 0.0.0.0 に設定すると、Windowsはインターネットとの疎通ができないと判断します。なお、上の設定例では www.msftconnecttest.com を通常通り名前解決できるようにし、行頭に#を付けてコメント化しています。このホストとの通信については挙動が不明なためです。

time.windows.com は、Windowsの時刻合わせに使用されるNTPサーバです。ただし、Windowsは他のNTPサーバでも時刻同期が可能なため、この time.windows.com を通信不可に設定しても問題ないと思われます。 詳細については以下の記事をご参照ください: Windows 10の時刻同期設定

関連記事:

ESP32-CAMで作る監視カメラ (RTSPストリーミング編)

ESP32-CAMで作る監視カメラ RTSPストリーミング編

ESP32-CAMを購入してダミーカメラに納めるという記事を公開した後、なぜかそれを使うところの記事をすっかり失念していました。
前回: ESP32-CAMで作るリビングカメラ (工作編)

ESP32-CAM DEVキットで作る監視カメラ 工作編 22 ダミーカメラにESP32-CAMを取り付けているところ。(写真は前回の工作編の使いまわし)
ESP32-CAM DEVキットで作る監視カメラ 工作編 25 完成したところ。(写真は前回の工作編の使いまわし)
AliExpressで販売されているESP32-CAMの1つ。このページに掲載されているESP32-CAMとは仕様が異なることがあります。

ESP32-CAMで作る監視カメラ RTSPストリーミング編 1
ESP32-CAMのプログラムのサンプルはArduino IDEにあるのですぐに使えます。
Arduino IDEのメニューバーから「ファイル」「スケッチ例」「ESP32」「Camera」「CameraWebServer」を辿ります。

ESP32CAMで作る監視カメラ RTSPストリーミング編 2
ボード(シングルボードコンピュータ)を選択します。
Arduino IDEのメニューバーから「ツール」「ボード(使用中のボードの名称)」「ESP32 Arduino」「AI Thinker ESP32-CAM」を辿ります。
上の画像では「ツール」の「シリアルポート」が灰色の無効状態になっていますが、ボードをPCにUSBケーブルで接続して通信できる状態になるとシリアルポートの設定ができるようになります。適切な通信速度を指定してください。

ESP32-CAMで作る監視カメラ RTSPストリーミング編 3
先に選択した「CameraWebServer」のソースの最初の方でボードの種類に応じてそのボード用の行を非コメント化します。
今回はESP32-CAMなので #define CAMERA_MODEL_AI_THINKER の行の行頭の「//」を削除します。
また、LANのWi-Fiに接続できるよう数行下の const char* ssid = "******" と const char* password = "******" の *****の部分にLANのWi-Fi APのSSIDとパスワードを入力します。
コンパイルして送信するとESP32-CAMが自動的に再起動して操作可能なウェブカメラサーバになります。LAN側でDHCPサーバが稼働していること。
Arduino IDEのメニューバーから「ツール」「シリアルモニタ」を辿りシリアルモニタを開きます。ESP32-CAMが起動してWi-Fiに接続するとシリアルモニタにIPアドレスが表示されます。ブラウザのURL欄にそのIPアドレスを入力してウェブカメラサーバを表示します。

ESP32-CAMで作る監視カメラ サンプルスケッチ画面
(前回の記事から画面を流用)
このサンプルスケッチは、高機能なのでいろいろ楽しめるものの監視カメラとして使うには不向きです。

Micro-RTSPを使ってRTSP対応監視カメラにする

RTSPストリームを実現するMicro-RTSP - https://github.com/geeksville/Micro-RTSPというライブラリがあります。
そのMicro-RTSPを使ったサンプルスケッチとしてESP32CAM_RTSP - https://github.com/Chihhao/ESP32CAM_RTSPが簡単で良さそうです。 GitHubからESP32CAM_RTSPのソースを取得し、ESP32CAM_RTSPディレクトリは丸ごとコピーしてArduino IDEのデータディレクトリの中に置きます。Arduino IDEのデータディレクトリはユーザーディレクトリの中のArduino (/home/ユーザー名/Arduino)など。環境によって違うかも。 Micro-RTSPはESP32CAM_RTSPに含まれているので別途入手する必要はありません。ESP32CAM_RTSPディレクトリのESP32CAM_RTSPディレクトリを丸ごとコピーしてArduino IDEのデータディレクトリの中のlibrariesディレクトリ下に置きます。

Arduino IDEを起動し、ESP32CAM_RTSPディレクトリの中の「ESP32CAM_RTSP.ino」を開きます。

ESP32CAM_RTSP.ino (編集)
  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
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//https://github.com/geeksville/Micro-RTSP

#include <WiFi.h>
#include <WebServer.h>
#include <WiFiClient.h>
#include "OV2640.h"
#include "SimStreamer.h"
#include "OV2640Streamer.h"
#include "CRtspSession.h"

char *ssid = "****************";          // Put your SSID here
char *password = "****************";  // Put your PASSWORD here

WebServer server(80);
WiFiServer rtspServer(554);
OV2640 cam;
CStreamer *streamer;

//mjpeg串流
void handle_jpg_stream(void){
  WiFiClient client = server.client();
  String response = "HTTP/1.1 200 OK\r\n";
  response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n";
  server.sendContent(response);

  while (1)  {
    cam.run();
    if (!client.connected())
      break;
    response = "--frame\r\n";
    response += "Content-Type: image/jpeg\r\n\r\n";
    server.sendContent(response);

    client.write((char *)cam.getfb(), cam.getSize());
    server.sendContent("\r\n");
    if (!client.connected())
      break;
  }
}

//靜態影像
void handle_jpg(void){
  WiFiClient client = server.client();
  cam.run();
  if (!client.connected())
  {
    return;
  }
  String response = "HTTP/1.1 200 OK\r\n";
  response += "Content-disposition: inline; filename=capture.jpg\r\n";
  response += "Content-type: image/jpeg\r\n\r\n";
  server.sendContent(response);
  client.write((char *)cam.getfb(), cam.getSize());
}

//錯誤處理
void handleNotFound() {
  String message = "Server is running!\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  server.send(200, "text/plain", message);
}

//WiFi連線
void WifiConnect() {
  if(WiFi.status() == WL_CONNECTED) return;

  int t=0;
  WiFi.begin(ssid, password);
  while(true){
    if(WiFi.status() == WL_CONNECTED) break;
    delay(1000);
    t++;
    if(t>=5){
      t=0;
      WiFi.begin(ssid, password);
    }
  }
}

void setup(){
  //設定影像大小:UXGA(1600x1200),SXGA(1280x1024),XGA(1024x768),SVGA(800x600),VGA(640x480),CIF(400x296),QVGA(320x240),HQVGA(240x176),QQVGA(160x120)
  esp32cam_aithinker_config.frame_size = FRAMESIZE_XGA;
  esp32cam_aithinker_config.jpeg_quality = 10;
  cam.init(esp32cam_aithinker_config);

  //カメラ追加設定
  sensor_t * s = esp_camera_sensor_get();
  s->set_hmirror(s, 1); //左右反転 0無効 1有効
  s->set_vflip(s, 1); //上下反転 0無効 1有効
  //s->set_colorbar(s, 1); //カラーバー 0無効 1有効


  //開始WiFi連線
  WifiConnect();

  server.on("/", HTTP_GET, handle_jpg_stream);
  server.on("/jpg", HTTP_GET, handle_jpg);
  server.onNotFound(handleNotFound);
  server.begin();
  rtspServer.begin();
  streamer = new OV2640Streamer(cam);//啟動服務
}

void loop() {

  WifiConnect();

  server.handleClient();
  uint32_t msecPerFrame = 100;
  static uint32_t lastimage = millis();
  // If we have an active client connection, just service that until gone
  streamer->handleRequests(0); // we don't use a timeout here,
  // instead we send only if we have new enough frames
  uint32_t now = millis();
  if (streamer->anySessions()) {
    if (now > lastimage + msecPerFrame || now < lastimage) { // handle clock rollover
      streamer->streamImage(now);
      lastimage = now;

      // check if we are overrunning our max frame rate
      now = millis();
      if (now > lastimage + msecPerFrame) {
        printf("warning exceeding max frame rate of %d ms\n", now - lastimage);
      }
    }
  }
  WiFiClient rtspClient = rtspServer.accept();
  if (rtspClient) {
    streamer->addSession(rtspClient);
  }
}

シリアル通信の部分は運用時には不要なので取り除いています。代わりに画面反転とカラーバー表示を追加しています。(92-96行目)
Wi-FiのSSIDとパスワードを記入するだけで使用できます。Wi-FiのSSIDとパスワードを入力します。(11-12行目) カメラの映像が上下逆な場合は上下反転+左右反転も必要です。(94-95行目)。この反転については次へ。

カメラの映像は2通りで表示可能です。

  • http://IPアドレス/
  • rtsp://IPアドレス:554/mjpeg/1

前者は普通にネットワーク動画対応アプリやブラウザで表示可能ですが、後者は観ることができないかもしれません。また、両ストリームは同時再生できません。

ESP32CAMで作る監視カメラ RTSPストリーミング編 4
映像の上下が逆の場合、「回転」できる場合は180°回転させるだけです。
「回転」がない場合、「上下反転」を行うと一見目的達成のように見えますが、左右が逆になってしまいます。更に左右反転も行うと正常な上下逆になります。
なお、カメラ側の映像が上下逆さまであってもプレーヤー側で回転させて観ることができる場合があります。監視カメラ用のNVRアプリケーションでも映像の回転させて録画する機能を有することが多いでしょう。

Agent DVRへのカメラ登録

NVRのAgent DVRにRTSP対応のESP32-CAMを登録してみた。

ESP32CAMで作る監視カメラ RTSPストリーミング編 5
Agent DVRの設定画面。
「新しいデバイス」をクリックします。

ESP32CAMで作る監視カメラ RTSPストリーミング編 6
右上隅のドロップダウンは、「全般的」を選択状態(新しいデバイスの初期値)。 「有効」をオン。ソースの種類は「IPカメラ」を選択し、右端の「 … 」をクリックする。

ESP32CAMで作る監視カメラ RTSPストリーミング編 7
右上隅のドロップダウンは、「ビデオソース」を選択状態(初期値)。
「ライブURL」に、「 rtsp://IPアドレス:554/mjpeg/1 」を入力する。この画面ではこの1項目だけ。右下の「OK」をクリックする。
1つ戻った画面になる。

ESP32CAMで作る監視カメラ RTSPストリーミング編 8
(カメラの映像で動態検知して自動録画開始する場合のみ)
右上隅のドロップダウンから「検出器」を選択する。
機能有効化のスイッチを「On(オン)」にする。
中央の大きな「領域」の直下にある「検出器」のドロップダウンメニューで「単純」を選択する。
右下の「OK」をクリックする。

RTSP対応カメラ設定の肝はこれだけです。

とても簡単にESP32-CAMをNVRに接続可能な普通の監視カメラにできました。
ただし、ESP32-CAMが性能不足なのか少しラグります。ラグの面でいえばRTSPストリーミングよりHTTPストリーミングの方がややマシなようです。

関連記事:
Up