Cách đồng bộ hóa thời gian trong Linux với NTP Peers

Tác giả sysadmin, T.M.Hai 31, 2022, 02:44:55 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách đồng bộ hóa thời gian trong Linux với NTP Peers


Có nhiều dịch vụ khác nhau chẳng hạn như Kerberos phụ thuộc vào thời gian chính xác của hệ thống Linux để hoạt động chính xác. Do đó, điều quan trọng là phải đảm bảo rằng thời gian của hệ thống được đồng bộ hóa với nguồn bên ngoài để có thể cập nhật chính xác thời gian, điều này được thực hiện với giao thức thời gian mạng (NTP).


Ở đây chúng tôi sẽ giới thiệu cách định cấu hình chronyd hoặc ntpd trong Linux để kết nối với máy chủ NTP và giữ đồng bộ hóa thời gian.Chúng tôi chỉ muốn sử dụng một trong số này tại một thời điểm, tuy nhiên, việc chạy cả hai cùng một lúc không phải là một ý tưởng hay và có thể gây ra xung đột.

Lưu ý: Các ví dụ này dựa trên hệ điều hành CentOS 7 nên các bước có thể khác một chút đối với các bản phân phối Linux khác. Trong phiên bản này, chronyd được cài đặt theo mặc định, tuy nhiên, chúng tôi vẫn sẽ đề cập đến ntpd cũ hơn cho đầy đủ vì điều này vẫn được sử dụng rộng rãi. Ở đây chúng ta quan tâm đến việc cấu hình máy khách NTP hơn là máy chủ NTP.

1. Tổng quan về NTP

Trước khi chúng tôi đi vào chi tiết về cách định cấu hình NTP, đây là một số thông tin cơ bản về cách thức hoạt động của NTP.

1.1. Hiểu về đồng hồ phần cứng và hệ thống

Hệ thống Linux của bạn thường sẽ có hai đồng hồ, đồng hồ phần cứng/đồng hồ thời gian thực (RTC) và đồng hồ hệ thống.

Đồng hồ phần cứng hiện diện trên thực tế và tiếp tục chạy từ nguồn pin ngay cả khi hệ thống không được cắm vào nguồn điện, đây là cách thời gian duy trì tại chỗ khi không có nguồn điện. Khi hệ thống Linux khởi động, nó sẽ đọc thời gian từ đồng hồ phần cứng, thời gian ban đầu này sau đó được chuyển sang đồng hồ hệ thống.

Đồng hồ hệ thống chạy trong kernel và sau khi nhận được thời gian ban đầu từ đồng hồ phần cứng, nó sẽ đồng bộ hóa với máy chủ NTP để cập nhật.

Chúng tôi có thể đồng bộ hóa thủ công đồng hồ phần cứng với đồng hồ hệ thống nếu được yêu cầu, điều này thường chỉ được yêu cầu nếu không có máy chủ NTP.

Mã nguồn [Chọn]
hwclock --hctosys
Chúng tôi cũng có thể đảo ngược quy trình và đồng bộ hóa đồng hồ hệ thống với đồng hồ phần cứng.

Mã nguồn [Chọn]
hwclock --systohc
Trong CentOS 7 theo mặc định, chronyd sẽ cập nhật đồng hồ phần cứng với NTP cứ sau 11 phút, trong các phiên bản HĐH trước, điều này chỉ được thực hiện khi tắt máy/khởi động lại. Cấu hình này được xác định bởi 'rtcsync' trong /etc/chrony.conf

Lệnh hwclock cũng có thể được sử dụng để hiển thị thời gian hiện tại của đồng hồ phần cứng như hình bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# hwclock
Tue 15 Sep 2015 22:24:32 AEST -0.352785 seconds

Lệnh date có thể được sử dụng để xem thời gian hệ thống, tuy nhiên trong CentOS 7, lệnh này thường được thay thế bằng lệnh timedatectl, sẽ được thảo luận sau.

Mã nguồn [Chọn]
[root@centos7 ~]# date
Tue 15 Sep 22:24:42 AEST 2015

1.2. Hiểu địa tầng

Máy chủ NTP hoạt động dựa trên hệ thống phân cấp nhiều lớp được gọi là tầng, bắt đầu từ tầng 0. Tầng 0 là các nguồn thời gian có độ chính xác cao như đồng hồ nguyên tử hoặc đồng hồ GPS, đây là những thiết bị thời gian tham chiếu của chúng tôi. Tầng 1 là các máy tính đồng bộ hóa với các nguồn của tầng 0, đây là những máy chủ NTP có độ chính xác cao. Các máy chủ của tầng 2 sau đó lấy thời gian của chúng từ các máy chủ của tầng 1, trong khi các máy chủ của tầng 3 đồng bộ hóa với các nguồn của tầng 2.

Về cơ bản, tầng n+1 sẽ đồng bộ hóa với tầng n, giới hạn cao nhất là 15, trong khi 16 đề cập đến một thiết bị không được đồng bộ hóa. Có rất nhiều máy chủ tầng 1 có sẵn công khai trên Internet để sử dụng. Thông thường, bạn nên đồng bộ hóa với nguồn thời gian cao hơn trong hệ thống phân cấp, ví dụ: đồng bộ hóa thời gian với máy chủ tầng 1 sẽ được coi là đáng tin cậy hơn so với sử dụng máy chủ tầng 4.

1.3. Quy tắc tường lửa

Theo mặc định, NTP sử dụng cổng UDP 123, vì vậy nếu bạn đang kết nối qua Internet với máy chủ NTP bên ngoài, hãy đảm bảo rằng lưu lượng truy cập UDP 123 gửi đi được cho phép đến máy chủ NTP được chỉ định trong cấu hình của bạn. Thông thường, theo mặc định, tất cả lưu lượng truy cập ra bên ngoài đều được phép nên đây không phải là vấn đề. Các máy chủ NTP công cộng trên Internet đã được định cấu hình để chấp nhận lưu lượng NTP gửi đến.

Thay vào đó, nếu bạn đang chạy máy chủ NTP cục bộ trong mạng riêng của mình, bạn sẽ cần đảm bảo rằng máy chủ của bạn có thể kết nối gửi đến máy chủ NTP trên cổng UDP 123, điều này có thể được thực hiện bằng cách chạy lệnh sau trên máy chủ NTP của bạn nếu tường lửa là đang sử dụng, đây là mặc định trong CentOS 7.

Mã nguồn [Chọn]
firewall-cmd --add-service ntp
Bây giờ chúng ta hãy xem cấu hình NTP bằng chronyd hoặc ntpd.

2. Chrony

2.1. Cài đặt

Theo mặc định trong CentOS 7 chrony là máy khách/máy chủ NTP mặc định nên nó phải được cài đặt sẵn nếu bạn cũng đang sử dụng hệ điều hành này, nếu không bạn có thể cài đặt nó nếu được yêu cầu như bên dưới.

Mã nguồn [Chọn]
yum install chrony -y
Sau khi cài đặt, chúng tôi muốn đảm bảo rằng dịch vụ chronyd sẽ tự động khởi động khi khởi động để chúng tôi có thể duy trì thời gian chính xác.

Mã nguồn [Chọn]
systemctl enable chronyd
Theo mặc định sau khi cài đặt gói, dịch vụ sẽ không chạy, hãy khởi động chronyd nếu nó chưa chạy. Khi dịch vụ bắt đầu, nó sẽ tự động bắt đầu đồng bộ hóa thời gian với các máy chủ NTP được xác định trong tệp cấu hình.

Mã nguồn [Chọn]
systemctl start chronyd
Xem hướng dẫn của chúng tôi về quản lý dịch vụ systemd với systemctl nếu bạn cần thêm thông tin về điều này.

2.2. Cấu hình

Cấu hình cho chrony được lưu trữ trong tệp /etc/chrony.conf. Gói chrony bao gồm cả chronyd và chronyc. Chronyd là trình nền đang tích cực chạy và đồng bộ hóa với máy chủ NTP, trong khi chronyc là một công cụ dòng lệnh được sử dụng để thực hiện các điều chỉnh khác nhau.

Ở đầu tệp cấu hình, các máy chủ NTP mặc định được chỉ định, trong máy chủ thử nghiệm của tôi, chúng xuất hiện như bên dưới. Chúng ta có thể xác định máy chủ NTP ưa thích bằng cách đặt "prefer" ở cuối một trong các dòng cấu hình máy chủ.

Mã nguồn [Chọn]
[root@centos7 ~]# cat /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
...

Nếu bạn có máy chủ NTP cục bộ của riêng mình, bạn có thể sửa đổi cấu hình để sử dụng máy chủ này thay vào đó, hãy đảm bảo tải lại dịch vụ sau đó để áp dụng các thay đổi. Các máy chủ NTP cũng có thể được truy xuất bằng cấu hình DHCP, điều này có thể bị vô hiệu hóa bằng cách chỉ định PEERDNS=no trong cấu hình mạng.

2.3. Quản lý

Với chrony running, chúng ta có thể thực hiện nhiều tác vụ quản lý khác nhau. Trong CentOS 7 như một phần của systemd, chúng tôi có quyền truy cập vào lệnh timedatectl mới cho phép chúng tôi quản lý các cài đặt thời gian khác nhau, bao gồm cả NTP.

Dưới đây là một ví dụ đầu ra của lệnh timedatectl, nó hiển thị thời gian hệ thống hiện tại cũng như thời gian đồng hồ phần cứng (RTC), múi giờ hiện tại, nếu NTP được bật và đồng bộ hóa cũng như các thay đổi DST sắp tới.

Mã nguồn [Chọn]
[root@centos7 ~]# timedatectl
      Local time: Tue 2015-09-15 22:24:11 AEST
  Universal time: Tue 2015-09-15 12:24:11 UTC
        RTC time: Tue 2015-09-15 12:24:03
        Timezone: Australia/Sydney (AEST, +1000)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: no
 Last DST change: DST ended at
                  Sun 2015-04-05 02:59:59 AEDT
                  Sun 2015-04-05 02:00:00 AEST
 Next DST change: DST begins (the clock jumps one hour forward) at
                  Sun 2015-10-04 01:59:59 AEST
                  Sun 2015-10-04 03:00:00 AEDT

Lệnh timedatectl cũng có thể được sử dụng để bật và tắt NTP bằng set-ntp, nó sẽ bật hoặc tắt chronyd hoặc ntpd tùy thuộc vào dịch vụ đang được sử dụng. Trong ví dụ bên dưới, chúng tôi tắt NTP và sau đó bật lại, điều này cũng kích hoạt nó đồng bộ hóa với các máy chủ NTP.

Mã nguồn [Chọn]
[root@centos7 ~]# timedatectl set-ntp 0
[root@centos7 ~]# timedatectl | grep NTP
     NTP enabled: no
     NTP synchronized: no

[root@centos7 ~]# timedatectl set-ntp 1
[root@centos7 ~]# timedatectl
     NTP enabled: yes
     NTP synchronized: yes

Cũng có thể bắt buộc đồng bộ hóa thời gian bằng các lệnh chronyc bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# chronyc -a 'burst 4/4'
200 OK
200 OK

[root@centos7 ~]# chronyc -a makestep
200 OK
200 OK

Chronyc cũng có thể được sử dụng để xem thông tin chi tiết cụ thể của NTP như minh họa bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# chronyc tracking
Reference ID    : 203.173.10.97 (203-173-10-97.perm.iinet.net.au)
Stratum         : 4
Ref time (UTC)  : Tue Sep 15 11:54:57 2015
System time     : 0.000043310 seconds slow of NTP time
Last offset     : 0.000002876 seconds
RMS offset      : 0.000330570 seconds
Frequency       : 10.954 ppm slow
Residual freq   : 0.002 ppm
Skew            : 0.052 ppm
Root delay      : 0.025731 seconds
Root dispersion : 0.046666 seconds
Update interval : 1036.5 seconds
Leap status     : Normal

Chúng tôi cũng có thể xem tất cả các máy chủ NTP mà chronyc đang đồng bộ hóa.

Mã nguồn [Chọn]
[root@centos7 ~]# chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203-173-10-97.perm.iinet.     3  10   377   863  -4849us[-4846us] +/-   91ms
^+ b.pool.ntp.uq.edu.au          2  10   377   771  +4122us[+4122us] +/-  116ms
^+ 0.time.itoc.com.au            2  10   377   717  +1935us[+1935us] +/-   83ms
^+ saul.foodworks.com.au         2  10   377   652  +1906us[+1906us] +/-   86ms

Thông tin thêm về các nguồn này sau đó có thể được xem.

Mã nguồn [Chọn]
[root@centos7 ~]# chronyc sourcestats
210 Number of sources = 4
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
203-173-10-97.perm.iinet.  15   9  241m     -0.293      0.307  -6664us  1336us
b.pool.ntp.uq.edu.au       13   9  206m      0.109      0.054  +4457us   150us
0.time.itoc.com.au          7   4  103m     -0.093      0.058  +1906us    42us
saul.foodworks.com.au       6   3   85m      0.244      0.965  +2418us   350us

Lưu ý rằng bạn cũng có thể chỉ định cờ -v khi chạy các lệnh này để biết thêm thông tin chi tiết và dài dòng.

Thời gian cũng có thể được định cấu hình thông qua giao diện người dùng đồ họa bằng cách cài đặt gói 'system-config-date' qua yum và sau đó chạy lệnh 'system-config-date'.

2.4. Tùy chọn bảo mật

Theo mặc định, chronyd sẽ chỉ chấp nhận các lệnh từ chronyc từ máy chủ cục bộ, tuy nhiên chúng ta có thể thay đổi điều này để cho phép thay đổi từ xa nếu cần. Để cho phép truy cập chronyc bên ngoài, hãy sửa đổi tệp /etc/chrony.conf như bên dưới.

Mã nguồn [Chọn]
cmdallow 172.16.0.0/24
Điều này sẽ cho phép chronyc được khởi tạo từ máy chủ từ xa trong phạm vi mạng 172.16.0.0/24 truy cập vào máy chủ của chúng tôi và thực hiện các thay đổi tương tự như chỉnh sửa trực tiếp tệp /etc/chrony.conf, điều này có thể hữu ích nếu bạn muốn có thể từ xa quản lý thời gian trên một số máy chủ. Ngoài ra, các mục nhập 'bindcmdaddress' mặc định đặt chronyd chỉ nghe trên máy chủ cục bộ sẽ bị xóa để cho phép chronyd nghe trên tất cả các giao diện mạng có sẵn, sau đó nên khởi động lại dịch vụ chronyd để áp dụng những thay đổi này.

Lưu ý rằng chronyd lắng nghe trên cổng UDP 323 cho các kết nối chronyc, vì vậy có thể cần phải đặt các quy tắc tường lửa để cho phép lưu lượng đi qua.

Mặc dù điều này khóa quyền truy cập vào chronyd từ một địa chỉ IP hoặc dải địa chỉ IP nhưng nó không thực sự thực hiện bất kỳ xác thực nào, có khả năng cho phép mọi người sử dụng chronyc để chạy các lệnh không an toàn. Chúng tôi có thể định cấu hình mật khẩu để giới hạn quyền truy cập chronyc, để biết thêm thông tin, hãy xem tài liệu tại đây.

3. NTPD

3.1. Cài đặt

Mặc dù daemon NTP cũ hơn chronyd nhưng nó vẫn được sử dụng rộng rãi, nhưng theo mặc định, nó không được cài đặt trong CentOS 7 nên trước tiên bạn sẽ cần cài đặt nó. Bạn nên kiểm tra xem chrony đã được cài đặt chưa và có thể tắt dịch vụ hoặc xóa gói để tránh mọi xung đột. Ntpd có thể được cài đặt như hình bên dưới.

Mã nguồn [Chọn]
yum install ntp -y
Sau khi cài đặt, chúng tôi muốn đảm bảo rằng dịch vụ ntpd sẽ tự động khởi động khi khởi động để chúng tôi có thể duy trì thời gian chính xác.

Mã nguồn [Chọn]
systemctl enable ntpd
Theo mặc định sau khi cài đặt gói, dịch vụ sẽ không chạy, hãy khởi động ntpd nếu nó chưa chạy.

Mã nguồn [Chọn]
systemctl start ntpd
Xem hướng dẫn của chúng tôi về quản lý dịch vụ systemd với systemctl nếu bạn cần thêm thông tin về điều này.

3.2. Cấu hình

Cấu hình cho ntpd được lưu trong tệp /etc/ntp.conf. Tệp này chỉ định các máy chủ NTP sẽ đồng bộ hóa với cùng định dạng với chrony, bên dưới là một ví dụ về cấu hình mặc định đã tồn tại sau khi cài đặt ntpd.

Mã nguồn [Chọn]
[root@centos7 ~]# cat /etc/ntp.conf
...
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
...

Cấu hình mặc định này đủ để máy chủ bắt đầu đồng bộ hóa thời gian với NTP.

3.3. Quản lý

Với ntpd, chúng ta có thể thực hiện nhiều tác vụ quản lý khác nhau. Lệnh ntpq cho phép chúng ta truy vấn và giám sát daemon NTP, ntpd. Chẳng hạn, chúng ta có thể xem thông tin về các đồng nghiệp NTP đã biết theo cách tương tự như lệnh 'nguồn chronyc' với chrony.

Mã nguồn [Chọn]
[root@centos7 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+node02.au.verbn 210.9.192.50     2 u   15   64  177    2.280   -0.791   8.727
-cachens2.onqnet 3.109.212.154    3 u    7   64  177   13.818    0.138   9.007
*hosting.wireles 203.35.83.242    2 u   14   64  177    1.089  -11.553   9.183
+ns2.tti.net.au  203.35.83.242    2 u   14   64  177   14.627   -4.516   9.209

Lệnh ntpstat có thể được sử dụng để nhanh chóng hiển thị trạng thái đồng bộ hóa thời gian.

Mã nguồn [Chọn]
[root@centos7 ~]# ntpstat
synchronised to NTP server (203.23.237.200) at stratum 3
   time correct to within 253 ms
   polling server every 64 s

Lệnh ntpdate đã ngừng hoạt động nhưng vẫn có sẵn để đặt ngày và giờ qua NTP, lệnh bên dưới buộc đồng bộ hóa với máy chủ thời gian được chỉ định, trong trường hợp này là   Đăng nhập để xem liên kết.

Mã nguồn [Chọn]
[root@centos7 ~]# ntpdate pool.ntp.org
20 Sep 18:53:12 ntpdate[28117]: adjust time server 125.255.139.115 offset 0.014167 sec

Chức năng này đã được thay thế bằng 'ntpd -q'. Theo mặc định, thao tác này sẽ không cập nhật đồng hồ phần cứng, để thực hiện việc đó, hãy chỉnh sửa tệp /etc/sysconfig/ntpdate và thêm "SYNC_HWCLOCK=yes" được đặt thành không theo mặc định, điều này sẽ đảm bảo đồng hồ phần cứng được cập nhật sau khi nptdate thành công. Điều này cũng sẽ cho phép đồng hồ hệ thống tự động cập nhật đồng hồ phần cứng cứ sau 11 phút.

4. Sự khác biệt giữa Chronyd và Ntpd

Bây giờ chúng ta đã biết cách làm việc với cả chronyd và ntpd, bạn nên sử dụng cái nào? Nói chung, điều đó không thực sự quan trọng lắm và việc duy trì mặc định trong hệ điều hành của bạn thường sẽ ổn trong hầu hết các trường hợp. Với ý nghĩ đó, đây là một số khác biệt giữa chronyd và ntpd có thể giúp bạn quyết định nên sử dụng cái nào.

  • Các hệ thống Linux không trực tuyến vĩnh viễn hoặc không được kết nối với mạng sẽ mất nhiều thời gian hơn để điều chỉnh đồng hồ hệ thống của chúng bằng ntpd vì cần phải thực hiện nhiều chỉnh sửa nhỏ. Thông thường, các điều chỉnh bắt đầu trong vài mili giây đầu tiên khi hệ thống khởi động, tuy nhiên, độ chính xác có thể chấp nhận được có thể mất từ 10 giây trong khi khởi động lại nóng đến vài giờ tùy thuộc vào môi trường vận hành và phần cứng, các biến số như nhiệt độ bắt đầu quan trọng và ảnh hưởng đến đồng hồ phần cứng. Chronyd có khả năng điều chỉnh thời gian nhanh hơn nhiều nên được sử dụng tốt hơn trong các hệ thống không liên tục trực tuyến và đồng bộ hóa với máy chủ NTP.
  • Chronyd hoạt động tốt hơn ntpd khi các máy chủ NTP chỉ khả dụng không liên tục, điều này là do ntpd cần bỏ phiếu thường xuyên cho các máy chủ thời gian tham chiếu để có kết quả tốt nhất. Ví dụ: nếu kết nối mạng kém chronyd có thể là một lựa chọn tốt hơn ntpd.
  • Chronyd hỗ trợ chức năng mạng biệt lập, theo đó cách duy nhất có sẵn để sửa thời gian là cập nhật thủ công. Điều này sẽ hữu ích trong một mạng an toàn không có quyền truy cập vào máy chủ NTP, thời gian được nhập thủ công và chronyd có khả năng kiểm tra các lỗi được sửa ở các bản cập nhật khác nhau để ước tính thời gian chính xác nhất.
  • Chronyd thường đồng bộ hóa thời gian nhanh hơn và có độ chính xác cao hơn ntpd.
  • Ntpd hỗ trợ NTP phiên bản 4 ( RFC 5905 ) trong khi chronyd hỗ trợ NTP phiên bản 3 ( RFC 1305 ), nhưng tương thích với phiên bản 4. Về cơ bản chronyd hiện không hỗ trợ đầy đủ giao thức v4 như ntpd.

Để tóm tắt sự khác biệt, chronyd nên được xem xét để sử dụng trên các hệ thống Linux có thể thường xuyên bị treo, tắt nguồn hoặc bị ngắt kết nối không liên tục khỏi mạng. Chronyd cũng có khả năng đồng bộ nhanh hơn ntpd, tuy nhiên ntpd đã hỗ trợ tốt hơn cho phiên bản 4 của NTP. Ntpd nên được xem xét cho các hệ thống duy trì hoạt động vĩnh viễn, tuy nhiên ngay cả khi đó lợi ích dường như không lớn bằng lợi ích do chronyd cung cấp.

Như được hiển thị, đồng bộ hóa hệ thống Linux với NTP về cơ bản đơn giản như cài đặt và chạy dịch vụ chronyd hoặc ntpd. Điều quan trọng là luôn cập nhật chính xác thời gian của hệ thống Linux để ngăn các sự cố liên quan đến thời gian không đồng bộ.