2018/12/07

Tips: Windows Server 2019 の nat スイッチの内部サブネット範囲が起動ごとに変わる件

Docker EE for Windows Server で Windows コンテナー環境を準備すると、既定で作成されるコンテナー ネットワーク用(NATPT用)の既定のスイッチ「nat」ですが、Windows Server 2016 と Windows Server 2019 で少し状況が違っていたので報告。

Windows Server 2016 の場合は、プライベート IP アドレスの範囲からサブネット「172.x.x.0/20(/255.255.240)」が永続的に割り当てられるのですが(ホストに割り当てられるデフォルト ゲートウェイは 172.x.x.1/20)、Windows Server 2019 の場合はホストを起動するたびに、別のサブネット範囲(あるときは172.18.0.0/20、またあるときは172.20.80.0/20 など)になってしまうようです。

これが仕様なのか、意図的な変更点なのか分かりませんが...(注:もし意図的なら永続化しないほうがいいかもしれないことがあるかも、ないかも)

というわけで、起動ごとに変わるのは気持ち悪いので、サブネット範囲を永続化してみた。


docker network inspect nat を実行してみると、Windows Server 2019 の Config が空っぽのよう。Windows Server 2016 の設定がどこからきたものかわかりません(作成時に指定されたんだと思うけど)。

Windows Server 2016 の場合...

"Config": [
    {
        "Subnet": "172.27.80.0/20"
        "Gateway": "172.27.80.1"

    }
]

Windows Server 2019 の場合...
"Config": [
    {
        "Subnet": "0.0.0.0/0"
    }
]




C:\ProgramData\docker\config\daemon.json に fixed-cidr でサブネットを指定すれば、特定のサブネットを永続的に割り当てることができます。daemon.json が存在しなければ作成すればよし(Windows Server 2019 の既定はなし)。既存のものがあれば、fixed-cidr の行を追加すればよし。daemon.json の編集後、ホストを再起動すれば OK。例えば、「172.20.1.0/24」にするには...

{
    "fixed-cidr": "172.20.1.0/24"
}



再起動後、コンテナーを作成して確認。画面奥がホストの vEthernet (nat) に自動構成された 172.20.1.1 (コンテナー用 NAT ネットワークのデフォルトゲートウェイ)。画面手前が Windows コンテナーに自動的に割り当てられた 172.20.1.236(Docker エンジンが自動割り当て)。

ローカル サブネットと競合を避けるためにも(自動的に競合を回避してくれるのか否かはわかりましぇん)知っとくといいかも。

また、この nat スイッチに Hyper-V 仮想マシンを接続して、適切な IP アドレスを静的に割り当てれば(172.20.1.101 とか、サブネットマスクは 255.255.255.0、デフォルト ゲートウェイは172.20.1.1、DNSサーバーはホストが参照しているのと同じもの)、仮想マシンのための NAT スイッチとしても機能します※1。

実は、Azure Marketplace の Windows Server 2019 Datacenter with Containers イメージからデプロイした仮想マシンで、Hyper-V を有効化し、コンテナー用の nat スイッチを仮想マシンにも流用しようとしたところ、毎回、IP アドレス範囲が変わっていることに気付き、困ったもので。(Windows Server 2016 と違って、2019 だと Hyepr-V 用に 2 つ目の NAT スイッチを作れば済むんですけど※2 ※3)

※1 Windows Server 2019 のコンテナー ホストの nat スイッチは、Get-NetNat で参照できない。Windows Server 2016 とはこの辺も違うらしい。

※2 Windows Server 2016 および Windows 10 ver 1607 は単一の NAT ネットワークのみをサポート。複数の NAT ネットワークのサポートは Windows 10 ver 1703 から。

What’s new in Hyper-V for the Windows 10 Creators Update?
https://blogs.technet.microsoft.com/virtualization/2017/04/13/whats-new-in-hyper-v-for-the-windows-10-creators-update/

※3 Azure 仮想マシンで Nested Virtualization して、Azure 仮想マシンの中の Hyper-V 仮想マシンに外部ネットワークへのアクセスを可能にするには、NAT スイッチを使うしかないです(と思います)。その通常の方法については...

Azure VM で入れ子になった仮想化を有効にする方法
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/nested-virtualization

私のようにコンテナー用の「nat」を流用したい場合は、コンテナーに割り当てられた IP アドレスを避けながら、適切な IP アドレスを手動で設定して...(デフォルト ゲートウェイは vEthernet (nat) の IP アドレス、DNS サーバーは Azure 仮想マシンが参照している、Azure が提供する 168.63.129.16 または仮想ネットワーク上に展開した DNS サーバー)

以上

2 件のコメント:

匿名 さんのコメント...

Windows 10 1809?のHyper-Vでもホストを再起動などするたびにDefault Switchのサブネット範囲が変わってゲスト起動のたびに「ネットワーク」「ネットワーク2」とどんどん増えていくのですが、同様に固定する方法ってあるのでしょうか・・・

山市 良 さんのコメント...

Default Switch は 1709 からの Windows 10 Hyper-V の機能であり、Docker 用の nat とは別物です。どこでどうやって管理しているのか私は知りません(削除も設定変更もできないと思います)。ただ、1809 ではランダムに変わってしまうということで多くの人が混乱しているようです(バグなのか仕様なのかわかりませんが)。→ https://techcommunity.microsoft.com/t5/Windows-Insider-Program/Hyper-V-Default-switch-IP-address-range-change-Ver-1809-Build/td-p/261431

現状は、Default Switch の DNS/DHCP 機能はあきらめて、別の NAT スイッチを作成して(内部ネットワークタイプのスイッチを作成し、New-NetNat で NAT ネットワークを作成)、vEhternet (NATスイッチ)のIPとゲストの IP を手動で構成するしかないのではないでしょうか。