KVM/Libvirt에서: 하나의 호스트에 동일한 IP 범위를 가진 두 개의 NAT 네트워크를 갖는 방법은 무엇입니까?

KVM/Libvirt에서: 하나의 호스트에 동일한 IP 범위를 가진 두 개의 NAT 네트워크를 갖는 방법은 무엇입니까?

KVM과 libvirt를 사용하여 가상 머신의 일부 인프라 설정을 테스트하려고 합니다. 기본적으로 네트워크 내에서 가상 머신을 부팅합니다.

제 경우에는 VM과 네트워크가 항상 동일한 고정 IP 구성(예: 네트워크 192.168.125.0/24, VM ​​IP 192.168.125.50)을 가져야 합니다.

이제 동일한 호스트에서 두 개의 테스트를 병렬로 실행할 수 있는지 알고 싶습니다. 그러나 이 경우 libvirt는 동일한 IP 범위를 가진 두 개의 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.50. ssh적절한 네임스페이스에서 실행하여 이러한 컴퓨터에 SSH로 연결할 수 있습니다 .

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

이 구성을 사용하면 컴퓨터가 내 데이터에 액세스할 수 있습니다.주인하지만 일반적인 아웃바운드 액세스 권한은 없습니다. 이 기능을 활성화하려면 MASQUERADE호스트에 몇 가지 추가 규칙을 추가해야 합니다.

관련 정보