Hướng dẫn cấu hình Chrony trên Fedora Server: Thiết lập NTP Server đồng bộ thời gian chuẩn xác cho mạng nội bộ

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Khi vận hành một cụm máy chủ, hệ thống database cluster hay đơn giản là dàn máy trạm kế toán trong công ty, chỉ cần một máy lệch vài giây là log bị xáo trộn, chứng chỉ TLS/SSL báo lỗi hết hạn hoặc các giao dịch xác thực Active Directory/Kerberos lập tức lăn đùng ra chết. Thay vì để hàng chục thiết bị cùng kết nối ra ngoài Internet để lấy giờ, việc dựng một máy chủ NTP cục bộ là giải pháp tối ưu băng thông và bảo mật hơn rất nhiều.

Mình dùng Fedora làm máy development chính đã 2 năm và khá hài lòng với tốc độ cập nhật package, ngay cả trên bản Fedora Server thì Chrony luôn được chọn làm dịch vụ NTP mặc định thay thế cho ntpd cũ kỹ nhờ tốc độ đồng bộ cực nhanh và tài nguyên tiêu tốn rất nhẹ.

Quick start: Dựng NTP Server với Chrony trong 5 phút

Nếu bạn cần triển khai ngay cho lab hoặc hệ thống nội bộ, các bước thực hiện rất gọn gàng:

Bước 1: Kiểm tra và kích hoạt chronyd

Fedora Server đã cài sẵn package chrony. Bạn chỉ cần kiểm tra trạng thái dịch vụ:

systemctl status chronyd
# Nếu chưa chạy, bật và cho khởi động cùng hệ điều hành:
sudo systemctl enable --now chronyd

Bước 2: Cho phép mạng LAN đồng bộ thời gian

Mặc định Chrony chỉ chạy như một client lấy giờ từ bên ngoài về cho chính nó. Để biến nó thành NTP Server cho các máy khác, mở file cấu hình:

sudo nano /etc/chrony.conf

Tìm và bỏ comment (hoặc thêm vào cuối file) dải mạng nội bộ của bạn bằng chỉ thị allow:

# Cho phép subnet LAN 192.168.1.0/24 truy vấn giờ
allow 192.168.1.0/24

# Giữ server hoạt động ngay cả khi rớt mạng Internet
local stratum 10

Bước 3: Khởi động lại dịch vụ và mở Firewall

Fedora kích hoạt firewalld theo mặc định. Giao thức NTP chạy trên cổng UDP 123, do đó bạn cần mở cổng:

sudo systemctl restart chronyd
sudo firewall-cmd --add-service=ntp --permanent
sudo firewall-cmd --reload

Bước 4: Kiểm tra nhanh từ máy client

Trên một máy Linux khác trong cùng mạng LAN, cài đặt gói công cụ và thử query tới IP máy Fedora Server (ví dụ IP là 192.168.1.10):

chronyc -h 192.168.1.10 tracking

Nếu thấy thông số Reference ID và Stratum trả về chi tiết, NTP Server của bạn đã sẵn sàng phục vụ.

Giải thích chi tiết file cấu hình chrony.conf

Tệp /etc/chrony.conf trên Fedora có khá nhiều thông số. Dưới đây là các chỉ thị cốt lõi bạn cần nắm vững để tùy biến theo nhu cầu:

1. Nguồn máy chủ upstream (pool/server)

pool 2.fedora.pool.ntp.org iburst
  • pool: Khai báo cụm máy chủ NTP công cộng. Nếu hạ tầng của bạn đặt tại Việt Nam hoặc châu Á, nên đổi sang các pool gần hơn để giảm độ trễ (latency):
server 0.asia.pool.ntp.org iburst
server 1.asia.pool.ntp.org iburst
server time.google.com iburst

Tham số iburst (initial burst) gửi 4 đến 8 gói tin dồn dập ngay khi khởi động để tính toán độ trôi xung nhịp và lấy mốc giờ chính xác chỉ sau vài giây.

2. Tham số makestep

makestep 1.0 3

NTP nguyên bản thường chỉ kéo giãn hoặc nén nhịp đồng hồ từng chút một (slew) để tránh làm nhảy cóc timestamp của database. Tuy nhiên, nếu lệch quá 1 giây, việc nắn giờ từ từ sẽ mất nhiều giờ. Chỉ thị makestep 1.0 3 cho phép Chrony nhảy cóc giờ ngay lập tức nếu độ lệch lớn hơn 1.0 giây trong 3 lần cập nhật đầu tiên sau khi khởi động.

3. Tham số driftfile

driftfile /var/lib/chrony/drift

Chrony sẽ ghi lại tốc độ chạy nhanh hay chậm của thạch anh phần cứng máy chủ vào file này. Nhờ đó, nếu máy khởi động lại hoặc tạm thời mất mạng, Chrony vẫn bù trừ sai số rất sát với thực tế.

Nâng cao: Đảm bảo giờ chuẩn khi đứt cáp Internet và phân cấp Stratum

Thiết lập Local Stratum dự phòng

Khi toàn bộ đường truyền Internet quốc tế gặp sự cố, server không liên lạc được với upstream NTP bên ngoài. Nếu không có cấu hình dự phòng, Chrony sẽ ngừng trả lời các truy vấn từ client, khiến toàn bộ máy trạm nội bộ bị mất mốc tham chiếu.

Khai báo sau sẽ giải quyết vấn đề:

local stratum 10

Dòng này bảo Chrony: “Nếu mất kết nối với các nguồn chuẩn bên ngoài, hãy tự tin dùng đồng hồ phần cứng của chính mình để cấp phát giờ cho mạng LAN với cấp bậc Stratum 10”. Mức Stratum 10 đủ thấp để khi Internet thông suốt trở lại, Chrony sẽ tự động hạ cờ này và chuyển sang nguồn thời gian chuẩn xác hơn (Stratum 1, 2) mà không gây gián đoạn.

Theo dõi và debug hiệu năng với chronyc

Lệnh chronyc là công cụ tương tác dòng lệnh đắc lực. Bạn nên lưu lại 2 lệnh sau để chẩn đoán sự cố:

# Xem danh sách nguồn thời gian và độ trôi
chronyc sources -v

# Xem thống kê chi tiết sai số thời gian
chronyc sourcestats -v

Ý nghĩa các ký hiệu quan trọng trong cột M (Mode) của output chronyc sources:

  • ^*: Nguồn thời gian hiện tại đang được chọn để đồng bộ.
  • ^+: Nguồn dự phòng tốt, sẵn sàng thay thế nếu nguồn chính có vấn đề.
  • ^?: Không thể kết nối hoặc nguồn bị loại trừ do độ lệch quá cao.

Tips thực tế khi vận hành Chrony trong hệ thống nội bộ

Tip 1: Tắt đồng bộ giờ của Hypervisor khi chạy Fedora trong máy ảo

Nếu Fedora Server chạy trên VMware ESXi, Proxmox hoặc KVM, các công cụ như VMware Tools hay QEMU Guest Agent thường xuyên can thiệp đồng bộ giờ với máy chủ vật lý. Điều này dẫn đến hiện tượng “giằng co” (clock fight): Chrony cố nắn giờ theo chuẩn NTP Internet, còn Guest Agent lại cưỡng ép giờ theo Host.

Nên tắt tính năng time sync trong Guest Agent hoặc chỉ giữ một nguồn tham chiếu duy nhất:

# Với VMware Tools chạy trên Linux, tắt đồng bộ giờ:
vmware-toolbox-cmd timesync disable

Tip 2: Cách fix nhanh khi Client không chịu nhận giờ từ Fedora Server

Nếu phía client báo timeout hoặc không thể sync, hãy kiểm tra theo trình tự 3 điểm nghẽn phổ biến:

  1. Chưa nạp rule Firewall: Chạy sudo firewall-cmd --list-services trên Fedora Server xem đã có mục ntp chưa.
  2. Dải IP subnet chưa khai báo: Kiểm tra lại subnet mask trong dòng allow. Nếu mạng của bạn là 10.0.0.0/8 hoặc chia VLAN 192.168.10.0/24, bắt buộc phải khai báo chính xác subnet đó vào /etc/chrony.conf.
  3. SELinux chặn file/port tùy biến: Mặc định Fedora chạy SELinux chế độ Enforcing. Nếu bạn đổi cổng NTP hoặc chuyển thư mục log/drift sang phân vùng khác, cần cập nhật context cho SELinux bằng lệnh semanage fcontext.

Tip 3: Script một dòng kiểm tra độ lệch giờ hàng loạt máy client

Sau khi dựng xong NTP Server, bạn có thể chạy script ngắn qua SSH để rà soát toàn bộ server nội bộ xem đã bám sát giờ của máy chủ Fedora hay chưa:

for ip in 192.168.1.{20..30}; do
  echo "=== Checking $ip ==="
  ssh -o ConnectTimeout=2 user@$ip "chronyc tracking | grep 'System time'"
done

Mức lệch tối ưu giữa các node trong mạng nội bộ chỉ nên dao động dưới 0.0005 giây (nửa mili-giây). Với Chrony trên Fedora, việc đạt được độ chính xác này là điều hoàn toàn trong tầm tay mà không đòi hỏi phần cứng chuyên dụng.

Share: