So sánh các phương pháp tiếp cận: systemd-networkd vs. ifupdown vs. Netplan
Cấu hình mạng trên Linux từ lâu đã bị phân mảnh. Các bản phân phối khác nhau liên tục đưa ra những công cụ cạnh tranh để giải quyết cùng một nhóm tác vụ cơ bản: gán địa chỉ IP, thiết lập bảng định tuyến và cấu hình các giao diện mạng ảo (virtual interface).
Môi trường Debian trước đây phụ thuộc vào ifupdown thông qua /etc/network/interfaces. Dù trực quan, công cụ này lại dựa dẫm quá nhiều vào shell script. Do đó, nó gặp khó khăn khi xử lý các NIC cắm nóng (hotplug), các thay đổi trạng thái liên kết động cũng như việc sắp xếp thứ tự khởi động dịch vụ gốc của systemd.
Canonical đã phát triển Netplan cho Ubuntu nhằm chuẩn hóa cấu hình dưới dạng các file YAML rõ ràng trong /etc/netplan/. Tuy nhiên, Netplan thực chất chỉ là một trình tạo cấu hình (generator), không phải là một network daemon. Khi xảy ra sự cố, bạn vừa phải debug lỗi thụt lề YAML, vừa phải lần mò các file backend được sinh ra trong /run/systemd/network/.
NetworkManager vẫn là lựa chọn tiêu chuẩn cho máy trạm (workstation) và laptop. Nó xử lý mượt mà việc chuyển vùng Wi-Fi, modem băng thông rộng di động và VPN. Tuy nhiên, trên các server không giao diện (headless) và container tối giản, D-Bus daemon cùng mức chiếm dụng bộ nhớ ~30 MB của nó trở thành gánh nặng không cần thiết.
systemd-networkd loại bỏ hoàn toàn các lớp trung gian này. Nằm trực tiếp bên trong cây systemd, nó sử dụng các unit file mang tính khai báo .netdev và .network trong /etc/systemd/network/. Nó điều khiển trực tiếp subsystem rtnetlink của Linux kernel—không cần wrapper, không cần trình phân tích cú pháp YAML trung gian, và chỉ tiêu tốn một lượng RAM cực nhỏ khoảng 4–8 MB.
Ưu và nhược điểm của systemd-networkd
Chuyển thẳng sang systemd-networkd mang lại một hệ thống gọn nhẹ, dễ dự đoán. Tuy vậy, bạn vẫn nên cân nhắc kỹ giữa các thế mạnh và những hạn chế thực tế trong môi trường production.
Ưu điểm
- Không cần cài thêm package: Nếu bản phân phối của bạn khởi động bằng systemd, networkd đã có sẵn trên đĩa. Bạn không cần môi trường runtime Python hay bất kỳ công cụ hỗ trợ bên ngoài nào.
- Thời gian khởi động siêu nhanh: Daemon khởi chạy ngay từ giai đoạn early userspace. Nó cấu hình các giao diện mạng bất đồng bộ theo cơ chế song song, giúp rút ngắn thời gian khởi động hệ thống từ 1,5 đến 3 giây một cách dễ dàng.
- Cú pháp INI nhất quán: Các network unit có định dạng hoàn toàn tương đồng với các unit
.service,.mountvà.timerquen thuộc. - Hỗ trợ thiết bị ảo gốc: Việc thiết lập bridge, trunk VLAN, cặp bonding (LACP) và tunnel WireGuard chỉ mất vài dòng khai báo ngắn gọn.
Nhược điểm
- Quản lý Wi-Fi thủ công: Daemon không tự động đàm phán WPA-PSK hay 802.1X khi cài đặt mặc định. Bạn phải cấu hình kết hợp với
iwdhoặcwpa_supplicant. - Không có giao diện curses tương tác: Không có công cụ tương đương trực tiếp với
nmtuicủa NetworkManager. Bạn phải tự tay chỉnh sửa các file cấu hình văn bản. - Không đồng bộ khay hệ thống trên desktop: Các applet desktop tiêu chuẩn (như GNOME Control Center) dựa vào D-Bus API của NetworkManager để báo cáo trạng thái liên kết mạng.
Kiến trúc khuyến nghị: Bộ ba unit file
Toàn bộ cấu hình mạng cố định được lưu trữ trong /etc/systemd/network/. Daemon sẽ phân tích cú pháp các file theo thứ tự từ điển nghiêm ngặt (ví dụ: 10-eth0.network sẽ được ưu tiên áp dụng trước 99-default.network).
Một kiến trúc dễ bảo trì thường dựa trên ba loại file riêng biệt:
.link: Khớp nối với các thuộc tính phần cứng vật lý để điều chỉnh địa chỉ MAC, tên giao diện và MTU trước khi giao diện mạng được kích hoạt..netdev: Tạo các thiết bị mạng ảo như bridge phần mềm (br0), VLAN (vlan20) và các cặp bonding..network: Định nghĩa các tham số định tuyến Layer 3, địa chỉ IP tĩnh, cấp phát DHCP và DNS resolver.
Các bước triển khai chi tiết
Các bước dưới đây sẽ hướng dẫn bạn chuyển đổi một giao diện mạng sang systemd-networkd, thiết lập IP tĩnh và IP động, cũng như xây dựng các giao diện VLAN và bridge cho môi trường production.
Bước 1: Kiểm tra các giao diện mạng hiện có
Bắt đầu bằng việc kiểm tra tên các giao diện mạng đang hoạt động, địa chỉ MAC và IP đã được cấp phát:
ip -brief link show
ip -brief address show
Trong hướng dẫn này, card mạng vật lý 10GbE chính của chúng ta là ens18.
Lưu ý quan trọng đối với server từ xa: chỉ cần một subnet mask sai định dạng hoặc default gateway hỏng sẽ làm đứt phiên SSH của bạn ngay lập tức. Hãy luôn mở console out-of-band (chẳng hạn như Proxmox NoVNC, Hetzner Robot vKVM, hoặc AWS Serial Console) trước khi chỉnh sửa trực tiếp các network unit đang chạy.
Bước 2: Tắt các daemon gây xung đột
Hai daemon cùng quản lý một card mạng vật lý sẽ gây ra hiện tượng xung đột tuyến đường (route flapping). Nếu NetworkManager đang chạy, hãy dừng và mask nó:
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager
sudo systemctl mask NetworkManager
Nếu bạn đang dùng Ubuntu, hãy vô hiệu hóa tính năng tự động tạo cấu hình của Netplan bằng cách xóa các file cấu hình trong /etc/netplan/*.yaml hoặc đặt renderer thành networkd.
Tiếp theo, hãy kích hoạt và khởi chạy systemd-networkd cùng với systemd-resolved để phân giải tên miền (DNS lookup):
sudo systemctl enable --now systemd-networkd
sudo systemctl enable --now systemd-resolved
Bước 3: Cấu hình IP động (DHCP)
Để giao diện mạng tự động nhận địa chỉ qua DHCPv4 và IPv6 SLAAC/DHCPv6, hãy tạo một network unit:
sudo nano /etc/systemd/network/10-ens18-dhcp.network
Thêm cấu hình sau:
[Match]
Name=ens18
[Network]
DHCP=yes
[DHCPv4]
RouteMetric=100
UseDNS=true
Tải lại profile mới ngay lập tức:
sudo networkctl reload
sudo networkctl reconfigure ens18
Bước 4: Cấu hình IPv4 tĩnh và DNS
Các server production chạy cơ sở dữ liệu hoặc web host luôn yêu cầu địa chỉ IP tĩnh, cố định. Nếu trước đó bạn đã tạo profile DHCP, hãy xóa hoặc đổi tên để tránh xung đột:
sudo rm -f /etc/systemd/network/10-ens18-dhcp.network
sudo nano /etc/systemd/network/10-ens18-static.network
Nhập thông tin IP tĩnh, default route và cấu hình DNS của bạn:
[Match]
Name=ens18
[Network]
Address=192.168.1.50/24
DNS=1.1.1.1 8.8.8.8
Domains=internal.lab
[Route]
Gateway=192.168.1.1
Metric=100
Áp dụng thay đổi và kiểm tra trạng thái liên kết:
sudo networkctl reload
sudo networkctl reconfigure ens18
networkctl status ens18
Bước 5: Cấu hình VLAN Tag 802.1Q
Để truyền tải (trunk) nhiều phân đoạn mạng cô lập qua một sợi cáp vật lý duy nhất, bạn cần hai thành phần: một unit .netdev để khởi tạo sub-interface ảo, và một unit .network để gán VLAN tag đó vào card mạng vật lý.
Đầu tiên, tạo VLAN 20:
sudo nano /etc/systemd/network/20-vlan20.netdev
[NetDev]
Name=ens18.20
Kind=vlan
[VLAN]
Id=20
Thứ hai, cấu hình giao diện mạng gốc ens18 để nó chuyển tải VLAN 20. Cập nhật file /etc/systemd/network/10-ens18-static.network:
[Match]
Name=ens18
[Network]
Address=192.168.1.50/24
DNS=1.1.1.1
VLAN=ens18.20
[Route]
Gateway=192.168.1.1
Metric=100
Thứ ba, gán địa chỉ IP cho giao diện ảo ens18.20 vừa tạo:
sudo nano /etc/systemd/network/20-vlan20.network
[Match]
Name=ens18.20
[Network]
Address=10.20.0.5/24
Tải lại systemd-networkd để tạo thiết bị ảo và gán địa chỉ IP:
sudo networkctl reload
sudo networkctl reconfigure ens18
ip -brief address show ens18.20
Bước 6: Tạo Bridge mạng bằng phần mềm
Khi triển khai máy ảo KVM hoặc container LXC, bạn cần một bridge phần mềm (br0) để các máy khách (guest) có thể giao tiếp trực tiếp trên cùng phân đoạn LAN vật lý của máy chủ (host).
Quan trọng: Trong mô hình mạng bridge, card mạng vật lý chỉ đóng vai trò như một đường truyền thuần túy (Layer 2). Địa chỉ IP, gateway và DNS bắt buộc phải gắn trực tiếp vào chính thiết bị bridge, tuyệt đối không gắn vào card mạng vật lý.
Đầu tiên, tạo thiết bị bridge br0:
sudo nano /etc/systemd/network/05-br0.netdev
[NetDev]
Name=br0
Kind=bridge
Thứ hai, gán ens18 làm cổng thành viên của br0. Thay thế file 10-ens18-static.network hiện có:
sudo nano /etc/systemd/network/10-ens18-member.network
[Match]
Name=ens18
[Network]
Bridge=br0
Thứ ba, thiết lập các thông số IP tĩnh trực tiếp trên giao diện bridge:
sudo nano /etc/systemd/network/20-br0.network
[Match]
Name=br0
[Network]
Address=192.168.1.50/24
DNS=1.1.1.1 8.8.8.8
[Route]
Gateway=192.168.1.1
Metric=100
Xóa bỏ các profile tĩnh dư thừa trên ens18 để tránh xung đột quy tắc định tuyến, sau đó áp dụng lại cấu hình:
sudo rm -f /etc/systemd/network/10-ens18-static.network
sudo networkctl reload
sudo systemctl restart systemd-networkd
networkctl status br0
Bước 7: Các lệnh vận hành thường dùng
Công cụ dòng lệnh đi kèm networkctl giúp bạn dễ dàng theo dõi và kiểm tra trạng thái mạng hàng ngày:
networkctl list: Hiển thị tổng quan về tất cả các giao diện mạng vật lý và ảo, trạng thái hoạt động (routable, degraded, carrier) và driver tương ứng.networkctl status ens18: Xuất thông tin chi tiết về trạng thái liên kết, giá trị MTU, hợp đồng thuê DHCP đang hoạt động và danh sách DNS server.networkctl reload: Phân tích lại các file.networkvà.netdevđã thay đổi trên đĩa mà không làm gián đoạn các kết nối hiện có.networkctl reconfigure ens18: Buộc một giao diện mạng cụ thể ngắt và áp dụng lại profile cấu hình hiện tại của nó.networkctl lldp: Kiểm tra các gói tin LLDP (Link Layer Discovery Protocol) để xem thông tin cổng switch upstream trực tiếp từ dòng lệnh.
Làm chủ các cấu hình unit cơ bản này giúp bạn kiểm soát toàn diện network stack trên Linux—mà không cần đến các wrapper script hay các service nền không cần thiết gây vướng víu.
