KVM / Libvirtでは:1つのホストに同じIP範囲を持つ2つのNATネットワークを持つ方法は何ですか?

KVM / Libvirtでは:1つのホストに同じIP範囲を持つ2つのNATネットワークを持つ方法は何ですか?

KVMとlibvirtを使用して、仮想マシンのいくつかのインフラストラクチャ設定をテストしようとしています。デフォルトでは、ネットワーク内で仮想マシンを起動します。

私の場合、VMとネットワークは常に同じ静的IP構成(たとえば、ネットワーク192.168.125.0/24、VM IP 192.168.125.50)を持つ必要があります。

さて、同じホストで2つのテストを並列に実行できるかどうかを知りたいです。ただし、この場合、libvirtは同じIP範囲を持つ2つのNATネットワークを同時に作成することはできません。

この制限を解決する方法はありますか?

答え1

可能ですが、すべてのネットワーク設定を直接処理する必要があります。基本的なプロセスは次のとおりです。

  1. 複数のブリッジデバイスを手動で作成します。 (a)異なるネットワーク、(b)異なるネットワークに異なるIPアドレスを提供します。いいえ192.168.125.0/24ネットワークで。

  2. 各仮想ネットワークの名前空間を作成し、インターフェイスを介してそのブリッジに接続しますveth。インターフェイスに (a) アドレス 192.168.125.1/24 を割り当て、 (b) 接続ブリッジと同じネットワークにアドレスを割り当てます。

  3. dnsmasq192.168.125.0/24 ネットワークの DHCP アドレスを提供するように構成された各名前空間でサービスを実行します。仮想マシンの静的エントリを設定するか(仮想マシンを作成するときに静的MACアドレスを設定する必要があります)、単一のアドレスを展開するように設定します。

  4. 192.168.125.0/24ネットワークのトラフィックを偽装するために、名前空間に偽装ルールを設定します。

すべて次のとおりです。

#!/bin/sh

ip link add br-net1 type bridge
ip link add br-net2 type bridge

ip addr add 10.10.10.1/24 dev br-net1
ip addr add 10.20.20.1/24 dev br-net2

ip link set br-net1 up
ip link set br-net2 up

ip netns add net1
ip netns add net2

ip link add net1-ext type veth peer name net1-int netns net1
ip link add net2-ext type veth peer name net2-int netns net2
ip link set net1-ext master br-net1 up
ip link set net2-ext master br-net2 up

ip -n net1 addr add 192.168.125.1/24 dev net1-int
ip -n net1 addr add 10.10.10.10/24 dev net1-int
ip -n net1 link set net1-int up
ip -n net1 route add default via 10.10.10.1

ip -n net2 addr add 192.168.125.1/24 dev net2-int
ip -n net2 addr add 10.20.20.10/24 dev net2-int
ip -n net2 link set net2-int up
ip -n net2 route add default via 10.20.20.1

ip netns exec net1 iptables -t nat -A POSTROUTING -s 192.168.125.0/24 -j MASQUERADE
ip netns exec net2 iptables -t nat -A POSTROUTING -s 192.168.125.0/24 -j MASQUERADE

rm -f /tmp/net1.{log,pid}
rm -f /tmp/net2.{log,pid}

ip netns exec net1 \
  dnsmasq -C /dev/null -k --dhcp-range 192.168.125.50,192.168.125.50 \
  --log-facility /tmp/net1.log --log-dhcp \
  --pid-file=/tmp/net1.pid \
  &

ip netns exec net2 \
  dnsmasq -C /dev/null -k --dhcp-range 192.168.125.50,192.168.125.50 \
  --log-facility /tmp/net2.log --log-dhcp \
  --pid-file=/tmp/net2.pid \
  &

これらの変更は永続的ではないため、再起動するとすべての内容が消去されます。


上記の設定が完了したら、net1次のように仮想マシンを起動できます。

virt-install \
  --cloud-init ssh-key=/home/lars/.ssh/id_rsa_default.pub  \
  --disk pool=default,size=10,backing_store=jammy-server-cloudimg-amd64.img,backing_format=qcow2 -n ubuntu.net1.virt -r 4096  \
  --import  \
  --osinfo ubuntujammy  \
  --noautoconsole \
  --network bridge=br-net1

またはnet2次のようになります。

virt-install \
  --cloud-init ssh-key=/home/lars/.ssh/id_rsa_default.pub  \
  --disk pool=default,size=10,backing_store=jammy-server-cloudimg-amd64.img,backing_format=qcow2 -n ubuntu.net2.virt -r 4096  \
  --import  \
  --osinfo ubuntujammy  \
  --noautoconsole \
  --network bridge=br-net2

両方のコンピュータにアドレスがあります192.168.125.50ssh適切な名前空間で実行して、これらのコンピュータにSSHとして接続できます。

sudo ip netns exec net1 ssh -i ~/.ssh/id_rsa_oddbit [email protected]

この構成により、コンピューターは自分のデータにアクセスできます。所有者ただし、一般的なアウトバウンドアクセス権はありません。この機能を有効にするには、MASQUERADEホストにいくつかの追加ルールを追加する必要があります。

関連情報