Đây là những gì DHCP dành cho.
Bạn có thể tự do lựa chọn địa chỉ MAC của họ, phải không? Thiết lập máy chủ DHCP trên hệ thống trong cùng phân đoạn ethernet (có thể là ảo) như máy ảo và liên kết IP của bạn với một số MAC nhất định.
Bạn cũng sẽ cần phân phối một số tuyến (sử dụng tùy chọn DHCP 121 và 249). Bản thân máy có máy chủ DHCP không cần phải có IP công cộng hoặc IP trong cùng một mạng với tất cả các máy khách; giao tiếp với máy chủ DHCP diễn ra khi vẫn chưa có địa chỉ nào được cấu hình trên máy khách.
Nếu bạn sử dụng ISC DHCP, bạn cần làm như sau. Tôi giả sử máy chủ của bạn là bộ định tuyến và hộp NAT cho máy ảo và nó cũng sẽ lưu trữ máy chủ DHCP của bạn. Nếu bạn muốn làm theo cách khác, sẽ cần phải điều chỉnh một chút:
- xác định các tùy chọn 121 và 249 ở đâu đó xung quanh đầu
dhcpd.conf
:
tùy chọn mã rfc3442-classless-static-routes 121 = mảng số nguyên 8;
tùy chọn mã ms-classless-static-routes 249 = mảng số nguyên 8;
có thể, các phiên bản mới không cần điều này, nhưng của tôi thì có.
- tạo một
mạng chia sẻ
chặn, hãy đặt mạng con riêng động và địa chỉ công khai của bạn dưới dạng "mạng con" với mặt nạ 32:
bộ định tuyến tùy chọn 192.168.210.1;
tùy chọn máy chủ tên miền 8.8.8.8, 8.8.4.4;
mạng chia sẻ libvirt-vm-net {
mạng con 192.168.210.0 mặt nạ mạng 255.255.255.0 {
dãy 192.168.210.2 192.168.210.254;
}
mạng con 192.0.2.1 mặt nạ mạng 255.255.255.255 {
tùy chọn rfc3442-classless-static-tuyến 32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;
tùy chọn ms-classless-static-route 32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;
}
...
}
Tôi giả sử rằng mạng "riêng tư" của bạn dành cho các máy phía sau NAT sẽ là 192.168.210.0/24 và máy chủ lưu trữ sẽ là .1 trong mạng đó (được gán cho một cầu nối). Cài đặt tuyến đường không có lớp tĩnh (tùy chọn 121 và 249) sẽ thêm các tuyến đường sau:
tuyến ip thêm 192.168.210.1 dev eth0
tuyến ip thêm mặc định qua 192.168.210.1
cần thiết để mọi thứ hoạt động mặc dù thực tế là không có mạng con nào chứa 192.0.2.1/32 và 192.168.210.1; tốt hơn hãy thử thiết lập như vậy trong môi trường phòng thí nghiệm nếu bạn không chắc cách thức hoạt động của định tuyến này
- tạo các định nghĩa máy chủ với các địa chỉ MAC mong muốn của bạn được liên kết với các địa chỉ IP tĩnh của bạn:
lưu trữ máy chủ công cộng-1 { ethernet phần cứng 00:11:22:33:44:55; địa chỉ cố định 192.0.2.1; }
...
- thêm các mục hàng xóm tĩnh ("ARP") cho các MAC đó vào
/etc/ethers
(trên máy chủ):
00:11:22:33:44:55 192.0.2.1
...
- thêm các tuyến tĩnh tới các địa chỉ đó thông qua giao diện cầu nối tương ứng; Tôi không biết cách thực hiện việc này bằng cách sử dụng cấu hình mạng tiêu chuẩn của bản phân phối hệ điều hành của bạn, nhưng cách chung của Linux là như sau:
tuyến ip thêm 192.0.2.1 dev br0
...
Sau đó, đảm bảo rằng bạn chỉ định các MAC đó cho các máy ảo quan trọng của mình trong cấu hình libvirt. Các máy ảo khác (có MAC không bị ràng buộc) sẽ nhận địa chỉ của chúng từ phạm vi được định cấu hình như bình thường.
Trên thực tế, tôi đã triển khai và thử nghiệm thiết lập này trong thiết lập thậm chí còn "phức tạp hơn" (tất cả DHCP, Máy chủ và bộ định tuyến đều là các hệ thống riêng biệt), tôi cũng không sử dụng libvirt và Máy chủ của tôi là PVE. Ngay cả khả năng khởi động PXE cũng hoạt động hoàn hảo đối với cả máy mạng con "bình thường" (như 192.168.210.0 trong ví dụ) và máy "IP công cộng" (như 192.0.2.1).
Để cho phép tất cả các máy ảo truy cập Internet, bạn phải sử dụng NAT cho các IP riêng và không sử dụng nó cho công cộng; đó không phải là vấn đề, hãy sử dụng quy tắc như iptables -t nat -A POSTROUTING -o <physical-interface-with-public-ip> -s <private-ip-range> -j MASQUERADE
. Bằng cách này, phạm vi riêng tư của bạn sẽ được dịch sang địa chỉ công khai của chính máy chủ, nhưng địa chỉ công khai sẽ không được dịch mà sẽ được định tuyến như hiện tại. Một lần nữa, không có vấn đề gì khi có các địa chỉ công khai và riêng tư trên cùng một phân đoạn mạng và đi qua cùng một NIC ảo.