Netplan trên Ubuntu: Hướng dẫn chuyên sâu về cấu hình mạng với YAML

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Bí ẩn về sự biến mất của /etc/network/interfaces

Với bất kỳ ai từng quản trị Debian hoặc các phiên bản Ubuntu cũ, theo phản xạ, bạn sẽ tìm ngay đến /etc/network/interfaces mỗi khi máy chủ mất kết nối. Bạn kỳ vọng thấy danh sách các cấu hình quen thuộc của eth0 hoặc ens33. Tuy nhiên, trên các phiên bản Ubuntu Server hiện đại như 22.04 hoặc 24.04 LTS, việc mở file đó thường chỉ thấy một màn hình trống hoặc một dòng chú thích yêu cầu bạn tìm ở nơi khác.

Sự thay đổi này ban đầu đã gây ra không ít khó khăn cho các quản trị viên hệ thống. Tôi đã từng triển khai một cụm gồm 20 node web và mất nửa giờ đồng hồ tự hỏi tại sao các chỉnh sửa cấu hình cũ của mình lại biến mất sau mỗi lần khởi động lại. Thực tế là tôi đã bị khóa quyền truy cập vào chính các instance từ xa của mình. Vấn đề không phải là lỗi, mà đó là một cuộc đại tu toàn diện lớp trừu tượng mạng (network abstraction layer) của Linux.

Tại sao Ubuntu chuyển sang sử dụng Netplan

Canonical giới thiệu Netplan để đóng vai trò như một trình biên dịch cấp cao. Thay vì viết các script cấp thấp, phức tạp cho systemd-networkd hoặc NetworkManager, giờ đây bạn định nghĩa mong muốn của mình trong một file YAML duy nhất. Netplan sẽ đọc file này và tạo ra các cấu hình backend cụ thể cho bạn.

Ubuntu Server thường sử dụng systemd-networkd làm renderer mặc định, trong khi các phiên bản Desktop thiên về NetworkManager. Cú pháp thống nhất này rất mạnh mẽ nhưng đòi hỏi sự chính xác tuyệt đối. YAML nổi tiếng là khắt khe với khoảng trắng. Chỉ cần một ký tự tab thay vì hai khoảng trống cũng sẽ khiến toàn bộ ngăn xếp mạng của bạn không thể tải được.

Tìm file cấu hình của bạn

Các định nghĩa mạng của bạn nằm trong /etc/netplan/. Bạn thường sẽ tìm thấy một file có tên như 01-netcfg.yaml hoặc 50-cloud-init.yaml. Các con số cụ thể ở đầu chỉ để xác định thứ tự ưu tiên nếu bạn có nhiều file.

Trước khi chạm vào bất cứ thứ gì, hãy xác định tên logic của phần cứng. Chạy lệnh ip link để xem những gì kernel đang nhận diện và kiểm thử hiệu năng mạng Linux:

ip link show

Hãy tìm các định danh như enp0s3 hoặc ens18. Bạn phải sử dụng chính xác các chuỗi ký tự này trong file YAML của mình, nếu không cấu hình sẽ không thể áp dụng cho phần cứng.

Cấu hình DHCP cơ bản

Nếu máy chủ của bạn nằm trong một lab tiêu chuẩn hoặc một VPC trên cloud, nơi DHCP đảm nhận việc cấp phát, cấu hình của bạn sẽ rất gọn nhẹ. Một thiết lập DHCP tiêu chuẩn trông như thế này:

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: true

Trong cấu trúc phân cấp này, network là gốc và version: 2 là tiêu chuẩn hiện tại. Mỗi cấp độ phải được thụt lề chính xác hai khoảng trắng. Đừng sử dụng tab, nếu không Netplan sẽ báo lỗi cú pháp.

Thiết lập địa chỉ IP tĩnh (Cách hiện đại)

Các máy chủ chạy production hầu như luôn yêu cầu IP tĩnh. Cho dù bạn đang chạy một cụm cơ sở dữ liệu hay một web proxy, việc duy trì IP cố định là rất quan trọng cho định tuyến nội bộ. Tôi đã sử dụng mẫu sau cho hàng trăm lần triển khai production mà không gặp trở ngại nào.

Dưới đây là cấu hình IP tĩnh đã được kiểm chứng cho Ubuntu 22.04 và 24.04:

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      addresses:
        - 10.0.0.50/24
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
      routes:
        - to: default
          via: 10.0.0.1

Các cập nhật cú pháp quan trọng:

  • addresses: Mục này yêu cầu ký hiệu CIDR. Sử dụng /24 cho subnet mask 255.255.255.0 tiêu chuẩn.
  • nameservers: Bạn có thể liệt kê nhiều nhà cung cấp DNS bên trong dấu ngoặc vuông, cách nhau bằng dấu phẩy.
  • routes: Key gateway4 cũ đã chính thức bị loại bỏ. Netplan hiện đại sử dụng khối routes để định nghĩa đường dẫn default tới IP gateway của bạn.

Lệnh “Lưới an toàn”

Áp dụng các thay đổi mạng qua SSH giống như việc bạn tự thực hiện phẫu thuật cho chính mình vậy. Chỉ cần một lỗi đánh máy là bạn sẽ bị mất kết nối với máy chủ, thường đòi hỏi phải đến tận trung tâm dữ liệu hoặc đăng nhập qua console. Netplan giải quyết vấn đề này bằng tính năng “try”.

Luôn chạy lệnh này thay vì áp dụng thay đổi một cách mù quáng:

sudo netplan try

Lệnh này áp dụng cấu hình nhưng bắt đầu đếm ngược 120 giây. Nếu bạn không nhấn Enter để xác nhận, Netplan sẽ coi như bạn đã mất kết nối và tự động khôi phục về cài đặt hoạt động trước đó. Đây là công cụ quan trọng nhất đối với các quản trị viên từ xa.

Khắc phục lỗi thụt lề và logic

Khi netplan apply thất bại, nguyên nhân hầu như luôn là do lỗi định dạng. Vì YAML không hỗ trợ tab, hãy đảm bảo trình soạn thảo văn bản của bạn được cấu hình để chèn khoảng trắng. Nếu bạn thấy lỗi “Invalid YAML”, hãy kiểm tra lại các cột của mình.

Để xem những gì đang diễn ra bên dưới, hãy sử dụng flag debug:

sudo netplan --debug apply

Đầu ra này tiết lộ cách Netplan dịch file YAML của bạn thành các file thực tế nằm trong /run/systemd/network/. Nếu file YAML hợp lệ nhưng IP không hiển thị, nhật ký debug sẽ cho bạn biết liệu daemon backend có đang từ chối các tham số đó hay không.

Xử lý nhiều giao diện mạng

Các máy chủ hiện đại thường chia lưu lượng giữa một cổng internet công cộng và một mạng backend riêng tư, tương tự như khi cấu hình IPv6 trên máy chủ Linux. Netplan quản lý việc này bằng cách thêm các mục phụ dưới key ethernets:

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:
      addresses:
        - 192.168.10.15/24

Trong kịch bản này, enp0s3 nhận IP động để truy cập internet. Trong khi đó, enp0s8 được cố định với một IP riêng tĩnh cho lưu lượng cơ sở dữ liệu nội bộ. Vì enp0s8 không có gateway, hệ thống sẽ định tuyến chính xác tất cả lưu lượng bên ngoài thông qua gateway do DHCP cung cấp trên giao diện đầu tiên.

Tóm tắt

Chuyển sang Netplan có thể cảm thấy giống như một gánh nặng nếu bạn đã quen với cách cũ, nhưng nó mang lại cấu trúc rất cần thiết cho quản trị mạng Linux. Việc coi mạng của bạn như một file YAML mang tính khai báo (declarative) hoàn toàn phù hợp với quy trình làm việc “Cơ sở hạ tầng dưới dạng mã” (Infrastructure as Code) hiện đại. Chỉ cần nhớ giữ khoảng trắng nhất quán và luôn sử dụng netplan try để tránh các sự cố mất kết nối đáng tiếc.

Share: