생성되는 모든 KVM VM에 공용 IPv4를 자동으로 할당하시겠습니까?

생성되는 모든 KVM VM에 공용 IPv4를 자동으로 할당하시겠습니까?

생성되는 각 VM에 공개 IPv4를 할당하는 방법이 궁금합니다.

설정: eth0을 인터페이스로 사용하여 Bridge br0을 가상화하기 위해 libvirt 및 kvm을 사용하는 CentOS8에서 3개의 IP가 있는 호스트 서버입니다.

많은 시행착오 끝에 브리지를 사용하고 게스트 OS 네트워크 파일의 인터페이스에 IP 주소를 할당하여 수동으로 수행할 수 있었습니다.

지금 OS를 다시 설치하면 IP 주소가 없는 상태로 돌아가고 ID가 게스트에 연결하고 매번 네트워크 파일의 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을 포함하는 서브넷이 없다는 사실에도 불구하고 모든 것이 작동하는 데 필요합니다. 이 라우팅이 어떻게 작동하는지 잘 모르는 경우 랩 환경에서 이러한 설정을 시도하는 것이 좋습니다.

  • 고정 IP 주소에 바인딩된 원하는 MAC 주소로 호스트 정의를 생성합니다.
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
...

그런 다음 해당 MAC를 libvirt 구성 내의 중요한 VM에 할당했는지 확인하세요. MAC이 바인딩되지 않은 다른 VM은 평소와 같이 구성된 범위에서 주소를 가져옵니다.

실제로 저는 이 설정을 훨씬 더 "더 복잡한" 설정(DHCP, 호스트 및 라우터는 모두 별개의 시스템임)에서 구현하고 테스트했으며, 또한 libvirt를 사용하지 않으며 호스트는 PVE입니다. PXE 부팅도 "일반" 하위 네트워크 시스템(예: 192.168.210.0)과 "공용 IP" 시스템(예: 192.0.2.1) 모두에서 완벽하게 작동합니다.

모든 VM이 인터넷에 액세스할 수 있도록 하려면 개인 IP에는 NAT를 사용해야 하고 공용 IP에는 NAT를 사용하지 않아야 합니다. 문제가 되지 않습니다. 다음과 같은 규칙을 사용하세요 iptables -t nat -A POSTROUTING -o <physical-interface-with-public-ip> -s <private-ip-range> -j MASQUERADE. 이렇게 하면 비공개 범위가 호스트 자체의 공개 주소로 변환되지만 공개 주소는 변환되지 않고 그대로 라우팅됩니다. 다시 말하지만, 동일한 네트워크 세그먼트에 공용 주소와 개인 주소가 있고 동일한 가상 NIC를 통과하는 것은 문제가 되지 않습니다.

관련 정보