【世界最速】Windows Server 2025でSMB over QUICを実装してみた(非ドメイン環境)

[今年最初に書いた記事](https://qiita.com/hidekko/items/a701c55824634d2aac54)でも言及している
[外部からファイルサーバーへのアクセスがVPN経由ではなく証明書認証を用いたQUIC経由でできるようになる](https://qiita.com/hidekko/items/a701c55824634d2aac54#windows-serverr-2025%E3%81%8Cwindows-11%E3%83%99%E3%83%BC%E3%82%B9%E3%81%8B%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E8%AA%BF%E3%81%B9%E3%81%A6%E3%81%BF%E3%81%9F2024%E5%B9%B41%E6%9C%8829%E6%97%A5%E8%BF%BD%E8%A8%98)という部分の記事です。
**機能名はSMB over QUICといい、<font color="Red">VPN無しで社内のファイルサーバにアクセスできる機能です。</font>**

機能名の通りファイルサーバの根幹機能であるファイル共有、この**ファイル共有のプロトコルSMBを<font color="Red">QUIC経由で使う</font>**、というものになります。
元々**Azure上でしかデプロイできないWindows Server OSエディション<font color="Red">Windows Server 2022 Azure Editionでしか使えなかった機能**</font>が、<font color="Red">**次期WindowsサーバOSであるWindows Server 2025ではオンプレミスでも使えるようになったと**</font>いうことです。
通常SMBはTCPの445番ポートを使って通信しますが、over QUICなのでQUIC通信プロトコルとして使います。
QUICはhttps通信でUDPの443番ポートを利用して通信します。
記事執筆時点(2024年6月27日3時46分)ではWindows Server 2022 Azure Editionでの記事はありますが、Windows Server 2025ではまだ誰もやってないみたいなのでやってみます。

:::note info
記事執筆時点(2024年6月27日)ではWindows Server 2025はプレビューです。
正式リリース時は仕様変更の可能性があります。
:::

:::note info
記事執筆時点(2024年6月27日)ではWindows Server 2025でSMB over QUICの設定はPower Shellでしか実装されていません。
Windows Server 2022 Azure EditionはWAC(Windows Admin Center)での設定が可能なので、Windows Server 2025正式リリース時はWACでの設定が可能になるかもしれません。
:::


本記事の全体の構成としては以下の通りです。
1. Windows Server 2025側の準備
1. Windows 11側の準備
1. DNSの準備
1. ルーターの設定変更
1. 接続確認

では進めていきましょう。

# Windows Server 2025におけるSMB over QUIC
ドメイン環境での構成と非ドメイン環境での構成と2種類できるのですが、今回は非ドメイン環境、NTLM認証で実装してみます。

# Windows Server 2025側の準備
## Windows Server 2025を立ててみる
これはもう[今年最初に書いた記事](https://qiita.com/hidekko/items/a701c55824634d2aac54)で構築済みなのでスキップします。
念のため作業対象のWindows Server 2025の基本情報くらいは貼っておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/7d18483f-7c27-b40b-99b1-54e0bc034804.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/1d61459b-5487-45ef-d4dd-60c11a4a5897.png)

エビデンスの画像情報をまとめると
|項目|設定値|
|---|---|
|OS|Windows Server 2025|
|ホスト名|win2k25-02|
|IP Address|172.16.0.68|
|ドメイン参加|していない(非ドメイン環境)|

という感じですね。


## Windows Server 2025にファイルサーバ機能を実装する
KVM上のWindows Server 2025にディスクを追加してそこにファイルサーバ領域を展開します。
ディスク構成は以下のようになっていて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/25827171-0093-bdc4-1189-47666d27573b.png)
赤枠で囲んだ部分がファイルサーバの領域です。
テストなので容量はさほど必要でないので10GiBにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/deb25e62-e26c-91e0-ff29-1ded9fbb47b1.png)
その上のディスクがOS領域ですね。
別にOSディスクにファイルサーバ領域を展開しても良かったんですが、**<font color="Red">VPN無しでファイルサーバ領域をインターネット公開する恐怖に抗えず、リスクヘッジとしてOS領域と別にファイルサーバ領域を構築しました。</font>**
QUICなのでhttps、認証は証明書認証＋NTLM認証(非ドメイン環境なのでKerberosではなくNTLM)なので安全なのですが、構築前はちゃんと動くかどうかわかんないのでこんな構成にしました。
KVM上でディスク作成してマウントしたらOSで認識させましょう。
ディスクマネージャーから色々操作してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/90b21e24-9626-6852-d3f9-91484ccd5eab.png)
こんな感じですね。

## 証明書作成
自己証明書でやっちゃいます。
Power Shellでちゃちゃっと作りましょう。
Power Shellは管理者権限で実行しましょう。
Windows Server 2025と別環境で作成しても良いのですが、証明書の移動の手間が面倒なので私はSMB over QUICを実装するWindows Server 2025内で作成しました。
(有効期限は無駄に100年です。こんなに長い有効期限は非推奨ですよ！)
```サンプルコード.ps1
$serverCert = New-SelfSignedCertificate -DnsName [DNS名] -CertStoreLocation "Cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(100) -KeyAlgorithm "RSA" -KeyLength "2048"
```
[DNS名]の部分はご自身の環境に合わせて実装してください。
私の環境で実際に実行したコマンドは以下の通りです。
```cert_create01.ps1
$serverCert = New-SelfSignedCertificate -DnsName win2k25-02.sh-style.info -CertStoreLocation "Cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(100) -KeyAlgorithm "RSA" -KeyLength "2048"
```
またしても検証環境とはいえ実際に使えるドメインをインターネット上に晒してしまいましたね。
コマンド実行結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/5bd1cad8-1ed1-12b9-2c86-4fd0d37bbbe1.png)
エラーなくコマンドが終了していればOKですね。
## 作成された証明書の確認
作成された自己証明書はコンピューター証明書内の個人の領域に配置されます。
```Windowsキー + R```で[ファイル名を指定して実行]を開き、```certlm.msc```と入力してエンターキーを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/3ea7db9b-ce2d-32bd-3f16-61c396d99a19.png)
certlmの画面が以下のように開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/d455d615-7f99-dc11-9c53-7b59b75bb446.png)
このように表示されればOKです。
証明書作成のために開いたPower Shellの画面は閉じずにそのまま置いておきましょう。

## 証明書をSMB認証に関連付ける
この関連付けの作業をマッピングと言います。
これもPower Shellで実行します。
変数の関係でさっき証明書を作成したPower Shell画面にそのまま貼り付けてください。
```smb_mapping.ps1
New-SmbServerCertificateMapping -Name win2k25-02.sh-style.info -Thumbprint $serverCert.Thumbprint -Store My
```
Power Shell画面を閉じてしまった場合は```certlm.msc```の画面から作成した証明書のThumbprint情報をコピーしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/cb03c70c-a88b-96e7-0df8-8406d77f558d.png)
このように表示されればOKです。
ここまでくればPower Shell画面を閉じてOKです。

## 証明書をエクスポートする
Windows Server 2025側の最後の作業です。
```Windowsキー + R```で[ファイル名を指定して実行]を開き、```certlm.msc```と入力してエンターキーを押してください。
開いてきたcertlmの画面内左ペインから[個人]→[証明書]内にある先ほど作成した証明書を選択し、[右クリック]→[すべてのタスク]→[エクスポート]をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/28f8774b-6ce8-bd27-1ea1-9f49471d2bd8.png)
[証明書のエクスポート ウィザード]が開きますので[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/4d32edf0-60dd-82a3-be77-aec566a9cf70.png)
秘密鍵はエクスポートしなくて良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/39a5bd3f-b4f8-d6fc-48af-a9290ea725bf.png)
(なんか急に手順書みたいになってきたな・・・)
[Base 64 encode X.509(.CER)]を選択し、[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/5e1c7505-774f-8b4d-0cae-752e3cc4b6db.png)
任意の場所を指定し証明書ファイルに任意の名前を付けて[次へ]をクリックします。
(冗談で任意の名前.cerにしてますが、日本語名は個人的には非推奨です。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/64a0991b-4d84-f2da-d11b-bf63e60ee01b.png)
これまで設定した出力する証明書のパラメーターを確認し、[完了]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/93381e42-9d9b-0adc-25b0-9f58ef6ceec7.png)
以下のように証明書が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/d7d524cc-7df5-bbc8-3155-c018865f886d.png)
出力された証明書(今回の例だと[任意の名前.cer])をSMBクライアントに相当するWindows 11の任意の場所にコピーしましょう。

Windows Server 2025側の準備はこれで完了です。
続いてWindows Clinet OS側の作業です。
今回はWindows 11 Proで行います。

# Windows Cient OS(Windows 11 Pro)側の準備
準備といってもWindows Server 2025で出力した証明書を指定の場所にインポートするだけです。
もう一点の準備を敢えて言うならWindows Server 2025と違うネットワークに配置することくらいですね。

## 証明書をインポートする
はい。
もうこれは何回もやってる手順ですね。
Windows 11の荷にの場所に配置した証明書ファイルをダブルクリックしましょう。
証明書の画面が開きますので、[証明書のインストール]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0415219c-61e1-2e79-7be3-6b6f6588ead2.png)
[保存場所]を[ローカルコンピューター]を選択し、[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/1270f0d5-47e0-1dac-73f0-f7ba654ddcc1.png)
UACを聞いてくるので[はい]を選択してください。
次に証明書ファイルのデフォルトの配置位置から任意の場所に配置位置を指定します。
[証明書をすべて次のストアに配置する]を選択し、[参照]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0d450d4f-196e-56ee-7542-f131ff3d9ab6.png)
[信頼されたルート証明機関]を選択して[OK]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/94c9ecb6-6c52-c5c5-8be4-574ba2d10d12.png)
[証明書のインポートウィザード]の画面で以下のように証明書配置位置が[信頼されたルート証明機関]に指定できるので、確認の上[次へ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/dc7ea145-d2f1-a9bc-3f5d-ff9936aa7a52.png)
これまでの手順で指定した証明書配置位置、[信頼されたルート証明機関]が[ユーザーが選択した証明書ストア]内に正しく反映されていることを確認して[完了]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/969bbc25-552c-f042-5b7c-d6ae4318efcf.png)
証明書が正しくインポートされたと確認できるダイアログボックスが出てきますので[OK]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/0807f28d-e8a4-df59-4f18-94cefab35360.png)

## インポートされた証明書が指定位置に配置されているか確認する
Windows 11 Proで```Windowsキー + R```を押して[ファイル名を指定して実行]を開き、```certlm.msc```と入力してエンターキーを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/bab87847-c1fa-8570-7733-ffc773852074.png)
[信頼されたルート証明機関]→[証明書]をクリックし、先ほどインポートした証明書が存在するか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/000a8179-3cbc-cccf-b126-511abab656e4.png)
存在していればOKです。

Windows 11側の準備は以上です。

# DNSの準備
今回利用するDNSはNamed ServerをAzure DNSに向けていますので、Azure DNSで設定します。
Azure Portalにログインし、左ペインに(出していれば)[DNS ゾーン]のアイコンをクリックし設定したいDNSゾーンをクリックし、[追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/24cc9cf8-fedf-5320-a953-e1147e3b9719.png)
[名前]の項目には[前の設定項目](https://qiita.com/hidekko/items/385301500337dbbca498#%E8%A8%BC%E6%98%8E%E6%9B%B8%E4%BD%9C%E6%88%90)のコマンドで指定した[-DnsName]です。
```サンプルコード.ps1
$serverCert = New-SelfSignedCertificate -DnsName [DNS名] -CertStoreLocation "Cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(100) -KeyAlgorithm "RSA" -KeyLength "2048"
```
の[DNS名]ですね。
私の環境では以下のコマンドになるので、
```cert_create01.ps1
$serverCert = New-SelfSignedCertificate -DnsName win2k25-02.sh-style.info -CertStoreLocation "Cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(100) -KeyAlgorithm "RSA" -KeyLength "2048"
```
```win2k25-02.sh-style.info```がインターネットで名前解決可能(≒アクセス可能)なFQDNになります。
大事な部分なのでもうちょっと言及するとSMB over QUICが動作するWindows Server 2025のインターネットからアクセス可能なFQDNになるのですが、このFQDNの命名は通常[ホスト名].[ドメイン]となると思います。
今回であれば[ホスト名]が前述の通りwin2k25-02、ドメインがsh-style.infoなのですが、Azure DNS上の設定値はホスト名部分のみになります。(ドメイン部分は当たり前ですが補完されてますね。)
[種類]はDNSレコードの種類です。
今回のSMB over QUIC環境はYAMAHA RTXシリーズの配下にありますのでネットボランチサービスを利用しています。
このネットボランチサービスで使っているFQDNにCNAMEで名前解決を行う、という設定です。
[エイリアス]はネットボランチで使っているFQDNです。
この辺りは読者の皆様の環境に合わせてチューニングを行って下さい。
設定を確認して[追加]をクリックします。
[TTL]の単位も検証なので短くしています。
勘の良い読者の皆様は既にお気づきかと思いますが。ネットボランチサービスを利用しているということからRTXのグローバルIPアドレスがDynamicですので、仮にDynamicのグローバルIPアドレス環境下でCNAMEを利用するのであればTTLは1分でも良いかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/efdd3a07-3c0e-0244-80b8-0335c8595714.png)

## FQDNの確認
nslookupコマンドで確認しましょうかね。
```サンプルコード.bat
nslookup [DNS名]
```
私の環境では
```smb_over_quic_ns_lookup.bat
nslookup win2k25-02.sh-style.info
```
ですね。
結果は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/808c9119-86e1-85b3-a4eb-eece2c6c48df.png)
はい。
ちゃんと結果が返ってきてますね。

DNSの設定は以上です。
続いてルーターの設定です。

# ルーターの設定
今回QUICでの通信を許可しますので、UDPの443番ポートへの通信をWindows Server 2025にポートフォワーディングします。
ルーターは前述の通りYAMAHAのRTXシリーズですので、以下のコマンドで一発です。
```rtx_smb_over_quic.config
administrator
ip filter 1047 pass * * udp * 443
pp select 1
 ip pp secure filter in 1020 1030 1040 1041 1042 1043 1044 1045 1047 2000
no pp select 1
nat descriptor masquerade static 1 10 172.16.0.68 udp 443
save
exit
exit
```
はい。
```ip filter```の後にあるフィルタ番号や、```ip pp secure filter in```に設定している各種フィルタ番号などは読者の皆様の環境に合わせてチューニングしてください。
```ip filter```はすべてのIPアドレスからUDPの443番ポートへの通信を許可しており、```ip pp secure filter in```でこの許可フィルタをPPPoEでのインバウンド通信として許可しています。
```nat descriptor masquerade static 1 10 172.16.0.68 udp 443```こちらはRTXのPPPoEインターフェースにUDPの443番ポート宛の通信が来た場合、Windows Server 2025に転送するつまりポートフォワーディングする設定です。
このコマンドの```static```の後にある```1```や```10```なども読者の皆様の環境依存です。

# 接続確認
はい。
最後の作業ですね。
接続確認してみます。

## まずはエクスプローラーで接続確認
Windows 11 Proで```Windowsキー + R```を押して[ファイル名を指定して実行]を開き、```\\win2k25-02.sh-style.info\shared_folder01```と入力してエンターキーを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/9811a67f-f180-7011-29cc-4e6a77f7327d.png)
この接続方式だと最初にTCPの445番ポートで接続し、接続できなかったらQUICの通信、UDPの443番ポートに切り替わります。
この挙動のせいで接続まで少し時間がかかります。
しばらくするとNTML認証を聞いてきます。
ここではWindows Server 2025のユーザーIDとパスワードを入力します。(デフォルト設定なのはご愛敬！)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/e4a0b0b3-3298-e39c-67e2-47c28e3b48a2.png)
認証が完了すると以下のようにファイルサーバーの領域が通常のエクスプローラーで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/95169683-0601-bbca-ce44-f6c353735772.png)
できることは頭ではわかっていても、実際に目の当たりにするとやっぱりすごいですね。

## 次にパケットキャプチャでホンマにQUICで通信してるか確認
はい。
ホンマにQUICで通信してるか確認しましょう。
私がこの記事のためにエビデンスを偽装していないかどうかも併せて確認できますしね。
コマンドプロンプトを管理者権限で実行し、以下のコマンドを実行します。
```パケットキャプチャ_開始.bat
netsh trace start capture=yes
```
実行すると以下の画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/3dd4e90a-9e0e-05bc-51d0-0d9f2c899fb7.png)
パケットを保存してる場所やキャプチャファイルの最大値を出力してくれますね。
パケットキャプチャを開始してSMB over QUICのファイルサーバにファイルを書き込みましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/16133dda-32ff-28af-41f9-4ddc6080a420.png)
書き込みが終わったらパケットキャプチャを停止します。
```パケットキャプチャ_停止.bat
netsh trace stop
```
パケットキャプチャのファイル作成にしばらく時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/711ded4d-b644-c797-ed6d-add8405708a1.png)
正常に処理が終了すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/4365183c-9a97-b1c5-2117-fa247c6d3fb3.png)
以下はパケットキャプチャの中身です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643392/9b550be4-700f-1f39-5856-3a0e18746d85.png)
ちゃんとUDPの443番ポートで通信していますね。
Azure DNSに登録したFQDNからネットボランチのDNS名が解決された後、更にRTXのグローバルIPアドレスまで変換されているところも確認できます。

<font color="Red">**はい！
これでWindows Server 2025のSMB over QUICの検証は完了です！**</font>

# SMB over QUICの使いどころ
やはりファイルサーバアクセスにわざわざVPNを張らなくて良いところでしょうか。
BOXやSPOみたいなSaaSのクラウド型ストレージサービスもありますが、データ移行が大変ですし、従来のファイルサーバをお使いのお客様がWindows Server 2025にアップグレードする際は是非本機能の実装を検討してみてはいかがでしょうか？

5時間もかかっちゃいましたね。

本日はこれまで。