Bối cảnh & Vì sao bạn nên đổi cách làm
Nếu từng quản trị Linux, ắt hẳn bạn đã nếm trải cảm giác gõ cả chục dòng lệnh nmcli dài lê thê. Hoặc tệ hơn là ngồi lục lọi, sửa tay từng tệp keyfile trong /etc/NetworkManager/system-connections/. Mình chạy Fedora Server cho lab cá nhân và cụm máy ảo KVM hơn 2 năm nay. Mỗi lần dựng lại cụm 3-4 node, việc cấu hình card mạng vật lý rồi gom bridge ngốn của mình không dưới 30 phút, lại rất dễ gõ nhầm IP.
Cấu hình mạng thủ công thuộc trường phái mệnh lệnh (Imperative). Nó giống hệt việc bạn vào quán cà phê và phải đứng dặn nhân viên: "Lấy cốc, đong 30ml sữa đặc, rót cà phê, xúc đá, lắc 5 lần".
Chỉ cần nhân viên quên một bước hoặc quán hết đá giữa chừng, quy trình gãy ngay lập tức. Trên máy chủ cũng vậy: một lệnh gán sai gateway hay route xung đột sẽ đá văng phiên SSH của bạn ra ngoài ngay tức khắc. Muốn cứu server lúc đó, bạn chỉ còn cách cắm màn hình console vật lý hoặc mở web VNC của nhà cung cấp VPS.
Nmstate tiếp cận theo hướng khai báo (Declarative). Bạn chỉ cần chốt kết quả mong muốn: "Cho tôi một ly bạc xỉu ít đường". Với hạ tầng mạng, bạn gom mọi thứ vào một tệp YAML: card enp1s0 nhận IP nào, trỏ gateway ra sao, DNS phân giải địa chỉ nào. Nmstate tự đối chiếu trạng thái hiện tại với tệp khai báo, tính toán độ lệch rồi kích hoạt cấu hình mới trong một transaction duy nhất. Có trục trặc phát sinh? Hệ thống tự động rollback sạch sẽ về trạng thái ban đầu.
Cài đặt trên Fedora
Nmstate có sẵn trong kho phần mềm chính thức của Fedora (tương thích hoàn hảo từ Fedora 38 đến 41). Công cụ dòng lệnh đi kèm là nmstatectl.
Cài đặt gói cực kỳ đơn giản với dnf:
sudo dnf install -y nmstate
Kiểm tra phiên bản cài đặt thành công:
nmstatectl --version
# Ví dụ output: nmstatectl 2.2.32
Nmstate không thay thế NetworkManager. Bản chất nó giao tiếp thẳng với daemon NetworkManager qua D-Bus API, nên các dịch vụ mạng nền tảng của hệ điều hành vẫn giữ nguyên vẹn.
Cấu hình chi tiết qua ví dụ thực tế
Ưu điểm lớn của Nmstate: bạn không cần mò mẫm viết cú pháp YAML từ con số không. Hãy xuất cấu hình hiện tại của máy ra làm khung sườn trước.
1. Xuất trạng thái mạng hiện tại
# Xuất toàn bộ cấu hình mạng ra file YAML
nmstatectl show > network-state.yaml
# Hoặc chỉ trích xuất riêng thông tin card mạng chính
nmstatectl show enp1s0
2. Gán IP tĩnh và DNS bằng file YAML
Giả sử card mạng chính của bạn là enp1s0. Bạn cần đặt IP tĩnh 192.168.1.50/24, gateway 192.168.1.1 và dùng DNS Cloudflare kết hợp Google. Hãy tạo tệp static-ip.yaml:
interfaces:
- name: enp1s0
type: ethernet
state: up
ipv4:
enabled: true
address:
- ip: 192.168.1.50
prefix-length: 24
dhcp: false
ipv6:
enabled: false
routes:
config:
- destination: 0.0.0.0/0
next-hop-address: 192.168.1.1
next-hop-interface: enp1s0
dns-resolver:
config:
server:
- 1.1.1.1
- 8.8.8.8
3. Áp dụng cấu hình an toàn với cơ chế Rollback
Thao tác mạng từ xa qua SSH luôn tiềm ẩn rủi ro mất kết nối. Nmstate bảo vệ bạn bằng hai bước kiểm tra quan trọng.
Bước 1: Chạy giả lập để soi lỗi cú pháp
nmstatectl apply static-ip.yaml --dry-run
Nếu cú pháp hợp lệ, terminal sẽ hiển thị luồng diff giữa cấu hình cũ và mới mà không thay đổi bất kỳ byte nào trên card mạng.
Bước 2: Áp dụng kèm cơ chế hẹn giờ hoàn tác (Rollback timeout)
sudo nmstatectl apply static-ip.yaml --rollback-timeout 60
Ngay khi bấm Enter, bộ đếm ngược 60 giây bắt đầu chạy. Bạn mở một terminal mới và ping thử gateway: ping -c 3 192.168.1.1. Nếu mạng thông và phiên SSH vẫn sống khỏe, hãy gõ lệnh xác nhận:
sudo nmstatectl commit
Ngược lại, nếu lỡ tay gõ nhầm gateway khiến SSH văng ra ngoài, bạn chỉ việc kiên nhẫn đợi đúng 60 giây. Nmstate sẽ tự động đảo ngược cấu hình về trạng thái cũ. Mạng thông lại ngay, không cần gọi NOC hỗ trợ.
4. Tạo Linux Bridge cho máy ảo KVM
Khi dựng lab ảo hóa, card cầu nối br0 là thành phần bắt buộc để máy ảo lấy IP trực tiếp từ router nhà mạng. Hãy tạo tệp setup-bridge.yaml:
interfaces:
- name: br0
type: linux-bridge
state: up
ipv4:
enabled: true
dhcp: true
bridge:
port:
- name: enp1s0
- name: enp1s0
type: ethernet
state: up
ipv4:
enabled: false
Áp dụng ngay cấu hình bridge:
sudo nmstatectl apply setup-bridge.yaml --rollback-timeout 60
sudo nmstatectl commit
Chỉ với 15 dòng YAML, Nmstate xử lý trọn gói 2 thao tác phức tạp: đưa card vật lý enp1s0 vào bridge br0, đồng thời tắt IPv4 ở card con và chuyển quyền xin IP DHCP lên interface cầu nối.
Kiểm tra & Vận hành thực tế
Sau khi commit thành công, bạn xác thực lại bằng bộ lệnh quen thuộc:
# Kiểm tra trạng thái bridge vừa tạo
nmstatectl show br0
# Soi bảng định tuyến mặc định
ip route show
# Kiểm tra DNS đang hoạt động qua systemd-resolved
resolvectl status br0
Đưa cấu hình mạng vào quy trình GitOps
Toàn bộ kiến trúc mạng của bạn giờ đây gói gọn trong vài tệp YAML nhỏ vài KB. Bạn có thể đẩy các tệp này lên repository Git nội bộ (GitLab, GitHub).
Mỗi lần cần cập nhật dải IP cho 20 máy chủ, bạn chỉ cần mở một Pull Request, cho đồng nghiệp review diff rồi dùng Ansible phân phối lệnh nmstatectl apply hàng loạt. Lịch sử chỉnh sửa lưu rõ ai đổi IP nào, vào ngày giờ nào qua git log. Bạn hoàn toàn nói lời tạm biệt với những ghi chú dán góc màn hình hay tài liệu Excel cấu hình mạng lỗi thời.

