Tìm hiểu về virtual network của libvirt.
1. Virtual network
1.1. Virtual network switches.
Libvirt sử dụng virtual network switch - một phần mềm xây dựng đơn giản trên một máy chủ mà các máy ảo “cắm vào” và sử dụng để giao tiếp trong mạng.
Ở trên máy chủ Linux, virtual network switch sẽ được hiển thị như là một interface. virbr0
là một virtual switch được tạo ra mặc định khi libvirt daemon được cài đặt lên host.
Ta có thể thấy interface virbr0
bằng lệnh ip adress
:
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether f0:1f:af:26:21:4b brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:27:4b:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.248.1/24 brd 192.168.248.255 scope global virbr0
valid_lft forever preferred_lft forever
$ ip addr show virbr0
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:27:4b:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.248.1/24 brd 192.168.248.255 scope global virbr0
valid_lft forever preferred_lft forever
1.2. Network Address Translation(NAT).
Mặc định, một virtual network switch sẽ hoạt động ở chế độ NAT( sử dụng masquerading thay vì SNAT hay DNAT). Điều này có nghĩa các máy ảo kết nối đến switch ảo, sử dụng ip của máy chủ để giao tiếp với mạng bên ngoài. Các máy ở bên ngoài sẽ không thể thiết lập kết nối với các máy ở trong khi Switch ảo hoạt động ở chế độ NAT.
Kiểm tra rule trong IPtables:
$ sudo iptables -L -t nat
...
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
RETURN all -- 192.168.248.0/24 base-address.mcast.net/24
RETURN all -- 192.168.248.0/24 255.255.255.255
MASQUERADE tcp -- 192.168.248.0/24 !192.168.248.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.248.0/24 !192.168.248.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.248.0/24 !192.168.248.0/24
</pre>
1.2. DNS và DHCP.
Livirt sử dụng dnsmasq
, tự động cấu hình và bật dnsmasq
để làm dhcp và dns server cho mỗi virtual network switch cần nó.
1.3. Chế độ Routed
Với chế độ routed, virtual switch sẽ được kết nối đến mạng LAN vật lý của host bằng cách định tuyến các gói tin ở tầng Network(Layer 3 trong mô hình TCP/IP) cho phép giao tiếp qua lại với mạng ngoài mà không cần NAT. Mạng LAN của máy chủ có thể giao tiếp với các máy ảo nếu có cấu hình định tuyến đến mạng ảo.
Kiểm tra rule trong IPtables:
$ sudo iptables -L -v
Chain FORWARD (policy ACCEPT 64651 packets, 61M bytes)
pkts bytes target prot opt in out source destination
1371 97437 ACCEPT all -- eth0 virbr0 anywhere 192.168.250.0/24
411 33265 ACCEPT all -- virbr0 eth0 192.168.250.0/24 anywhere
...
IPtables định tuyến tất cả gói tin đi đến interface eth0
và có địa chỉ đích là mạng ảo và ngược lại.
1.4.Chế độ Isolate.
Ở chế độ này, các máy ảo kết nối đến virtual switch có thể kết nối với nhau và với host nhưng không thể kết nối đến mạng ngoài của host.
2. Tạo mạng ảo với file XML.
2.1. Tổng quan về một số thành phần.
Trong file cấu hình mạng, phần tử gốc cho tất cả các mạng ảo là network
Thông tin chung
<network>
<name>default</name>
<uuid>b1dc362a-7daa-45e2-a306-1e4c65ae4dfd</uuid>
...
<network>
- name Thẻ
name
chứa thông tin về tên của mạng, tên của mạng chỉ nên chứa những ký tự chữ và số, và nó phải là duy nhất trên một host. - uuid là định danh toàn cầu duy nhất cho mạng ảo.
uuid
được tự động tạo ra ở định dạng RFC 4122 khi tạo hay xác nhận mạng ảo.
Kết nối.
...
<bridge name="virbr0" stp="on" delay="5" macTableManager="libvirt"/>
<mtu size="9000"/>
<domain name="example.com" localOnly="no"/>
<forward mode="nat" dev="eth0"/>
...
- bridge
Thuộc tính
name
trong thẻbridge
xác định tên của thiết bị bridge mà xẽ được sử dụng để xây dựng mạng ảo. Khi xác định một mạng mới với chế độ<forward>
là “nat”, “open” hay “route”(hay mạng isolated bằng cách không chỉ định thẻ<forward>
), libvirt sẽ tự động tạo một tên duy nhất trên hệ thống và thêm vào file cấu hình. Nên đặt tên cho bridge bắt đầu bằng “virbr”. Thuộc tínhstp
để thiết lập Spanning Tree Protocol bật(=”on”) hay tắt(=”off”), mặc định là bật. Thuộc tínhmacTableManager
của thẻ<bridge>
chỉ định cách mà bảng địa chỉ MAC(xác định port đầu ra cho gói tin đến một địa chỉ MAC nào đó) được quản lý. Mặc định nó sẽ sử dụng các chức năng quản lý bảng địa chỉ MAC của kernel. Khi thiết lập nó sử dụng libvirt(macTableManager="libvirt"
), nó sẽ sử dụng libvirt để quản lý bảng MAC của bridge ảo nhằm tăng hiệu suất. Thuộc tính tùy chọnzone
để thiết lập firewalld cho bridge ảo. -
mtu Để thiết lập MTU (Maximum Transmission Unit) với thuộc tính
size
cho bridge ở các chế độ forward(nat, route, open hay isolated), đồng thời thiết lập cho các tap device. Mặc định, khi không được chỉ định thì MTU sẽ được thiết lập là 1500. - forward
- Thẻ này để chỉ ra cách mà mạng ảo sẽ được kết nối đến mạng vật lý của host như thế nào bằng thuộc tính
mode
. Nếu không có thẻ forward thì mạng ảo sẽ bị cô lập với các mạng khác(trừ khi kết nối host đến và dùng host để định tuyến). Các thiết lập phù hợp vớimode
( mặc định lànat
khi không chỉ định thuộc tínhmode
):- nat
- Dùng để cấu hình chế độ định tuyến là Nat để định tuyến các lưu lượng từ mạng ảo ra mạng vật lý sử dụng lớp định tuyến IP của host thông qua một địa chỉ IP duy nhất. Nó có thể định tuyến đến bất cứ thiết bị nào(như ethernet, dial, wireless, VPN,…). Nếu thuộc tính
dev
được chỉ định thì nó chỉ NAT qua thiết bị được nêu tên.Các kết nối từ mạng ngoài vào mạng ảo bị hạn chế. Cũng có thể cấu hình dải địa chỉ được nat hay dải port dùng để nat.
- Dùng để cấu hình chế độ định tuyến là Nat để định tuyến các lưu lượng từ mạng ảo ra mạng vật lý sử dụng lớp định tuyến IP của host thông qua một địa chỉ IP duy nhất. Nó có thể định tuyến đến bất cứ thiết bị nào(như ethernet, dial, wireless, VPN,…). Nếu thuộc tính
- route
- Các lưu lượng mạng từ mạng ảo sẽ được định tuyến bằng lớp định tuyến IP của host thông qua các thiết bị mạng vật lý để ra mang ngoài mà không NAT. Nếu thuộc tính
dev
được chỉ định thì firewall rule sẽ chỉ định tuyến cho mạng ảo ra thiết bị được nêu tên. Các kết nối từ mạng ngoài vào mạng trong không bị hạn chế.
- Các lưu lượng mạng từ mạng ảo sẽ được định tuyến bằng lớp định tuyến IP của host thông qua các thiết bị mạng vật lý để ra mang ngoài mà không NAT. Nếu thuộc tính
- open
- Các lưu lượng từ mạng ảo ra ngoài sẽ được định tuyến bởi lớp định tuyến IP của host như
route
nhưng sẽ không có firewall rule nào được thiết lập và cũng không thể thiết lập đượcdev
cho chế độ này.
- Các lưu lượng từ mạng ảo ra ngoài sẽ được định tuyến bởi lớp định tuyến IP của host như
- bridge
- Ở chế độ này có 3 trường hợp:
- Một bridge tồn tại sẵn trên các host(được chỉ định trong
<bridge name='abc' />
) - Một Open vSwitch bridge tồn tại sẵn trên host( được chỉ định trong thẻ
bridge
và có thêm thẻ<virtualport type='openvswitch'/>
). - Một hay một nhóm các interface được sử dụng cho một kết nối trực tiếp từ các máy ảo thông qua macvtap sử dụng macvtap bridge.(nếu trong thẻ forward có thẻ con là
<interface>
)
- Một bridge tồn tại sẵn trên các host(được chỉ định trong
- libvirt không tham gia quản lý các mạng ở chế độ này(không quản lý IP, DNS,DHCP, stp hay MTU,…) private
- Ở chế độ này có 3 trường hợp:
- nat
- Thẻ này để chỉ ra cách mà mạng ảo sẽ được kết nối đến mạng vật lý của host như thế nào bằng thuộc tính
Tài liệu tham khảo: https://libvirt.org/formatnetwork.html https://wiki.libvirt.org/page/VirtualNetworking