TỔNG QUAN VỀ OPENVSWITCH
Kiến trúc tổng quan
Hình 1.1 Kiến trúc tổng quan OVS
Open vSwitch là một công cụ quan trọng trong việc kết nối các máy ảo (VMs) và container trên một host, đặc biệt là trong môi trường OpenStack compute node Nó hoạt động như một integration bridge, đảm bảo sự kết nối giữa các VMs trên compute node Open vSwitch quản lý cả các cổng vật lý như eth0, eth1 và các cổng ảo, chẳng hạn như tap port của các VMs Ba thành phần chính của Open vSwitch đóng vai trò quan trọng trong việc tối ưu hóa hiệu suất mạng.
- vswitchd: o Là ovs daemon chạy trên user space o Công cụ tương tác: ovs-dpctl, ovs-appctl, ovs-ofctl, sFlowTrend
- ovsdb-server: o Là database server của Open vSwitch chạy trên user space o Công cụ tương tác: ovs-vsctl, ovsdb-client
- kernel module (datapath): o Là module thuộc kernel space, thực hiện công việc chuyển tiếp gói tin
Kiến trúc chi tiết
The ovs-vswitchd serves as the daemon switch responsible for switching functions in conjunction with the kernel module for flow-based switching Operating in user space, it reads Open vSwitch configurations from the ovsdb-server via Inter Process Communication (IPC) and pushes these configurations to the ovs bridges, which are instances of the ofproto library Additionally, it transmits the status and statistical information from the ovs bridges back into the database.
OVSDB offers a Remote Procedure Call (RPC) interface, enabling JSON-RPC clients to connect via passive TCP/IP or Unix domain sockets.
Hình 1.2 Kiến trúc chi tiết của OVS
Datapath là module chính trong Open vSwitch, chịu trách nhiệm chuyển tiếp gói tin và được triển khai trong kernelspace để đạt hiệu năng cao Nó lưu trữ các OpenFlow flows và thực hiện các hành động trên gói tin nếu chúng phù hợp với một flow đã tồn tại Nếu gói tin không khớp với bất kỳ flow nào, nó sẽ được chuyển lên ovs-vswitchd để xử lý Nếu flow matching thành công tại vswitchd, gói tin sẽ được gửi lại cho kernel datapath kèm theo các hành động tương ứng và được cache lại để xử lý các gói tin tương tự sau này Hiệu năng cao đạt được nhờ vào việc hầu hết các gói tin đều khớp với flows tại datapath, cho phép xử lý trực tiếp trong kernelspace OVS hỗ trợ nhiều loại datapath, bao gồm: Linux upstream, Linux OVS tree, userpace datapath như DPDK, và Hyper-V (Windows datapath).
ovs-vsctl là công cụ chính để quản lý các switch trong Open vSwitch, tương tác với ovsdb-server để lưu trữ cấu hình vào cơ sở dữ liệu Công cụ này thực hiện các truy vấn và áp dụng thay đổi vào cơ sở dữ liệu dựa trên lệnh được thực hiện ovsdb-server giao tiếp với ovs-vswitchd qua giao thức OVSDB, và khi ovs-vsctl thực hiện thay đổi, nó sẽ chờ ovs-vswitchd hoàn tất việc tái cấu hình switch.
Công cụ ovs-appctl được sử dụng để quản lý ovs-vswitchd bên cạnh ovs-vsctl, cho phép gửi các lệnh nội bộ nhằm thay đổi cấu hình và nhận phản hồi từ ovs-vswitchd Đồng thời, ovs-vswitchd cũng lưu trữ các cấu hình này vào cơ sở dữ liệu thông qua việc tương tác với ovsdb-server qua Unix domain socket.
Open vSwitch (OVS) có thể được quản lý và giám sát từ xa thông qua remote controller, cho phép định nghĩa mạng bằng phần mềm và hỗ trợ SDN Giao thức sFlow được sử dụng để lấy mẫu gói tin và giám sát, trong khi OpenFlow quản lý flow table của switch, bridge hoặc thiết bị Open vSwitch hỗ trợ cả hai giao thức này, và với ovs-ofctl, người dùng có thể sử dụng OpenFlow để kết nối với switch nhằm thực hiện giám sát và quản trị từ xa Đáng lưu ý, sFlowTrend không phải là một phần của Open vSwitch mà là phần mềm độc lập hỗ trợ giám sát bằng sFlow.
- ovs-pki: Công cụ cho phép tạo và quản lý các public-key cho các Open Flow switch.
OVS-Testcontroller là một controller OpenFlow đơn giản, có khả năng quản lý nhiều switch ảo thông qua giao thức OpenFlow Nó cho phép các switch hoạt động như switch lớp 2 hoặc như hub, rất phù hợp cho việc thử nghiệm các mạng OpenFlow ban đầu.
1 3 Xử lý gói tin của Open vSwitch
Hình 1.3 Xử lý gói tin của OVS
Open vSwitch là phần mềm switch hỗ trợ OpenFlow, với controller chịu trách nhiệm hướng dẫn datapath xử lý các gói tin khác nhau, hay còn gọi là flows Mỗi flow mô tả hành động mà datapath thực hiện với các gói tin cùng loại, bao gồm các hành động như chuyển tiếp tới port khác hoặc thay đổi VLAN tag Quá trình tìm kiếm flow phù hợp với gói tin được gọi là flow matching, trong đó một phần flows được cache trong datapath và phần còn lại ở vswitchd Khi một gói tin được nhận trên card mạng, nếu nó khớp với flow trong datapath, các actions tương ứng sẽ được thực thi Nếu không có flow phù hợp, gói tin sẽ được gửi lên ovs-vswitchd để xử lý flow matching, sau đó ovs-vswitchd sẽ xác định cách xử lý và gửi lại gói tin cho datapath cùng với yêu cầu lưu cache flow cho các gói tin tương tự sau này.
Mã nguồn của OVS chủ yếu được viết bằng ngôn ngữ C, giúp nó độc lập với nền tảng và dễ dàng chuyển đổi sang các môi trường khác nhau Các bản phát hành của OVS cung cấp nhiều tính năng hỗ trợ đa dạng.
- Chuẩn 802.1Q VLAN với trunk và access ports
- NIC bonding với LACP trên upstream switch
- Chính sách và cấu hình QoS (Qualiuty of Service)
- Geneve, GRE, VXLAN, STT và LISP tunneling
- Cấu hình liên kết giữa C và Python
- Truyền tải hiệu năng cao với module Linux Kernel
OVS có thể hoạt động hoàn toàn trong userspace mà không cần hỗ trợ từ module kernel, mang lại tính linh hoạt và dễ dàng chuyển đổi Nó cho phép truy cập đến các thiết bị Linux hoặc DPDK và có khả năng chạy trên nhiều nền tảng như Linux, FreeBSD, Windows và các hệ thống nhúng non-POSIX, đồng thời tương thích với các switch hiện đại.
Hypervisor cần kết nối lưu lượng giữa các máy ảo và thế giới bên ngoài, với các hypervisor dựa trên Linux sử dụng switch layer 2 tích hợp (Linux bridge) để đảm bảo tốc độ và độ tin cậy Tuy nhiên, Open vSwitch được ưa chuộng hơn vì nó được thiết kế cho triển khai ảo hóa đa máy chủ, nơi mà các ngăn xếp giao thức truyền thống không đáp ứng được yêu cầu Môi trường này thường có các điểm cuối năng động cao, các đối tượng trừu tượng logic, và đôi khi cần tích hợp với phần cứng switch chuyên dụng Các đặc điểm thiết kế của Open vSwitch giúp nó phù hợp với những yêu cầu này.
Trạng thái linh hoạt
Tất cả các trạng thái mạng liên kết với thực thể mạng, như máy ảo (VM), cần phải dễ dàng nhận diện và có khả năng di chuyển giữa các máy chủ khác nhau Điều này bao gồm các trạng thái mềm truyền thống, chẳng hạn như các mục trong bảng Layer 2.
OVS hỗ trợ các trạng thái định tuyến chính sách như ACL, QoS và cấu hình giám sát (Netflow, sFlow), cho phép cấu hình và thay đổi trạng thái mạng linh hoạt Khi một máy ảo di chuyển giữa các máy chủ, các trạng thái cấu hình như SPAN, ACL và QoS có thể được chuyển đổi theo yêu cầu Hơn nữa, các trạng thái mạng của OVS được phát triển với mục tiêu tự động hóa khả lập trình, giúp tối ưu hóa hiệu suất mạng.
Phản hồi tốt với thay đổi của mạng
Môi trường ảo thường xuyên thay đổi với máy ảo di chuyển liên tục, và OVS cung cấp các tính năng để hệ thống điều khiển mạng có thể phản hồi và thích ứng với những thay đổi này Các tính năng bao gồm hỗ trợ các giao thức như NetFlow, IPFX và sFLOW, cùng với OVSDB cho phép tương tác từ xa, giúp phần mềm quản lý theo dõi và phản ứng kịp thời với các biến động trong mạng Đặc biệt, OVS hỗ trợ OpenFlow như một phương thức truy cập vào khả năng điều khiển lưu lượng, điều này đã trở nên phổ biến trong việc quản lý mạng hiện nay.
Duy trì các Tag logic
Các thiết bị chuyển mạch ảo phân tán như VMware vDS và Cisco Nexus 1000V duy trì ngữ cảnh logic trong mạng bằng cách gắn hoặc thao tác các thẻ trong packet mạng, giúp xác định duy nhất máy ảo và giữ ngữ cảnh liên quan Vấn đề chính trong việc xây dựng chuyển mạch ảo phân tán là quản lý hiệu quả các thẻ này Open vSwitch (OVS) cung cấp nhiều phương pháp để chỉ định và duy trì các quy tắc gắn thẻ, cho phép truy cập từ xa Các quy tắc này thường được lưu trữ dưới dạng tối ưu hóa, cho phép cấu hình và thay đổi hàng nghìn quy tắc mà không làm nặng thiết bị mạng Hơn nữa, OVS hỗ trợ triển khai GRE, có khả năng xử lý hàng nghìn đường hầm GRE đồng thời, với tính năng cấu hình từ xa để tạo và quản lý các đường hầm, giúp kết nối các mạng VM riêng trong các trung tâm dữ liệu khác nhau.
Chương 1 đã đề cập tới khái niệm cơ bản về Open vSwitch, đồng thời giới thiệu những tính năng và thành phần chính Theo nhiều cách, Open vSwitch nhắm đến một điểm khác trong không gian thiết kế so với các ngăn xếp mạng hypervisor trước đó, tập trung vào nhu cầu kiểm soát mạng động và tự động trong môi trường ảo hóa dựa trên
Open vSwitch là một giải pháp mạng cho Linux quy mô lớn, với mục tiêu tối ưu hóa hiệu suất bằng cách giữ cho mã trong kernel nhỏ gọn Nó tận dụng các hệ thống con hiện có, chẳng hạn như ngăn xếp QoS, để nâng cao hiệu quả Kể từ phiên bản Linux 3.3, Open vSwitch đã được tích hợp vào kernel và cung cấp các tiện ích userspace trên hầu hết các bản phát hành phổ biến.
CÀI ĐẶT VÀ THAO TÁC VỚI OPENVSWITCH
Giới thiệu Ubuntu Server
Ubuntu Server là một hệ điều hành trong dòng phân phối Linux phổ biến, được thiết kế đặc biệt để hỗ trợ các hoạt động mạng và dịch vụ Phiên bản này khác biệt so với các bản Ubuntu tiêu chuẩn, tập trung vào việc chạy trên các tệp tin server đơn giản Không giống như phiên bản Desktop, Ubuntu Server không có giao diện đồ họa, mà chủ yếu phục vụ cho các nhu cầu như email server, file server và web server.
Ubuntu Server mang lại hiệu quả kinh tế và kỹ thuật vượt trội, đáp ứng nhu cầu mở rộng quy mô cho trung tâm dữ liệu, bất kể là công cộng hay riêng tư, cũng như cho các triển khai đám mây và Hadoop.
Hình 2.1 Hệ điều hành Ubuntu
Mặc định, OVS không cài đặt sẵn trên Ubuntu Server, nên cần thực hiện việc này thù công thông qua cú pháp: root@ubun-server-2:~# apt install openvswitch-switch
Nếu người dùng hiện tại không phải là root, hãy thêm sudo vào đầu lệnh Quá trình cài đặt sẽ tự động diễn ra, sau khi hoàn tất, bạn có thể kiểm tra trạng thái dịch vụ OVS bằng lệnh: `systemctl status openvswitch-switch.service`, và bạn sẽ thấy dịch vụ openvswitch-switch đang ở trạng thái chạy.
Loaded: loaded (/lib/systemd/system/openvswitch-switch.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2020-11-11 11:24:15 UTC; 1min 54s ago
Main PID: 2468 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/openvswitch-switch.service
Nov 11 11:24:15 ubun-server-2 systemd[1]: Starting Open vSwitch
Nov 11 11:24:15 ubun-server-2 systemd[1]: Finished Open vSwitch.
2 1 Các lệnh cơ bản với Open vSwitch
Sử dụng ovs-vsct1 để xem trạng thái các Bridge hiện tại
Để truy vấn cấu hình Bridge trên hệ thống, bạn có thể sử dụng lệnh "ovs-vsctl show" Hiện tại, chưa có Bridge nào được thiết lập bởi Open vSwitch (OvS).
5fad0b3c-2e85-4bb5-b599-d77a9aa2aa0e ovs_version: "2.13.1"
2 2 Sử dụng ovs-vsct1 để tạo và xóa Bridge
Chúng ta sẽ sử dụng lệnh ovs-vsctl để thiết lập một Bridge thông qua Open vSwitch (OvS) bằng cú pháp: `ovs-vsctl add-br ovs` Để kiểm tra cấu hình, sử dụng lệnh `ovs-vsctl show`.
Interface ovs type: internal ovs_version: "2.13.1"
Để xóa một Bridge đã tạo với tên ovs (hoặc tên tùy chọn khác), bạn có thể sử dụng lệnh sau: `ovs-vsctl del-br ovs` Sau khi thực hiện lệnh, bạn có thể kiểm tra lại danh sách các Bridge hiện có bằng lệnh `ovs-vsctl show`.
5fad0b3c-2e85-4bb5-b599-d77a9aa2aa0e ovs_version: "2.13.1"
Như vậy, Bridge chúng ta vừa khởi tạo là ovs đã không còn trong danh sách Bridge khả dụng.
Thực hiện thêm và xóa port vào Bridge đã có sẵn
Để thêm giao diện mạng ens38 vào Bridge ovs đã có sẵn, bạn cần sử dụng lệnh sau: `ovs-vsctl show`.
Interface ovs type: internal ovs_version: "2.13.1" root@ubun-server-2:~# ip a s ens38
3: ens38: mtu 1500 qdisc fq_codel state
To begin, we check the availability of the Bridge and the network interface Next, we proceed to add the port using the command `ovs-vsctl add-port ovs ens38` After adding the port, we verify the interface with `ip a f ens38` Finally, we run `dhclient ovs`, but encounter an error indicating that the temporary file is empty.
- Với câu lệnh đầu tiên, ta sử dụng cú pháp ovs-vsctl add-port để thực hiện thêm vào Bridge ovs một Port là ens38
Để đảm bảo hoạt động ổn định của OvS, việc xóa địa chỉ IP trên ENS là một bước bắt buộc cần thực hiện.
Cuối cùng, chúng ta cần thực hiện yêu cầu địa chỉ IP cho Bridge OVS Tại bước này, bạn cũng có thể thiết lập địa chỉ IP tĩnh bằng cách sử dụng lệnh "ip addr add".
- Tại đây, bạn cũng có thể thêm cú pháp type ở sau tên Port Có 3 type Port được hỗ trợ trong OvS đó là : Internal, VxLAN và GRE
Thực hiện liệt kê thông tin các port trên bridge
Để thực hiện việc liệt kê các Port đang được kết nối với Bridge, ta thực hiện lệnh sau với : root@ubun-server-2:~# ovs-vsctl list-ports ovs ens38
Để truy vấn thông tin của Bridge ovs, chúng ta cần xác định Port kết nối, ví dụ như ens38 Để xem thông tin chi tiết về các thông số của Port trên Bridge, hãy sử dụng cú pháp: `root@ubun-server-2:~# ovs-ofctl dump-ports ovs`.
The OFPST_PORT reply (xid=0x2) provides performance metrics for two ports: LOCAL and ens38 For the LOCAL port, there were 36 received packets totaling 5,521 bytes, with no drops or errors reported, and 56 transmitted packets totaling 268 bytes The ens38 port received 75 packets amounting to 850 bytes, also with no drops or errors, and transmitted 5 packets totaling 894 bytes.
Kết quả trả về là các thông số của mỗi Port trên Bridge
Thêm port và VLAN thông qua OVS
Để chia các Port vào các VLAN riêng biệt, bạn có thể sử dụng câu lệnh sau để thêm Port: `ovs-vsctl add-port ovs ens38 tag0` Sau khi thực hiện, bạn có thể kiểm tra kết quả bằng câu lệnh `ovs-vsctl show`.
- Câu lệnh 1, chúng ta thực hiện thêm 1 Port là ens38 vào Bridge ovs tại VLAN 100
- Câu lệnh 2, ta kiểm tra việc khởi tạo → nhận được kết quả Port ens38 đã có tag
100 hay cũng có nghĩa là thuộc VLAN 100
Chương 2 đã trình bày những thao tác cơ bản cho một số chức năng của OVS trên hệ điều hành Ubuntu Server Bằng cách thực hiện những cấu hình đơn giản, OVS đã có thể hoạt động và triển khai như một chuyển mạch vật lý thông thường
MÔ PHỎNG ỨNG DỤNG CỦA OPEN VSWITCH
Thực hiện kết nối các Virual Machine tới OVS bridge
Bài LAB thực hiện tạo 1 Bridge với OpenVSwitch để kết nối 2 VM trên Bridge → Sau khi thực hiện có thể thực hiện Ping thành công giữa 2 VM
Để sử dụng Open vSwitch (OVS) hiệu quả, người dùng cần nắm vững kiến thức về OVS cũng như cách sử dụng các câu lệnh ovs-vsctl Trong ví dụ này, chúng ta sẽ làm việc với một máy chủ Host và hai máy ảo (VM) đang hoạt động trên máy chủ đó.
VM được tạo bằng QEMU-KVM) o Một dải mạng mạng khả dụng ( Có thể là mạng nối ra External Network hoặc Host-only Network )
Hình 3.1 Mô hình kết nối bài lab
- Các bước thực hiện: o Cài đặt Package OpenVSwitch
Bước 1: Thực hiện tạo Bridge giữa 2 VM
Bước 2 : Thêm giao diện mạng vào OVS Bridge
Bước 3 : Thêm Port của VM vào OVS Bridge o Bước 4 : Yêu cầu địa chỉ IP mới cho các VM
Tại VM 2 : o Bước 5 : Tiến hành kiểm tra Ping giữa 2 VM
3.1.1 Thực hiện bài LAB Đầu tiên, chúng ta cần thực hiện cài đặt Package OVS trên Ubuntu / Debian sudo apt update sudo apt upgrade sudo apt install openvswitch-switch
Để tạo kết nối giữa hai máy ảo (VM), bước đầu tiên là thiết lập một Bridge giống như trên Linux Bạn cần kiểm tra các Bridge hiện có trên hệ thống bằng lệnh `ovs-vsctl show`.
399eb6fe-51d2-4bca-ade7-e1fa41e5c7f9 ovs_version: "2.13.1"
→ Hiện tại trên hệ thống không có Bridge nào đang hoạt động
To create a bridge on the system, execute the following commands: `ovs-vsctl add-br ovs` followed by `ovs-vsctl show` to verify the setup.
399eb6fe-51d2-4bca-ade7-e1fa41e5c7f9
Interface ovs type: internal ovs_version: "2.13.1" root@ubun-server:/#
- Câu lệnh 1 : Chúng ta thực hiện tạo 1 Bridge tên là ovs thông qua câu lệnh ovs- vsctl
- Câu lệnh 2 : Thực hiện kiểm tra việc khởi tạo Bridge Kết quả nhận được đó là 1 Bridge ovs
Sau đó ta cần thực hiện tạo Network cho Bridge này thông qua việc định nghĩa file
*.xml , ta thực hiện tạo 1 file xml có tên là ovs.xml có nội dung như sau:
- Mục name : là tên của Network chúng ta sẽ sử dụng
- Mục forward mode : Chế độ chúng ta sử dụng với Network này là chế độ Bridge
- Mục bridge : Tên của Bridge ta vừa tạo ở bước trên
- Mục virtualport type : Chỉ định loại Port chúng ta sử dụng
- Tiếp tục thực hiện lệnh với virsh để tạo và chạy network : root@ubun-server:/etc/libvirt/qemu/networks# virsh net-define ovs.xml
Network ovs defined from ovs.xml oot@ubun-server:/etc/libvirt/qemu/networks# virsh net-start ovs
Network ovs started root@ubun-server:/etc/libvirt/qemu/networks# virsh net-autostart ovs
Network ovs marked as autostarted root@ubun-server:/etc/libvirt/qemu/networks# virsh net-list all
- default active yes yes ovs active yes yes
Sử dụng lệnh đầu tiên, chúng ta tạo một Network từ file xml đã khởi tạo Sau khi khởi tạo thành công, ta tiến hành chạy Network này và bật chế độ tự động khởi động bằng lệnh thứ hai và thứ ba Cuối cùng, để kiểm tra, chúng ta sử dụng lệnh virsh và xác nhận rằng đã có một Network mang tên ovs.
Bước 2: Thêm giao diện mạng vào OVS Bridge
To add the available network interface named ens38 to the OVS Bridge, we first need to check the network interface by executing the command: `ip add show ens38`.
3: ens38: mtu 1500 qdisc fq_codel state
The UP group has a default network interface with the identifier qlen 1000, featuring a MAC address of 00:0c:29:04:c9:32 It is configured with an IPv4 address of 192.168.98.138/24, allowing for a broadcast address of 192.168.98.255 and a global scope The interface also supports IPv6, with a link-local address of fe80::20c:29ff:fe04:c932/64 Both the IPv4 and IPv6 addresses have valid lifetimes set to forever, ensuring continuous connectivity.
To add the ens38 interface to the OVS Bridge, use the command `ovs-vsctl add-port ovs ens38`, and then request an IP address for the OVS Bridge with `dhclient ovs` Alternatively, you can assign a static IP address at this stage using the command `ip a add`.
To remove the current IP address of ens38, execute the command `ip add flush ens38` After flushing the IP address, verify the status of ens38 by using the command `ip add show ens38`, and also check the IP configuration of the OVS Bridge.
3: ens38: mtu 1500 qdisc fq_codel master ovs-system state UP group default qlen 1000 link/ether 00:0c:29:04:c9:32 brd ff:ff:ff:ff:ff:ff root@ubun-server:~# ip a s ovs
5: ovs: mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether 00:0c:29:04:c9:32 brd ff:ff:ff:ff:ff:ff inet 192.168.98.142/24 brd 192.168.98.255 scope global dynamic ovs valid_lft 1786sec preferred_lft 1786sec inet6 fe80::20c:29ff:fe04:c932/64 scope link valid_lft forever preferred_lft forever
→ Hiện tại ovs đã có địa chỉ là 192.168.98.142
Step 3: Add the VM Port to the OVS Bridge By default, when creating a VM using QEMU/KVM, it is automatically added to a Linux Bridge named virbr0 You can verify this by using the command `brctl show`, which will display the bridge name, bridge ID, STP status, and interfaces associated with virbr0, including virbr0-nic, vnet0, and vnet1.
On the Linux Bridge virbr0, there are currently two VM interfaces, vnet0 and vnet1 To utilize these interfaces with Open vSwitch (OVS), it is necessary to remove vnet* from the Linux Bridge This can be achieved by first bringing down virbr0 using the command `ip link set virbr0 down`, followed by removing the interfaces with the commands `brctl delif virbr0 vnet0` and `brctl delif virbr0 vnet1` Finally, you can verify the configuration by using `brctl show`, which will display the bridge name, ID, STP status, and remaining interfaces.
- Thông qua câu lệnh 1, chúng ta thực hiện chuyển trạng thái của Linux Bridge thành Down ( Không hoạt động )
- Tại câu lệnh thứ 2 và thứ 3 , ta sẽ thực hiện xóa các giao diện mạng vnet0 và vnet1 khỏi Linux Bridge này
Việc kiểm tra kết quả được diễn ra tại câu lệnh thứ 4 qua lệnh brctl show
The next step involves adding vnet0 and vnet1 to the OVS Bridge named ovs This can be accomplished by executing the commands: `ovs-vsctl add-port ovs vnet0` and `ovs-vsctl add-port ovs vnet1` Finally, to verify the configuration, use the command `ovs-vsctl show`.
399eb6fe-51d2-4bca-ade7-e1fa41e5c7f9
Interface vnet1 ovs_version: "2.13.1" root@ubun-server:~#
- Tại câu lệnh 1 và 2, chúng ta thực hiện sử dụng câu lệnh ovs-vsctl để thêm port ( add-port ) vnet0 và vnet1
- Tại câu lệnh cuối thực hiện kiểm tra việc khởi tạo của 2 Port OVS
Để đảm bảo rằng sau khi khởi động, hai giao diện vnet0 và vnet1 vẫn thuộc OVS, cần chỉnh sửa file cấu hình của VM Cụ thể, với VM 1, thực hiện lệnh sau: `virsh edit debian` trong thư mục `/etc/libvirt/qemu/networks` Việc chỉnh sửa cấu hình cho VM 2 sẽ được thực hiện tương tự.
Trong đó debian là tên VM của bạn Sau khi mở file cấu hình tiến hành tìm mục sau
Chỉnh sửa mục source network từ default thành ovs, tên Network đã tạo ở bước 1, để tránh nhầm lẫn với tên Bridge Sau đó, lưu cấu hình của VM để đảm bảo rằng mỗi lần khởi động lại, hai giao diện vnet0 và vnet1 vẫn thuộc về Bridge ovs.
Bước 4: Yêu cầu địa chỉ IP mới cho các VM
Thực hiện tạo VLAN qua Open vSwitch
Bài LAB thực hiện chia VLAN giữa các các PC ( Ở đây là các VM ) thông qua hoạt động với OVS.
Hình 3.2 Mô hình bài lab tạo VLAN qua OVS
Để thực hiện bài lab này, bạn cần nắm vững kiến thức về OpenVSwitch và các lệnh cơ bản liên quan Ngoài ra, hiểu biết về VLAN và cách thức hoạt động của nó cũng rất quan trọng Trong môi trường lab, một server Host sẽ chạy hai máy ảo VM QEMU/KVM ở trạng thái Running, sử dụng dải mạng ens38 có sẵn trên server Host.
Để thực hiện cấu hình mạng ảo hóa, bạn cần thực hiện các bước sau: Bước 1 là tạo một Bridge sử dụng OpenVSwitch Bước 2 là thêm các port của máy ảo (VM) vào VLAN thông qua OpenVSwitch Cuối cùng, Bước 3 là kiểm tra kết nối bằng cách thực hiện lệnh Ping giữa hai máy ảo.
Để kết nối hai máy ảo (VM), bước đầu tiên là tạo một Bridge bằng OpenVSwitch, tương tự như việc tạo Bridge trên Linux Để kiểm tra các Bridge hiện có trên hệ thống, bạn có thể sử dụng lệnh sau: `ovs-vsctl show`.
399eb6fe-51d2-4bca-ade7-e1fa41e5c7f9 ovs_version: "2.13.1"
→ Hiện tại trên hệ thống không có Bridge nào đang hoạt động
To create a bridge on the system, execute the following commands: `ovs-vsctl add-br ovs` and then check the configuration with `ovs-vsctl show`.
399eb6fe-51d2-4bca-ade7-e1fa41e5c7f9
Interface ovs type: internal ovs_version: "2.13.1" root@ubun-server:/#
- Câu lệnh 1 : Chúng ta thực hiện tạo 1 Bridge tên là ovs thông qua câu lệnh ovs- vsctl
- Câu lệnh 2 : Thực hiện kiểm tra việc khởi tạo Bridge Kết quả nhận được đó là 1 Bridge ovs
Sau đó ta cần thực hiện tạo Network cho Bridge này thông qua việc định nghĩa file
*.xml , ta thực hiện tạo 1 file xml có tên là ovs.xml có nội dung như sau:
- Mục name : là tên của Network chúng ta sẽ sử dụng
- Mục forward mode : Chế độ chúng ta sử dụng với Network này là chế độ Bridge
- Mục bridge : Tên của Bridge ta vừa tạo ở bước trên
- Mục virtualport type : Chỉ định loại Port chúng ta sử dụng
Tiếp tục thực hiện lệnh với virsh để tạo và chạy network : root@ubun-server:/etc/libvirt/qemu/networks# virsh net-define ovs.xml
Network ovs defined from ovs.xml oot@ubun-server:/etc/libvirt/qemu/networks# virsh net-start ovs
Network ovs started root@ubun-server:/etc/libvirt/qemu/networks# virsh net-autostart ovs
Network ovs marked as autostarted root@ubun-server:/etc/libvirt/qemu/networks# virsh net-list all
- default active yes yes ovs active yes yes
Bằng cách sử dụng lệnh đầu tiên, chúng ta có thể tạo một Network từ file xml đã khởi tạo Sau khi khởi tạo thành công, chúng ta sẽ chạy Network này và kích hoạt chế độ tự động khởi động với các lệnh thứ hai và thứ ba Cuối cùng, để kiểm tra kết quả, chúng ta sẽ sử dụng lệnh virsh và xác nhận rằng đã tạo thành công một Network có tên là ovs.
Next, we need to add the available network interface to the Bridge We will check the network interface, which is named ens38, and add it to the OVS Bridge as follows First, verify the network interface by running the command: `ip add show ens38`.
3: ens38: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:04:c9:32 brd ff:ff:ff:ff:ff:ff inet 192.168.98.138/24 brd 192.168.98.255 scope global ens38 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe04:c932/64 scope link valid_lft forever preferred_lft forever
First, add the ens38 interface to the OVS Bridge by executing the command `ovs-vsctl add-port ovs ens38` Then, request an IP address for the OVS Bridge using `dhclient ovs` Alternatively, you can assign a static IP address at this stage using the command `ip a add`.
Finally, we execute the command to delete the current IP address of ens38, then check the address of ens38 after the deletion, and verify the IP of the OVS bridge The commands used are: `ip add flush ens38` and `ip add show ens38`.
3: ens38: mtu 1500 qdisc fq_codel master ovs-system state UP group default qlen 1000 link/ether 00:0c:29:04:c9:32 brd ff:ff:ff:ff:ff:ff root@ubun-server:~# ip a s ovs
5: ovs: mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether 00:0c:29:04:c9:32 brd ff:ff:ff:ff:ff:ff inet 192.168.98.142/24 brd 192.168.98.255 scope global dynamic ovs valid_lft 1786sec preferred_lft 1786sec inet6 fe80::20c:29ff:fe04:c932/64 scope link valid_lft forever preferred_lft forever
→ Hiện tại ovs đã có địa chỉ là 192.168.98.142
Để thêm các port của VM vào VLAN thông qua OVS, bạn cần biết rằng khi tạo VM bằng QEMU/KVM, VM sẽ tự động được thêm vào một Bridge mặc định có tên là virbr0 của Linux Bridge Bạn có thể kiểm tra thông tin này bằng lệnh `brctl show`, trong đó sẽ hiển thị tên bridge, ID bridge, trạng thái STP và các giao diện liên quan.
On the Linux Bridge virbr0, there are currently two VM interfaces, vnet0 and vnet1 To utilize vnet* with Open vSwitch (OVS), it is necessary to remove these interfaces from the Linux Bridge This can be accomplished by bringing the virbr0 interface down and then deleting vnet0 and vnet1 from it using the commands: `ip link set virbr0 down`, `brctl delif virbr0 vnet0`, and `brctl delif virbr0 vnet1` After executing these commands, the bridge configuration can be verified with `brctl show`, which should display the updated bridge details.
- Thông qua câu lệnh 1, chúng ta thực hiện chuyển trạng thái của Linux Bridge thành Down ( Không hoạt động )
- Tại câu lệnh thứ 2 và thứ 3 , ta sẽ thực hiện xóa các giao diện mạng vnet0 và vnet1 khỏi Linux Bridge này
Việc kiểm tra kết quả được diễn ra tại câu lệnh thứ 4 qua lệnh brctl show
The next step involves adding the VM's network interfaces to the VLAN using OVS Bridge This can be accomplished with the following commands: `ovs-vsctl add-port ovs vnet0 tag0` and `ovs-vsctl add-port ovs vnet1 tag 0` Finally, you can verify the configuration by executing the command `ovs-vsctl show`.
399eb6fe-51d2-4bca-ade7-e1fa41e5c7f9
- Với câu lệnh thứ nhất, ta thực hiện thêm giao diện vnet0 vào Bridge ở VLAN 100
- Với câu lệnh thứ hai , ta thực hiện thêm giao diện vnet1 vào Bridge ở VLAN 200
- Cuối cùng, ta kiểm tra lại kết quả ở câu lệnh thứ 3 Nhận được kết quả mong muốn
Bước 3: Thực hiện Ping giữa 2 VM
Ta thực hiện truy cập vào 2 VM và thực lấy địa chỉ IP và sau đó thực hiện ping giữa 2
Để kiểm tra kết nối ping giữa hai máy ảo (VM), bạn cần thực hiện một số lệnh trên VM Đầu tiên, sử dụng lệnh `ip a f ens2` để xem thông tin giao diện mạng Sau đó, nhập lệnh `ip a a 192.168.98.139/24 dev ens2` để cấu hình địa chỉ IP cho giao diện ens2 Cuối cùng, kiểm tra lại cấu hình bằng lệnh `ip a s ens2`.
2: ens2: mtu 1500 qdisc pfifo_fast state
UP group default qlen 1000 link/ether 52:54:00:79:f0:7a brd ff:ff:ff:ff:ff:ff inet 192.168.98.139/24 brd 192.168.98.255 scope global dynamic ens2 valid_lft 1795sec preferred_lft 1795sec
Ta thực hiện xóa địa chỉ ip hiện tại của giao diện mạng VM, sau đó thực hiện thêm địa chỉ IP cho VM
Thực hiện việc tương tự tại VM 2 Nhận được kết quả như sau : root@debian:~# ip a f ens2 root@debian:~# ip a a 192.168.98.140/24 dev ens2 root@debian:~# ip a s ens2
2: ens2: mtu 1500 qdisc pfifo_fast state
UP group default qlen 1000 link/ether 52:54:00:ee:82:32 brd ff:ff:ff:ff:ff:ff inet 192.168.98.140/24 brd 192.168.98.255 scope global dynamic ens2 valid_lft 1797sec preferred_lft 1797sec
⇒ Vậy địa chỉ IP của VM 1 là 192.168.98.139 còn địa chỉ của VM 2 là 192.168.98.140
Ta thực hiện ping từ VM 1 sang VM 2 :
3 packets transmitted, 0 received, 100% packet loss, time 41ms
Thực hiện để tạo VxLAN qua OVS
VxLan (Virtual Extensible LAN) là công nghệ được phát triển nhằm khắc phục những hạn chế của VLAN hiện tại, như giới hạn 4096 VLAN và những vấn đề liên quan đến VTP (Virtual Trunking Protocol) Công nghệ này cũng giảm thiểu yêu cầu về dung lượng bảng của thiết bị chuyển mạch, do mỗi máy chỉ cần một địa chỉ IP và một MAC riêng biệt.
VxLAN sử dụng 24 bit để đánh dấu VLAN_ID, cho phép có khoảng 16 triệu giá trị khả dụng (2^24) Với con số này, VxLAN đáp ứng đủ nhu cầu cho các mạng lớn hiện nay.
VxLAN sử dụng IP ( Unicast và Multicast) như phương tiện truyền dẫn.
3.3.1.2 Các khái niệm cơ bản trong VxLAN
VxLAN hoạt động trên cơ chế Overlay một lớp mạng L2 trên lớp mạng L3 thông thường
Để tạo ra một lớp Stack, cần thiết phải có khả năng đọc các bản tin L2 và L3 Mỗi lớp này được gọi là một Segment, và mỗi Segment sẽ được đánh dấu bằng một VNI sử dụng 24 bit Chỉ những máy thuộc cùng một VxLAN Segment, tức là cùng một VNI, mới có thể truy cập và đọc các bản tin trong Segment đó.
VxLAN cho phép cô lập các địa chỉ MAC bên trong do các máy chủ tạo ra, giúp thực hiện việc chồng chéo địa chỉ MAC mà không gặp lỗi, vì các VNI là độc lập VNI được tích hợp trong header cùng với địa chỉ MAC bên trong.
Hình 3.3 Cấu trúc VXLAM header
Trong phần tiêu đề VxLAN, có 8 bytes (khoảng 64 bits), trong đó bit thứ 5 được sử dụng để đánh dấu giá trị của VNI Frame Từ bit 32 đến bit 56, 24 bits sẽ được cấp cho VNI, cho phép tạo ra 16 triệu địa chỉ VxLAN khác nhau, trong khi các bits còn lại được dành để dự trữ.
3.3.1.3 Encapsulation và VTEP Đây là 2 khái niệm cơ bản của VxLAN:
- VTEP : Đầu cuối trong Tunneling
- Encapsulation : Thực hiện đóng gói gói tin Ethernet thông thường trong một Header mới
Each host participating in a VxLAN is considered a Virtual Tunnel Endpoint (VTEP) These nodes are responsible for the encapsulation and de-encapsulation of data, allowing them to read and package messages within a new header.
VxLAN học các địa chỉ MAC của các VM trên Server, cho phép kết nối tới các VM thông qua VTEP với sự hỗ trợ của mạng vật lý qua giao thức IP multicast Nhờ vào việc đóng gói này, VTEP có khả năng tạo ra một lớp L2 trên L3 (Overlay).
Hình 3.4 Truyền tải trong VxLAN
Chú ý: VTEP có thể được thực hiện bởi phần mềm hoặc phần cứng Có thể nằm trên Switch hoặc Server
- Tính di động cao do được triển khai trên nền mạng IP có sẵn
- Hỗ trợ được nhiều trường hợp cụ thể do có thể hoạt động tại cả L2 và L3
- Tăng số lượng mạng VLAN khả dụng ( lên tới 16 triệu VLAN khác nhau )
Nhờ sử dụng giao thức IP, có thể tạo ra nhiều lộ trình khác nhau để đến đích, điều này trái ngược với VLAN thông thường, nơi mà giao thức STP (Spanning Tree Protocol) giới hạn khả năng này.
3.3.2 Các bước hoạt động của VxLAN
Xét mô hình dưới đây:
Hình 3.5 Mô hình hoạt động của VxLAN
- Tại Host 1 : Có chứa 1 VM có địa chỉ L2 là MAC1 và VTEP IP của Server này là 10.20.10.10
- Tại Host 4 : Có chứa 1 VM có địa chỉ L2 là MAC2 và VTEP IP của Server này là 10.20.10.13
- Tại Host 2 và 3 : Không chứa VM và có địa chỉ thuộc dải mạng 10.20.10.0/12
- Các lưu lượng mạng được chuyển qua 1 mạng chung
3.3.2.1 Các Virtual Machine thực hiện tham gia vào nhóm Multicast
Thực hiện xét tại VM1 và VM2, quá trình tham gia vào Group Multicast của VM 1 được diễn ra như sau:
- VM 1 được kết nối tới 1 mạng Layer 2 trong đó có VxLAN ( VNI 5001 )
- VM 1 sẽ gửi 1 bản tin IGMP ( Internet Group Management Protocol ) để thực hiện yêu cầu tham gia vào nhóm IP Multicast
- Các thủ tục tương tự được diễn ra tại VM2 Tuy nhiên ở đây cần chú ý, các Host
Host 2 và Host 3 sẽ không gửi yêu cầu kết nối tới VxLAN 5001 vì không có VM nào trên các Host này cần sử dụng VxLAN 5001 Nếu trong tương lai vẫn không có VM cần kết nối, thì hai Host này cũng sẽ không nhận được các Frame Broadcast từ VxLAN.
Sau khi tham gia vào Group IP Multicast với địa chỉ 239.1.1.100, giả sử tại VM1 sẽ phát sinh một Frame Broadcast với các thông số cụ thể.
- SA ( Source Addr ) : là địa chỉ của VTEP IP tại Host 1 ( VTEP1)
- DA ( Destination Addr ) : Địa chỉ đích là địa chỉ của nhóm IP Multicast
Tại VM2, sau khi nhận được Frame Broadcast, hệ thống sẽ so sánh các bit VNI để xác định xem có trùng với VxLAN đang hoạt động hay không Nếu có sự trùng lặp, VM2 sẽ thực hiện De-Encapsulation gói tin và chuyển tiếp đến VM2.
Trên mỗi Host tham gia vào VxLAN thì đều tồn tại 1 Forwarding Table có dạng:
Xét trường hợp VM1 tại Host1 muốn gửi 1 bản tin ARP Request tới Host 2
Hình 3.9 Gửi bản tin ARP Request
Initially, at VM1, an ARP Request message will be sent with the following parameters: the Destination Address (DA) is set to the Broadcast address FF:FF:FF:FF:FF:FF, while the Source Address (SA) corresponds to the MAC address of VTEP1.
At VTEP1, encapsulation is performed, and a message is sent containing the following parameters: the Destination MAC Address (Multi MAC) and the Source MAC Address (the address of VTEP1).
→ Tại lớp L2 bình thường: o DA ( Destination Addr ) : Địa chỉ MAC đích ở đây là Broadcast o SA ( Source Addr ) : Địa chỉ MAC nguồn là địa chỉ MAC1
→ Tại lớp L2 Overlay trên L3 o VxLAN : VNI của VxLAN mà 2 VM đang hoạt động
- Tại VTEP2, nếu nó kiểm tra VNI mà phù hợp thì sẽ thực hiện chuyển tiếp cho VM2 Sau đó sẽ cập nhật Forwading Table
Sau đó, tại VM2 sẽ gửi bản tin trả lời ARP Request của VM 1:
Hình 3.10 Phản hồi bản tin ARP Request
Các thông số trong bản tin này
- DA MAC ( Destination MAC Addr ) : Địa chỉ MAC đích là VTEP1
- SA MAC ( Source MAC Addr ) : Địa chỉ MAC nguồn là địa chỉ của VTEP1
- DA ( Destination Addr ) : Địa chỉ MAC đích ở đây là MAC1
- SA ( Source Addr ) : Địa chỉ MAC nguồn là địa chỉ của MAC2
- VxLAN : VNI của VxLAN mà 2 VM đang hoạt động
Cuối cùng, tại VM1 cũng sẽ xây dựng được Forwarding Tabel sau khi VTEP thực hiệnDe-Encapsulation và chuyển cho VM1 :
Hình 3.11 Xây dựng Forwarding table
Bài Lab thực hiện kết hợp ứng dụng và lý thuyết về VxLAN và OpenvSwitch dựa trên nền kiến thức ảo hóa QEMU/KVM.
Yêu cầu ứng viên bao gồm kiến thức vững về QEMU/KVM và khả năng quản lý mạng hiệu quả bằng công cụ virsh Ứng viên cần nắm vững OVS, bao gồm việc cài đặt các gói phần mềm liên quan và thực hiện thành thạo các thao tác cơ bản với ovs-vsctl Cuối cùng, ứng viên phải hiểu rõ cách hoạt động của VxLAN để có thể áp dụng trong thực tiễn.
Để tạo một máy ảo trên mỗi Server, cần sử dụng 2 Server với hệ điều hành Ubuntu Server 20.04 Trên cả hai Server, đã tiến hành cài đặt các gói phần mềm liên quan đến Open vSwitch (OvS).
- Server 1 có địa chỉ các dải mạng o ens33 : 192.168.150.144 ( Được sử dụng để SSH tới Server ) o ens38 : 192.168.98.138 ( Private Host Network ) o ens39 : 192.168.26.129 ( Private Host Network )
- Server 2 có địa chỉ các dải mạng o ens33 : 192.168.150.147 ( Được sử dụng để SSH tới Server ) o ens38 : 192.168.98.146 ( Private Host Network ) o ens39 : 192.168.26.128 ( Private Host Network )
- VM sử dụng trên Ubuntu Server 1 có tên debian ( Sử dụng OS Debian10)
- VM sử dụng trên Ubuntu Server 2 có tên centos ( Sử dụng OS Centos7)
Mục đích: Sau khi thực hiện các thiết lập thông số, chúng ta có thể thực hiện ping từ VM1 sang VM2.
Thực hiện tạo GRE qua Open vSwitch
3.4.1 Lý thuyến tổng quan về GRE
Generic Routing Encapsulation (GRE) is a tunneling protocol that facilitates communication between nodes within a comprehensive network system It enables connections between nodes in both public and private networks, allowing for direct packet forwarding to the intended destination.
GRE sẽ thực hiện đóng gói gói tin và thêm vào 1 GRE Header có độ dài khoảng 24 bytes ( Trong đó có thể thêm 16 bytes tùy chọn )
GRE cung cấp cho ngưởi sử dụng 1 số các ưu điểm sau :
- GRE sử dụng ít tài nguyên hơn các kĩ thuật Tunnel khác
- Cho phép kết nối các mạng bị giới hạn số Hop
- Kết nối các mạng con gián tiếp
- Cho phép đóng gói đa dạng các loại bản tin
Các giai đoạn đóng gói và bóc tách gói tin được diễn ra như sau :
- Switch có vai trò như một Tunnel Source Router, thực hiện chuyển gói tin ra Tunnel Interface
- Tunnel Interface tiến hành đóng gói, tiến hành thêm một Outer IP Header mới cho gói tin
- Gói tin được chuyển tiếp tới địa chỉ IP mới ( là địa chỉ IP trong Outer IP Header mới )
Với De-Encapsulation ( bóc tách ) :
- Tại Tunnel Interface ở bên đối diện, sau khi nhận được gói tin sẽ tiên hành loại bỏ Outer IP Header và GRE Header
- Gói tin được chuyển tới địa chỉ đích cuối cùng
GRE sẽ thêm 20 bytes địa chỉ IP mới (Outer IP Header) và 5 bytes GRE Header, như đã trình bày ở trên.
- Checksum : Trường kiểm tra lỗi
- Offset : Trường thể hiện thứ tự trong phân mảnh ( Fragment )
- Key : Trường mã hóa GRE ( được kích hoạt nếu đặt là 1 )
- Sequence Number : Thứ tự của bản tin
- Routing : Thực hiện liệt kê Source Route Entries.
3.4.3.1 Point-to-point GRE Đối với mỗi Point to Point GRE thì số lượng địa chỉ cần cung cấp sẽ là khá nhiều Do việc cung cấp địa chỉ IP phải diễn ra ở cả 2 chiều Ví dụ :
Hình 3.15 Point-to-point GRE
Tại R2 và R3, mỗi Node cần cấu hình địa chỉ IP cho Tunnel kết nối tới R1 Đồng thời, R1 cũng phải thiết lập đường Tunnel ngược lại với R2 và R3, điều này dẫn đến sự phức tạp tại R1 khi mạng mở rộng.
3.4.3.2 mGRE (Point to Multipoint GRE) Được ra đời để khắc phục nhược điểm của P2P GRE đó là không có khả năng hoạt động khi bên đầu bên kia là một địa chỉ Multicast Giao thức NHRP ( Next Hop Resolution Protocol ) được sử dụng để chuyển đổi địa chỉ Tunnel sang địa chỉ vật lý
Bài LAB thực hiện ứng dụng lý thuyết về Generic Routing Encapsulation
- Yêu cầu: o Kiến thức về OVS o Kiến thức về QEMU/KVM:
- Tham khảo tại : o 2 Server để thực hiện host 2 VM ( Trong bài sử dụng Ubuntu Server 20.04 ) o 2 VM có OS là Centos 7
Hình 3.17 Mô hình lab GRE
- Các bước thực hiện: o 1 Cấu hình tại Server 1 o 2 Cấu hình tại Server 2 o 3 Tạo Network tại 2 Server o 4 Kiểm tra việc Pinh giữa hai VM và xem bản tin tại WireShark
Bước 1: Cấu hình tại Server 1 Đầu tiên chúng ta cần tạo 1 Bridge ovs0 : root@ubun-server:/# ovs-vsctl add-br ovs0
Thông qua câu lệnh ovs-vsctl thì chúng ta đã khởi tạo ( add-br ) có tên là ovs0
After completing the previous steps, we will add the VM ports to the existing bridge By default, VMs are connected to the Linux Bridge virbr0, so we need to remove them if they are part of virbr0 (if your VM is not connected to virbr0, you can skip this step) Use the command `brctl show` to display the bridge information and then execute `brctl delif virbr0 vnet0` to remove the interface Finally, verify the changes by running `brctl show` again to ensure the interface has been successfully removed.
Next, we will add the VM ports and GRE port to the ovs0 bridge using the following commands: `ovs-vsctl add-port ovs0 vnet0`, `ovs-vsctl add-port ovs0 vnet1`, and `ovs-vsctl add-port ovs0 gre0 set interface gre0 type=gre options:remote_ip=2.168.26.128`.
Địa chỉ IP 192.168.26.128 thuộc về Server 2, và gre0 là tên Port GRE được khởi tạo Lưu ý rằng chúng ta sẽ không thêm Port ens39 vào các Bridge tại các Server.
Bước 2: Cấu hình tại Server 2 Đầu tiên chúng ta cần tạo 1 Bridge ovs0 : root@ubun-server-2:/# ovs-vsctl add-br ovs0
Thông qua câu lệnh ovs-vsctl thì chúng ta đã khởi tạo ( add-br ) có tên là ovs0
After completing the previous steps, we will add the VM ports to the existing bridge By default, VMs are associated with the Linux Bridge virbr0, so we need to remove them (if your VM is not part of virbr0, you can skip this step) and then add the ports First, check the bridge configuration with `brctl show`, then remove the VM interface from virbr0 using `brctl delif virbr0 vnet0` After confirming the removal, add the ports to the new bridge using `ovs-vsctl add-port ovs0 vnet0`, `ovs-vsctl add-port ovs0 vnet1`, and for GRE tunneling, use `ovs-vsctl add-port ovs0 gre0 set interface gre0 type=gre options:remote_ip=2.168.26.129`.
Địa chỉ IP 192.168.26.129 được sử dụng cho Server 1, trong khi gre0 là tên Port GRE mà chúng ta đã khởi tạo Lưu ý rằng chúng ta sẽ không thêm Port ens39 vào các Bridge trên các Server.
Bước 3: Tạo Network tại 2 Server
Để kết nối hai máy ảo (VM) với nhau, bước đầu tiên là khởi tạo một mạng (Network) Chúng ta cần tạo một tệp tin ovs.xml tại đường dẫn /etc/libvirt/qemu/networks/ với nội dung được chỉ định.
- Trong đó: o ovs : Tên Network ta sẽ khởi tạo o ovs0 : Tên của Bridge ta đã tạo trước đó
After obtaining the XML file, we will use the virsh command to define the network by executing `virsh net-define ovs.xml` Next, we start the network with `virsh net-start ovs`, enable it to autostart with `virsh net-autostart ovs`, and finally, we can list all networks using `virsh net-list all`.
- default active yes yes ovs active yes yes
Để khởi tạo một Network từ file XML, ta thực hiện câu lệnh đầu tiên Sau đó, câu lệnh thứ hai sẽ khởi động Network Tiếp theo, câu lệnh thứ ba chuyển chế độ của Network sang tự khởi động mỗi khi máy khởi động Cuối cùng, câu lệnh thứ tư kiểm tra việc khởi tạo Network đã thành công hay chưa.
Công việc này được lặp lại tại Server 1.
Bước 4: Kiểm tra việc Ping giữa 4 VM và xem bản tin tại Wireshark
Thực hiện truy cập vào 4 VM đặt địa chỉ IP tĩnh
[root@localhost ~]# ip a a 192.168.26.219/24 dev eth0
[root@localhost ~]# ip a a 192.168.26.220/24 dev eth0
Tại VM-2 root@debian:~# ip a f ens2 root@debian:~# ip a a 192.168.26.211/24 dev ens2
Tại VM-4 root@debian:~# ip a f ens2 root@debian:~# ip a a 192.168.26.210/24 dev ens2
Sau đó tại VM-3 sẽ ping VM-1
64 bytes from 192.168.26.219: icmp_seq=1 ttld time=3.04 ms
64 bytes from 192.168.26.219: icmp_seq=2 ttld time=0.896 ms
64 bytes from 192.168.26.219: icmp_seq=3 ttld time=1.36 ms
3 packets transmitted, 3 received, 0% packet loss, time 2006ms rtt min/avg/max/mdev = 0.896/1.767/3.041/0.921 ms
→ Việc Ping thành công với 3/3 gói tin thành công
Và tương tự VM-2 sẽ ping VM-4 root@debian:~# ping 192.168.26.210
64 bytes from 192.168.26.210: icmp_seq=1 ttld time=3.63 ms
64 bytes from 192.168.26.210: icmp_seq=2 ttld time=1.16 ms
64 bytes from 192.168.26.210: icmp_seq=3 ttld time=3.19 ms
3 packets transmitted, 3 received, 0% packet loss, time 8ms rtt min/avg/max/mdev = 1.155/2.657/3.631/1.077 ms
Để xác định xem hai máy ảo (VM) có sử dụng giao thức GRE hay không, chúng ta sẽ sử dụng phần mềm WireShark để bắt gói tin, với kết quả ping thành công 3/3 gói tin.
Hình 3.18 Bắt gói tin giữa hai VM (1)
Hình 3.19 Bắt gói tin giữa hai VM (2)
→ Và tương tự trong trường hợp thứ hai ( VM2 ping VM4) đã có thêm tiêu đề GRE trong bản tin
Sự xuất hiện của GRE Header và Outer IP Header trong cả hai trường hợp cho thấy rằng các bản tin của chúng ta đã sử dụng GRE Tunnel.
Linux Network Namespace
3.5.1 Giới thiệu về Linux Network Namespace
Linux Network Namespace là một khái niệm quan trọng cho phép cô lập các mạng trong môi trường chỉ có một Kernel Nó giúp tách biệt các thành phần mạng như giao diện, cổng và địa chỉ IP Mỗi Namespace còn có cơ chế NAT và bảng Iptables riêng biệt, đảm bảo tính độc lập cho từng không gian mạng.
Khái niệm này thường được áp dụng trong các dự án như Openstack, Mininet và Docker Theo mặc định, khi người dùng truy cập vào hệ thống, họ sẽ được đưa vào Root Network Namespace.
3.5.2 Các câu lệnh cơ bản đối với Linux Network Namespace
Việc thêm 1 Network Namespace mới được thực hiện qua câu lệnh sau ip netns add
Trong đó, name là tên Network Namespace bạn muốn tạo
Việc xóa 1 Network Namespace được thực hiện qua câu lệnh sau ip netns delete
Trong đó name là tên Network Namespace bạn muốn xóa
3.5.2.3 Liệt kê các Network Namespace trên hệ thống Được thực hiện qua câu lệnh dưới ip netns show
3.5.2.4 Chạy một câu lệnh trong Network Namespace cụ thể ip netns exec
Trong đó name là tên Network Namespace bạn muốn thực hiện lệnh còn command là lệnh bạn muốn thực thi
3.5.2.5 Gán 1 Interface cụ thể vào Network Namespace Để có thể gán 1 Interface vào 1 Network Namespace ta sẽ sử dụng câu lệnh sau ip link set netns
Trong đó interface_name là tên Interface bạn muốn thêm vào name ( là Network Namespace bạn muốn thêm )
3.5.3 Thực hiện kết nối 2 Namespace thông qua Virtual Ethernet
Để thực hiện yêu cầu, cần một hệ thống sử dụng hệ điều hành Linux, cụ thể là Ubuntu Server 20.04 Trên hệ thống này, OpenvSwitch phải được cài đặt và người dùng cần nắm vững các thao tác cơ bản với OVS Ngoài ra, cần có kiến thức lý thuyết cơ bản về Linux Namespace và các thao tác cơ bản liên quan.
Hình 3.20 Mô hình bài lab kết nối Namespace thông qua Virtual Ethenet
To set up Linux Network Namespaces, we will create two namespaces named ns1 and ns2 This can be done by executing the following commands in the terminal: `ip netns add ns1` and `ip netns add ns2` To verify the creation of the namespaces, use the command `ip netns show`, which will display both ns1 and ns2.
Bằng cách sử dụng câu lệnh "ip netns" và tùy chọn "add", chúng ta đã tạo thành công hai Linux Network Namespace mới là ns1 và ns2 Cuối cùng, khi kiểm tra, chúng ta xác nhận rằng hai Linux Network Namespace vừa được thiết lập đã xuất hiện.
Bước 2: Thêm đường liên kết Virtual Ethernet và gán các Interface vào Linux Namespace tương ứng
Virtual Ethernet (VETH) là một kỹ thuật đặc biệt, tương tự như một Tunnel, cho phép truyền dữ liệu từ một đầu và chuyển tiếp đến đầu còn lại của Tunnel.
To create two virtual Ethernet (VETH) pairs, use the following commands in the terminal: `ip link add veth0 type veth peer name eth0-ns1` and `ip link add veth1 type veth peer name eth0-ns2` To verify the creation of these VETH pairs, execute `ip link show | grep veth` to display the results.
15: eth0-ns1@veth0: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
16: veth0@eth0-ns1: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
17: eth0-ns2@veth1: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
18: veth1@eth0-ns2: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
Tại 2 câu lệnh đầu ta sử dụng lệnh ip link add để tạo ra 2 VETH là veth0 và veth1 trong đó có chỉ định loại interface là veth và tại mỗi interface ta chỉ định peer name phù hợp. Tại câu lệnh cuối, ta thấy các sự thay đổi của ta đã thành công.
The next step is to add the corresponding interfaces to the Linux namespaces This can be done using the following commands: `ip link set eth0-ns1 netns ns1` and `ip link set eth0-ns2 netns ns2` To view the network settings of the first namespace, execute the command `ip netns exec ns1 ip a s`.
1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
15: eth0-ns1@if16: mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether b6:82:9e:dd:2c:83 brd ff:ff:ff:ff:ff:ff link-netnsid 0 root@ubun-server:~# ip netns exec ns2 ip a s
1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
17: eth0-ns2@if18: mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 4a:26:f8:41:e8:ca brd ff:ff:ff:ff:ff:ff link-netnsid 0
Với câu lệnh 1 và 2, chúng ta đã gán các Interface tương ứng với các Linux Namespace là ns1 và ns2 Tiếp theo, việc kiểm tra được thực hiện qua câu lệnh 3.
Bước 3: Tạo OVS Bridge và thêm veth0 và veth1 vào ovs0
To create an Open vSwitch (OvS) bridge and add ports, use the following commands: first, create the bridge with `ovs-vsctl add-br ovs0`, then add the ports using `ovs-vsctl add-port ovs0 veth0` and `ovs-vsctl add-port ovs0 veth1` Finally, you can verify the configuration by executing `ovs-vsctl show`.
399eb6fe-51d2-4bca-ade7-e1fa41e5c7f9
Interface ovs0 type: internal ovs_version: "2.13.1" root@ubun-server:~# ip link set veth1 up root@ubun-server:~# ip link set veth0 up
Bằng cách thực hiện câu lệnh 1, chúng ta đã tạo ra một Bridge có tên là ovs0 Tiếp theo, chúng ta thêm các Port, là các đầu còn lại của VETH, vào Bridge OvS này Cuối cùng, chúng ta chuyển trạng thái hoạt động của hai Interface này sang chế độ UP.
Bước 4: Truy cập 2 Linux Namespace và thực hiện Ping
Access the Linux namespaces created in step 1 and assign IP addresses to the interfaces within these namespaces For the namespace ns1, use the command `ip netns exec ns1 bash` followed by `ip a s` to display the assigned IP addresses.
1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
15: eth0-ns1@if16: mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether b6:82:9e:dd:2c:83 brd ff:ff:ff:ff:ff:ff link-netnsid 0 root@ubun-server:~# ip add a 10.0.0.1/24 dev eth0-ns1 root@ubun-server:~# ip link set eth0-ns1 up
Kết luận chương 3
Chương 3 đã mô tả chi tiết các bước thực hiện mô phỏng một số tính năng củaOpen vSwitch, các switch được cài đặt tính năng và hoạt động đúng như lý thuyết.