KVMで複数の隔離されたNATネットワークを設定しようとしても機能しません。説明できない動作が発生したため、明確な説明が必要です。
IP範囲192.168.122.0/24、192.168.123.0/24、および192.168.124.0/24の3つのNATネットワークを設定して順番に起動すると、122の仮想マシンは122の仮想マシンをpingできません。 123または124マシン(私が望む動作)の場合、123のVMは122をpingできますが、124はpingできませんが、124のVMは122と123をpingできます。
開始順序はiptablesの規則順序を暗示するので、重要なようです。これが動作の理由だと思います。
私はこれを読んだ文書:
このステップでは、この仮想ネットワーク内で使用するIPアドレス範囲を選択します。この仮想ネットワークを使用するすべてのゲストに表示されますが、NAT のため仮想ネットワークの外側には表示されません。
そしてこれで地図時間:
ホストオペレーティングシステムとパブリックネットワークはNATネットワークのゲストへの接続を開始できませんが、他のNATのKVMゲストはそれにアクセスできます。
見た目に矛盾する情報です。
私は実際の動作を理解し、私が望むことを達成する方法があるかどうかを知りたいです。
編集:全体の設定にはGNS3レイヤーが含まれているため、少し複雑です。
私が試したこと:
virt-manager
さまざまなIP範囲にさまざまな仮想NATネットワークを作成します。たとえば、virsh net-dumpxml
両方のネットワークの結果は次のようになります。
# Note : This one is the default one
<network>
<name>default</name>
<uuid>5506b439-c3f6-4d8a-b901-66736c18c976</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:9c:bf:07'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
# Note : This one is one I created through virt-manager
<network>
<name>nat-network1</name>
<uuid>dca96cc1-b4bd-44ac-b1b9-9f581219fa94</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:2e:7d:d5'/>
<domain name='defaul1'/>
<ip address='192.168.123.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.123.2' end='192.168.123.254'/>
</dhcp>
</ip>
</network>
- GNS3の特別なインターフェイス(「クラウド」インターフェイス)を使用すると、仮想マシンをこれらのNAT仮想ネットワークに接続できます。たとえば、VM1をに
default
、VM2をに接続しましたnat-network1
。どちらの仮想マシンもDHCPで定義した範囲のIPを取得し、両方ともインターネットにアクセスできます。
私が期待したもの:他のNATネットワークを使用するように設定された仮想マシンは通信できないと予想されます。最初に説明したように、そうではないようです。
答え1
公開したチュートリアルで言及した内容は次のとおりです。
「dev」属性を物理ネットワークデバイスまたはブリッジに設定しないと、ショートカットを使用して内部インターフェイスを使用してあるKVMネットワークから別のKVMネットワークに直接トラフィックを転送できるため、予期しない動作が発生します。
これが問題の原因のようです。
変更:
<forward mode='nat'>
到着する:
<forward mode='nat' dev='<network interface example: eth0>' >
私はこれをテストし、iptablesルールが機能するようにしました。