Score:0

กำหนด Public IPv4 โดยอัตโนมัติให้กับ KVM VM ทุกตัวที่กำลังสร้างหรือไม่

ธง ug

ฉันสงสัยว่าฉันจะกำหนด public ipv4 ให้กับแต่ละ vm ที่กำลังสร้างได้อย่างไร

ติดตั้ง : โฮสต์เซิร์ฟเวอร์ที่มี 3 IP บน CentOS8 ใช้ libvirt และ kvm เพื่อจำลองเสมือน Bridge br0 โดยใช้ eth0 เป็นอินเตอร์เฟส

หลังจากการลองผิดลองถูกหลายครั้ง ฉันจัดการด้วยตนเองได้โดยใช้บริดจ์และกำหนดที่อยู่ IP ให้กับอินเทอร์เฟซของไฟล์เครือข่าย Guest OS

แม้ว่าฉันหวังว่าสิ่งนี้จะเป็นไปโดยอัตโนมัติโดยพิจารณาว่าหากฉันติดตั้งระบบปฏิบัติการใหม่ตอนนี้ มันจะกลับไปไม่มีที่อยู่ IP และรหัสที่ต้องเชื่อมต่อกับ Guest และแก้ไขที่อยู่ ipv4 ในไฟล์เครือข่ายด้วยตนเองทุกครั้ง ฉันจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร

เป้าหมาย : IPv4 แต่ละอันถูกฮาร์ดล็อกไว้กับเครื่องเสมือนและจะยังคงอยู่ไม่ว่าจะติดตั้ง OS ใหม่หรือไม่ก็ตาม

เป้าหมายเสริม : หากไม่ได้ใช้ IPv4 จาก Host OS ควรกำหนดให้กับ VM ถัดไปที่สร้างขึ้น

ฉันต้องเขียนโค้ดซอฟต์แวร์ของตัวเองเพื่อทำสิ่งนี้ทุกครั้งหรือมีวิธีที่ง่ายกว่านี้ไหม

Score:0
ธง za

นี่คือสิ่งที่ DHCP มีไว้สำหรับ

คุณสามารถเลือกที่อยู่ MAC ได้อย่างอิสระใช่ไหม ตั้งค่าเซิร์ฟเวอร์ DHCP บนระบบในส่วนอีเทอร์เน็ตเดียวกัน (อาจเป็นเสมือน) เป็น VM และผูก IP ของคุณกับ MAC บางตัว

คุณจะต้องแจกจ่ายบางเส้นทางด้วย (ใช้ตัวเลือก DHCP 121 และ 249) เครื่องที่มีเซิร์ฟเวอร์ DHCP นั้นไม่จำเป็นต้องมี IP สาธารณะหรือ IP ในเครือข่ายเดียวกันกับไคลเอนต์ทั้งหมด การสื่อสารกับเซิร์ฟเวอร์ DHCP เกิดขึ้นเมื่อยังไม่มีที่อยู่ที่กำหนดค่าบนไคลเอนต์

หากคุณใช้ ISC DHCP คุณต้องทำสิ่งต่อไปนี้ ฉันถือว่าเครื่องโฮสต์ของคุณคือเราเตอร์และกล่อง NAT สำหรับ VM และจะโฮสต์เซิร์ฟเวอร์ DHCP ของคุณด้วย หากคุณต้องการทำอย่างอื่น จะต้องมีการปรับเปลี่ยนเล็กน้อย:

  • กำหนดตัวเลือก 121 และ 249 ที่ด้านบนของ dhcpd.conf:
ตัวเลือก rfc3442-classless-static-routes รหัส 121 = อาร์เรย์ของจำนวนเต็ม 8;
ตัวเลือก ms-classless-static-routes รหัส 249 = อาร์เรย์ของจำนวนเต็ม 8;

อาจเป็นไปได้ว่าเวอร์ชันใหม่ไม่ต้องการสิ่งนี้ แต่ของฉันต้องการ

  • สร้าง เครือข่ายที่ใช้ร่วมกัน บล็อก ใส่ซับเน็ตส่วนตัวแบบไดนามิกและที่อยู่สาธารณะของคุณเป็น "ซับเน็ต" ด้วยมาสก์ 32:
เราเตอร์ตัวเลือก 192.168.210.1;
ตัวเลือกโดเมนเนมเซิร์ฟเวอร์ 8.8.8.8, 8.8.4.4;

เครือข่ายที่ใช้ร่วมกัน libvirt-vm-net {
    ซับเน็ต 192.168.210.0 เน็ตมาสก์ 255.255.255.0 {
        ช่วง 192.168.210.2 192.168.210.254;
    }

    ซับเน็ต 192.0.2.1 เน็ตมาสก์ 255.255.255.255 {
        ตัวเลือก rfc3442-classless-static-routes 32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;        
        ตัวเลือก 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 เพิ่ม 192.168.210.1 dev eth0
เส้นทาง ip เพิ่มค่าเริ่มต้นผ่าน 192.168.210.1

ซึ่งจำเป็นสำหรับทุกอย่างในการทำงานแม้ว่าจะไม่มีเครือข่ายย่อยที่มี 192.0.2.1/32 และ 192.168.210.1 ให้ลองตั้งค่าดังกล่าวในสภาพแวดล้อมของห้องปฏิบัติการ หากคุณไม่แน่ใจว่าการกำหนดเส้นทางนี้ทำงานอย่างไร

  • สร้างคำจำกัดความโฮสต์ด้วยที่อยู่ MAC ที่คุณต้องการซึ่งเชื่อมโยงกับที่อยู่ IP แบบคงที่ของคุณ:
โฮสต์เซิร์ฟเวอร์สาธารณะ-1 { ฮาร์ดแวร์อีเธอร์เน็ต 00:11:22:33:44:55; ที่อยู่คงที่ 192.0.2.1; }
...
  • เพิ่มรายการเพื่อนบ้านแบบคงที่ ("ARP") สำหรับ MAC เหล่านั้นเข้าไป /etc/ethers (บนโฮสต์):
00:11:22:33:44:55 192.0.2.1
...
  • เพิ่มเส้นทางคงที่ไปยังที่อยู่เหล่านั้นผ่านอินเทอร์เฟซบริดจ์ที่สอดคล้องกัน ฉันไม่รู้วิธีการทำสิ่งนี้โดยใช้การกำหนดค่าเครือข่ายมาตรฐานของ OS distro ของคุณ แต่วิธี Linux ทั่วไปจะเป็นดังนี้:
เส้นทาง ip เพิ่ม 192.0.2.1 dev br0
...

จากนั้นตรวจสอบให้แน่ใจว่าคุณกำหนด MAC เหล่านั้นให้กับ VM ที่สำคัญของคุณภายใน libvirt configs VM อื่นๆ (ซึ่ง MAC ไม่ได้ถูกผูกไว้) จะได้รับที่อยู่ของตนจากช่วงที่กำหนดค่าไว้ตามปกติ

ที่จริงฉันใช้งานและทดสอบการตั้งค่านี้ในการตั้งค่าที่ "ซับซ้อนกว่า" (DHCP, โฮสต์และเราเตอร์ทั้งหมดเป็นระบบที่แตกต่างกัน) ฉันไม่ได้ใช้ libvirt และโฮสต์ของฉันคือ PVE แม้แต่การบูท PXE ก็ทำงานได้อย่างสมบูรณ์แบบสำหรับทั้งเครื่องเครือข่ายย่อย "ปกติ" (เช่น 192.168.210.0 ในตัวอย่าง) และสำหรับเครื่อง "public IP" (เช่น 192.0.2.1)

ในการอนุญาตให้ VM ทั้งหมดเข้าถึงอินเทอร์เน็ต คุณต้องใช้ NAT สำหรับ IP ส่วนตัวและห้ามใช้เพื่อสาธารณะ ไม่มีปัญหา ใช้กฎเช่น iptables -t nat -A POSTROUTING -o <ฟิสิคัลอินเทอร์เฟซกับสาธารณะ-ip> -s <private-ip-range> -j MASQUERADE. ด้วยวิธีนี้ ช่วงส่วนตัวของคุณจะถูกแปลไปยังที่อยู่สาธารณะของโฮสต์เอง แต่ที่อยู่สาธารณะจะไม่ได้รับการแปล แต่จะถูกส่งไปตามที่เป็นอยู่ อีกครั้ง ไม่มีปัญหาในการมีที่อยู่สาธารณะและส่วนตัวในส่วนเครือข่ายเดียวกันและเดินผ่าน NIC เสมือนเดียวกัน

ug flag
คุณมีแหล่งที่มาเกี่ยวกับวิธีการทำสิ่งนั้นให้สำเร็จหรือไม่? ตอนนี้ฉันลองมาเกือบเต็มวันแล้ว แต่ดูเหมือนจะใช้งานไม่ได้
Nikita Kipriyanov avatar
za flag
ฉันสร้างการตั้งค่าดังกล่าวและอัปเดตโพสต์โดยเพิ่มคำอธิบายวิธีใช้งาน
ug flag
ขอบคุณมากครับพี่
ug flag
คำถามเล็ก ๆ เป็นไปได้ไหมที่จะกำหนดที่อยู่ IP โดยตรงด้วย virt-install ?
Nikita Kipriyanov avatar
za flag
ฉันไม่รู้. ฉันไม่ได้ใช้ virt-install (และ libvirt โดยทั่วไป) เป็นเวลานานมาก ตัวอย่างเช่น สิบปีผ่านไปตั้งแต่ลินุกซ์บริดจ์ได้รับการสนับสนุน VLAN แบบเนทีฟ แต่พวก libvirt ยังคงอยู่ในยุคหินและไม่มีการรองรับสะพานเนทีฟลินุกซ์ vlan-aware เพื่อกำหนด VM ให้กับ vlans อื่น แต่การตั้งค่าที่ร่างไว้เป็นเทคโนโลยีเสมือนจริงที่ไม่เชื่อเรื่องพระเจ้า และจะทำงานได้อย่างถูกต้องแม้กับฮาร์ดแวร์จริง สิ่งที่คุณต้องทำคือกำหนดที่อยู่ MAC (หรืออย่างน้อยก็บันทึก) ไม่ใช่ที่อยู่ IP การโต้ตอบถูกตั้งค่าภายในเซิร์ฟเวอร์ DHCP และ /etc/ethers

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา