海を飛んで君の許へ。

開発になりたかったQAが書き散らかす

Hyper-Vのスイッチの違い

概要

Hyper-V仮想マシンを作る時、仮想スイッチで3種類選べる点が、最も迷うところだと思う。
3種類の違いは色々なサイトで解説されているが、「どういう時に使うの?」や「プライベート同士ってどうやって繋げるの?」が全く分からなかったので、それを調べて試してみた。

環境

ホストOS:Windows10
ゲストOS1:CentOS7(外部ネットワーク&プライベートネットワーク)
ゲストOS2:CentOS7(プライベートネットワーク)
仮想ソフト:Hyper-V
ゲストOS1をリバースプロキシサーバとして、
ゲストOS2を外部から隔離されたAPサーバとして動作させたいので、こういう構成になっています。

仮想スイッチの接続の種類の違い

構造を詳しく解説できる自信がないのと、多くのサイトが既に優れた構造解説を行っているので、概要と使い分けを中心に記載する。

外部ネットワーク

概要:物理マシンのNICを奪って仮想マシンも使えるようにする
Hyper-Vの仮想スイッチの設定画面を実際に見てもらえれば分かるが、「管理オペレーティングシステムにこのネットワークアダプターを許可する」という一文がある。(バージョンが違うと文言が少し異なるかもしれない)
これは「こっち(仮想ソフト)で勝手に作った仮想スイッチで物理NIC使わせてもらうね。あ、物理マシンさんもこれ使いたい?」と聞かれているのに等しい。
許可すれば物理マシンもそのNICを使ってネットに出て行くことができる。ただし接続イメージは今までと違う。
許可しなければ仮想スイッチに物理NICを奪われ、物理マシンは自分に刺さっているそのNICを使うことすらできなくなる。
(仮想ソフトを使う時、NICは複数用意せよ、とよく言われているのはこういう理由だと思う。うっかり物理マシンが自由を奪われてしまう可能性があるのだ)
どういう時にこの設定を使うか:仮想マシンでもインターネットを使いたい時
例えば仮想マシンlinuxも普段使いしたいな~という時にはこれを選ぶ。

内部ネットワーク

概要:物理マシンと関係なく仮想スイッチを作る
「ネットに出て行くために仮想スイッチを作る」のではなく「物理マシンと通信するために仮想スイッチを作る」イメージ。
ネットに繋ぐことはできないが、ホストOSと通信できるし、同じ仮想ソフトに入った別の仮想マシンとも通信できる。
なお、VMWareのような他の仮想ソフトに「内部ネットワーク」に相当する設定はないらしい。だから余計に混乱のもと。
どういう時にこの設定を使うか:ちょっとセキュアな状態にしたい時
ネットに繋がったら困るような仮想マシンはとりあえずこれにする。

プライベートネットワーク

概要:物理マシンとは関係ないところでよろしくやる
仮想マシン同士を繋ぐためだけに仮想スイッチを作る。同じ仮想ソフトに入っている仮想マシン同士だけが通信できる。なんとホストOSですら接続できない。
つまりTera Term等のターミナルソフトからも繋げないので、Hyper-Vから直接コンソールを開くしかない。
どういう時にこの設定を使うか:超セキュアな状態にしたい時
先の「環境」の項でも挙げたように、「リバースプロキシ」と「外部から接続できないサーバ(ある特定のサーバからだけ接続を許可するサーバ)」を作ってテストしたい時に使える。

既定のスイッチ

Hyper-Vを初めて使い始めた時からある「既定のスイッチ」。いかにも「デフォルトです!」みたいな名前だけれども。
ネットワークの種類は内部ネットワークだから、ネットには出て行けない。
これを選択すると、なぜか見知らぬIPアドレスが振られる。実は既定のスイッチにはDHCP機能がある。(普通の内部ネットワークのスイッチには無い)
なのでこれを選んだ瞬間から、何も考えずに、ホストOSからゲストOSにssh接続ができたりする。
「ゲストOSはネット見ないからいいや~」という場合は、既定のスイッチを選べばいいと思う。

プライベートネットワーク同士でどう繋ぐのか

※これを疑問に思うのは自分だけかもしれないので、「何でこんなことを疑問に思うんだろう」と思われたら読み飛ばしてほしい…
先のプライベートネットワークの項で、「同じ仮想ソフトに入っている仮想マシン同士だけが通信できる」と書いた。では実際にどうやって繋ぐのだろうか?
同じ仮想ソフトの仮想マシンDHCPサーバがなければIPアドレスですら自動では振られない(これは、常に自動で振られる環境にしかいたことのない弊害なんだろうか…?)。
簡単な正解は「自分でプライベートIPアドレスを振ってしまう」だ。やり方は以下。
1. Network Managerを開く

nmtui

とコンソールに入力すると、Network ManagerのTUI(テキスト・ユーザ・インターフェース)が立ち上がる。
2. Edit connection(接続の編集) を選んでEnterキー押下
3. 編集したい接続を選んでEnterキー押下 例:eth0
4. IPv4 configuration で Manual を選ぶ
5. Show(表示する) を選び、 Addresses(アドレス) 欄に任意のプライベートIPアドレスを入力 例:192.168.11.3
※初心者は大抵ここで迷うと思うけど、同じ仮想ソフト内で被らなければ何でもいい。困ったら例と同じにしていい
6. (IPv6を使わないなら) IPv6 configuration で Ignore(無視する) を選ぶ
7. そのままOKやQuit(終了する)を選んでnmtuiの画面から抜ける
8. ネットワークを再起動する

systemctl restart network

9. IPを確認する。nmtuiで設定したIPアドレスが表示されればok

ip a

10. 同じ仮想ソフトの仮想マシンからpingを打ってやり、疎通確認できたら完了!
あとは他と変わらずそのIPアドレスを使ってやればいい。

時折、9のネットワークの再起動でエラーが出ることがある。その場合は以下を試す。

systemctl stop NetworkManager
systemctl start NetworkManager
systemctl start Network

あとがき

本当にスイッチの違いが分からなくて「IP振られてない!」「どうやって通信するの!?」と1人で悩みまくっていたので、もう二度と忘れたくない…。