作成されるすべての KVM VM にパブリック IPv4 を自動的に割り当てますか?

作成されるすべての KVM VM にパブリック IPv4 を自動的に割り当てますか?

作成される各 VM にパブリック IPv4 を割り当てるにはどうすればよいかと考えています。

セットアップ: CentOS8 上で libvirt と kvm を使用して 3 つの IP を持つホスト サーバーを作成し、eth0 をインターフェイスとして使用してブリッジ br0 を仮想化します。

多くの試行錯誤の末、ブリッジを使用して、ゲスト OS ネットワーク ファイルのインターフェイスに IP アドレスを割り当てることで、手動で実行できました。

ただし、OS を再インストールすると、IP アドレスがなくなり、毎回ゲストに接続してネットワーク ファイルの ipv4 アドレスを手動で編集する必要があることを考えると、これが自動であればよいのですが。どうすればこれを回避できますか?

目標: 各 IPv4 は仮想マシンにハードロックされ、OS が再インストールされてもそのまま残ります。

オプションの目標: ホスト OS の IPv4 が未使用の場合は、次に作成される VM に割り当てる必要があります。

これを毎回実行するために独自のソフトウェアをコーディングする必要がありますか、それとももっと簡単な方法がありますか?

答え1

これが DHCP の目的です。

MAC アドレスは自由に選択できますよね? VM と同じ (おそらく仮想) イーサネット セグメント内のシステム上に DHCP サーバーを設定し、IP を特定の MAC にバインドします。

また、いくつかのルートを配布する必要もあります (DHCP オプション 121 および 249 を使用)。DHCP サーバーを備えたマシン自体は、パブリック IP またはすべてのクライアントと同じネットワーク内の IP を持つ必要はありません。DHCP サーバーとの通信は、クライアントにまだアドレスが設定されていないときに行われます。

ISC DHCP を使用する場合は、次のような操作を行う必要があります。ホスト マシンは VM 用のルーターと NAT ボックスであり、DHCP サーバーもホストするものと想定しています。他の方法を使用する場合は、若干の調整が必要になります。

  • オプション 121 と 249 を次の上部あたりに定義しますdhcpd.conf
option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;

おそらく、新しいバージョンではこれは必要ありませんが、私のバージョンでは必要です。

  • ブロックを作成しshared-network、動的プライベートサブネットとパブリックアドレスをマスク 32 の「サブネット」として配置します。
option routers 192.168.210.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;

shared-network libvirt-vm-net {
    subnet 192.168.210.0 netmask 255.255.255.0 {
        range 192.168.210.2 192.168.210.254;
    }

    subnet 192.0.2.1 netmask 255.255.255.255 {
        option rfc3442-classless-static-routes 32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;        
        option ms-classless-static-routes      32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;        
    }

    ...
}

NAT の背後にあるマシンの「プライベート」ネットワークは 192.168.210.0/24 で、ホストはそのネットワーク内の .1 (ブリッジに割り当てられている) であると想定しています。静的クラスレス ルート (オプション 121 および 249) 設定により、次のルートが追加されます。

ip route add 192.168.210.1 dev eth0
ip route add default via 192.168.210.1

192.0.2.1/32 と 192.168.210.1 を含むサブネットが存在しないにもかかわらず、すべてが機能するために必要なものです。このルーティングがどのように機能するか不明な場合は、ラボ環境でこのような設定を試してみることをお勧めします。

  • 必要な MAC アドレスを静的 IP アドレスにバインドしたホスト定義を作成します。
host public-server-1 { hardware ethernet 00:11:22:33:44:55; fixed-address 192.0.2.1; }
...
  • これらの MAC の静的ネイバー (「ARP」) エントリを/etc/ethers(ホスト上で) に追加します。
00:11:22:33:44:55 192.0.2.1
...
  • 対応するブリッジ インターフェイスを介してこれらのアドレスへの静的ルートを追加します。OS ディストリビューションの標準ネットワーク構成を使用してこれを行う方法はわかりませんが、一般的な Linux の方法は次のとおりです。
ip route add 192.0.2.1 dev br0
...

次に、libvirt 構成内でそれらの MAC を重要な VM に割り当てます。MAC がバインドされていない他の VM は、通常どおり構成された範囲からアドレスを取得します。

実際に、私はこのセットアップをさらに「複雑な」セットアップ (DHCP、ホスト、ルーターはすべて別個のシステム) で実装してテストしました。また、libvirt は使用せず、ホストは PVE です。PXE ブートも、「通常の」サブネットワーク マシン (例の 192.168.210.0 など) と「パブリック IP」マシン (192.0.2.1 など) の両方で完全に機能します。

すべての VM がインターネットにアクセスできるようにするには、プライベート IP に NAT を使用し、パブリックには使用しないようにする必要があります。これは問題ではなく、 のようなルールを使用しますiptables -t nat -A POSTROUTING -o <physical-interface-with-public-ip> -s <private-ip-range> -j MASQUERADE。この方法では、プライベート範囲はホスト自体のパブリック アドレスに変換されますが、パブリック アドレスは変換されず、そのままルーティングされます。繰り返しますが、パブリック アドレスとプライベート アドレスを同じネットワーク セグメント上に持ち、同じ仮想 NIC を通過することは問題ありません。

関連情報