بلاگ/تنظیم زمان دقیق سرور لینوکس با Chrony: رفع اختلاف ساعت و مشکلات لاگ، کرون و SSL
به‌روز شده

تنظیم زمان دقیق سرور لینوکس با Chrony: رفع اختلاف ساعت و مشکلات لاگ، کرون و SSL

1405/08/140 بازدید
تنظیم زمان دقیق سرور لینوکس با Chrony: رفع اختلاف ساعت و مشکلات لاگ، کرون و SSL

تنظیم زمان دقیق سرور لینوکس با Chrony: رفع اختلاف ساعت و مشکلات لاگ، کرون و SSL

ساعت سرور لینوکس و آیکن Chrony

اگر زمان سرور چند ثانیه یا چند دقیقه با ساعت واقعی فرق داشته باشد، کرون در زمان اشتباه اجرا می‌شود، ترتیب خط‌های لاگ به‌هم می‌ریزد و گواهی SSL ممکن است نامعتبر نشان داده شود. راه حل استاندارد برای تنظیم زمان سرور لینوکس همین Chrony است که هم سریع‌تر سینک می‌شود و هم روی اتصال‌های ناپایدار بهتر کار می‌کند. در این مقاله نصب و تنظیم Chrony روی اوبونتو و راکی لینوکس را قدم به قدم می‌بینیم.

چرا ساعت سرور لینوکس عقب یا جلو می‌افتد؟

هر سرور یک ساعت سخت‌افزاری روی مادربرد دارد که با باتری کار می‌کند و دقتش محدود است. سیستم‌عامل هم یک ساعت نرم‌افزاری جدا دارد که بعد از بوت شدن از همان ساعت سخت‌افزاری می‌خواند. این دو ساعت هر کدام به‌تنهایی کم‌کم دریفت می‌کنند، یعنی چند ثانیه در روز زود یا دیر می‌شوند.

روی سرور فیزیکی خانگی این اختلاف شاید مهم نباشد. روی سرور مجازی یا سرور ابری که چند مشتری روی یک هاست فیزیکی هستند، منبع ساعت مجازی‌سازی شده می‌تواند دریفت بیشتری هم داشته باشد. تنها راه قابل‌اعتماد برای رفع این مشکل، سینک مرتب با یک سرور زمان روی اینترنت یا شبکه داخلی است، نه تنظیم دستی ساعت با date.

ساعت سرور ناهماهنگ که با سینک شدن از طریق یک سرور زمان به ساعت دقیق می‌رسد

Chrony چیست و چه فرقی با ntpd و systemd-timesyncd دارد؟

Chrony یک سرویس NTP است که روی اکثر توزیع‌های لینوکس جدید، از جمله اوبونتو ۲۲ و ۲۴ و راکی لینوکس، به‌صورت پیش‌فرض یا در دسترس نصب می‌شود. نسخه قدیمی‌تر ntpd هم همین کار را می‌کند، اما Chrony چند مزیت عملی دارد که برای سرور مهم‌تر از دسکتاپ است.

ویژگیChronyntpdsystemd-timesyncd
سرعت سینک اولیه بعد از بوتچند ثانیهچند دقیقهچند ثانیه
رفتار روی اتصال اینترنت ناپایدار یا قطع‌وصلسازگار، منتظر می‌ماندممکن است سینک را از دست بدهدمحدود
ساعت مجازی روی VPS با دریفت بالاپایدارگاهی نوسان داردپایدار نیست
ابزار بررسی وضعیتchronyc با جزئیات کاملntpqبدون ابزار جزئی
مناسب برای سرور همیشه‌روشنبلهبلهبیشتر برای کلاینت

برای یک سرور لینوکس که باید لاگ و کرون و گواهی SSL دقیق داشته باشد، Chrony گزینه پیش‌فرض بهتری است. systemd-timesyncd برای کلاینت یا لپ‌تاپ کافی است، اما روی سرور production کنترل کمتری می‌دهد.

نصب Chrony روی اوبونتو و راکی لینوکس

نصب در هر دو توزیع چند دستور ساده است، فقط مدیر بسته فرق دارد.

روی اوبونتو

sudo apt update
sudo apt install -y chrony
sudo systemctl enable --now chronyd
systemctl status chronyd

اگر قبلا systemd-timesyncd فعال بوده، بهتر است قبل از فعال کردن Chrony خاموشش کنید تا دو سرویس با هم روی پورت و منبع زمان تداخل نکنند:

sudo systemctl disable --now systemd-timesyncd

روی راکی لینوکس

sudo dnf install -y chrony
sudo systemctl enable --now chronyd
systemctl status chronyd

روی راکی لینوکس معمولا Chrony از همان ابتدا نصب و فعال است، پس این دستورها بیشتر برای تایید وضعیت یا نصب دوباره روی یک تصویر مینیمال لازم می‌شوند.

تنظیم فایل chrony.conf و انتخاب سرورهای NTP

فایل تنظیمات در اوبونتو مسیر /etc/chrony/chrony.conf و در راکی لینوکس /etc/chrony.conf است. مهم‌ترین خط‌ها همان‌هایی هستند که سرور زمان را مشخص می‌کنند:

pool 2.ir.pool.ntp.org iburst
pool 2.rocky.pool.ntp.org iburst

می‌توانید چند منبع از مناطق مختلف اضافه کنید تا اگر یکی جواب نداد، Chrony خودش به بقیه سر بزند. نکته‌ای که راحت از قلم می‌افتد: آدرس‌هایی مثل 2.ir.pool.ntp.org اسم دامنه هستند، نه آی‌پی، یعنی برای رسیدن به آن‌ها تنظیم dns در لینوکس هم باید درست باشد. اگر فایل /etc/resolv.conf خالی باشد یا سرور dns لینوکس روی شبکه داخلی جواب ندهد، همین‌جا chronyc sources هیچ منبعی را رصد‌شده نشان نمی‌دهد، در حالی که سرویس خودش در حال اجراست.

بعد از هر تغییر در این فایل، سرویس را ریستارت کنید:

sudo systemctl restart chronyd

بررسی وضعیت سینک با دستورهای chronyc

سه دستور chronyc بیشتر از بقیه لازم می‌شوند.

وضعیت کلی سینک و میزان اختلاف فعلی:

chronyc tracking

خطی به اسم System time نشان می‌دهد که سرور چند ثانیه از زمان واقعی جلوتر یا عقب‌تر است. عددی زیر یک دهم ثانیه معمولا طبیعی است.

لیست منابع زمانی که Chrony در حال استفاده از آن‌هاست:

chronyc sources -v

ستون اول هر خط، سروری که انتخاب شده را با * نشان می‌دهد؛ بقیه با + یا - در صف انتخاب هستند.

و برای دیدن روند تطبیق در طول زمان:

chronyc sourcestats

اگر بعد از یک قطعی طولانی اینترنت اختلاف زیاد شده و می‌خواهید فوری تصحیح شود، به‌جای صبر کردن برای تصحیح تدریجی، می‌توانید اجرا کنید:

sudo chronyc makestep

اختلاف ساعت سرور چه مشکلاتی در لاگ، کرون و SSL می‌سازد؟

وقتی ساعت سرور چند دقیقه اشتباه باشد، سه جای کاری معمولا اول خودشان را نشان می‌دهند.

لاگ‌ها اول قربانی می‌شوند: وقتی یک باگ را با journalctl یا لاگ nginx دنبال می‌کنید، ترتیب رخدادها بین چند سرور با ساعت متفاوت دیگر قابل اعتماد نیست و همبستگی بین لاگ‌ها سخت می‌شود؛ اگر چند سرور دارید، جمع کردن لاگ‌ها در یک جای متمرکز همین مشکل همبستگی را هم کمتر می‌کند.

کرون دومی است: یک تسک که باید ساعت ۳ بامداد اجرا شود، با ساعت اشتباه ممکن است وسط ترافیک روز اجرا شود یا دو بار پشت‌سرهم شلیک کند اگر ساعت یک‌دفعه عقب برگردد؛ اگر دنبال جایگزین مدرن‌تری برای کرون هم هستید، systemd timer همین دقت زمان‌بندی را با گزارش‌گیری بهتر می‌دهد.

و مشکل سوم، گواهی SSL است: بررسی اعتبار گواهی TLS بر اساس بازه notBefore تا notAfter انجام می‌شود. اگر ساعت سرور چند دقیقه جلوتر از واقعیت باشد، سرور می‌تواند یک گواهی تازه‌صادرشده را هنوز نامعتبر تشخیص دهد؛ اگر عقب‌تر باشد، ممکن است گواهی منقضی‌شده را هنوز معتبر بداند. هر دو حالت، کلاینت یا ابزارهایی مثل curl را با خطای گواهی روبه‌رو می‌کند که ربطی به خود گواهی ندارد؛ قبل از دنبال کردن خطای گواهی در تنظیمات نصب SSL با Let's Encrypt و Certbot، همیشه اول ساعت سرور را با chronyc tracking چک کنید.

جمع‌بندی

تنظیم زمان سرور لینوکس با Chrony کار چند دقیقه‌ای است، اما نبودش بعدا وقت بیشتری برای دیباگ کردن لاگ و کرون و خطای SSL می‌گیرد. نصب کنید، pool درست را در تنظیمات بگذارید و بعد از هر تغییر یک بار chronyc tracking را چک کنید.

اگر می‌خواهید همین مراحل را روی یک محیط تازه تست کنید، سرور مجازی آریانت گزینه مناسبی است. بعضی پلن‌ها هم به‌صورت سرور مجازی لینوکس ساعتی عرضه می‌شوند، یعنی می‌توانید چند ساعت برای تست پرداخت کنید و اگر جواب داد، به پلن ماهانه بروید.

سؤالات متداول

آیا می‌شود هم Chrony و هم systemd-timesyncd را با هم فعال نگه داشت؟ نه، هر دو برای یک کار طراحی شده‌اند و فعال بودن همزمانشان باعث تداخل در سینک می‌شود. یکی را نگه دارید و دیگری را غیرفعال کنید.

بعد از نصب Chrony، چند وقت طول می‌کشد تا ساعت سرور درست شود؟ معمولا چند ثانیه تا چند دقیقه، بسته به میزان اختلاف اولیه. برای تصحیح فوری می‌توانید chronyc makestep را اجرا کنید.

چرا chronyc sources هیچ سروری نشان نمی‌دهد؟ بیشتر وقت‌ها دلیلش فایروال است که پورت ۱۲۳ UDP را بسته، یا تنظیم dns در لینوکس که اسم دامنه سرورهای pool را resolve نمی‌کند. هر دو را جدا تست کنید.

آیا Chrony روی ساعت هاردور سرور هم اثر می‌گذارد؟ به‌صورت پیش‌فرض نه، فقط ساعت سیستم را تنظیم می‌کند. برای نوشتن زمان درست روی ساعت سخت‌افزاری هم می‌توانید sudo hwclock --systohc را دستی اجرا کنید.