اطلاعیه

بستن
هنوز اطلاعیه ای در دست نیست.

تنظیم NTP - اصلاح تاریخ و ساعت در ویندوز سرور 2022

بستن
X
 
  • فیلتر کردن
  • زمان
  • نمایش
Clear All
پست های جدید

    تنظیم NTP - اصلاح تاریخ و ساعت در ویندوز سرور 2022

    در این مقاله قصد دارم نحوه تنظیم تاریخ و ساعت در Windows Server 2022 و نحوه همگام سازی NTP جهت سینک کردن تاریخ و ساعت سرورهای ویندوزی را به شما آموزش دهیم. توی این چند وقتی که اینترنت بین الملل قطع شد، خیلی از سرورها که با NTP Server های خارجی در ارتباط بودن، امکان اینکه Date/Time سرور آپدیت بشه مقدور نبود و با اختلال در Sync شدن ساعت سرورهای ویندوزی مواجه شدند همین باعث شده بود که سرورهای ویندوزی، زمان اشتباهی را نشان دهند و به اصلاح ساعت و تاریخ سرور Drift بشه. (جلو/عقب)

    سروری که من داشتم با اینکه گزینه Set time automatically در منوی Date & Time فعال بود ولی ساعت سرور Windows اشتباه نشان داده میشد. دکمه Sync Now هم خطای عدم ارتباط با سرور NTP را نمایش میداد. این مشکل معمولا به دلیل عدم همگام‌سازی با سرورهای NTP، تنظیمات نادرست DNS، یا فایروال و محدودیت‌های شبکه رخ می‌دهد. در این مقاله، راهنمای تصویری نحوه رفع کامل این مشکل به صورت عملی ارائه شده است.


    تنظیم تاریخ و ساعت ویندوز











    چک لیست اولیه

    قبل از اینکه بریم سراغ آموزش، من فرض را بر این میگیرم که موارد ساده تر مثل زیر توسط شما بررسی شده و در ادامه مشکل عمیق تر عیب یابی خواهد شد.
    • چک کردن ساعت مادربرد
    ساعت مادربرد دقیق نیست. تقریبا هر ساعت 0.2 ثانیه جلو یا عقب میوفته و باعث میشه Time Drift رخ بده. در صورتیکه سرور bare metal دارین این مورد بررسی در غیر اینصورت سرور ابری هست یا تحت مجازی ساز، از تنظیمات مجازی ساز سینک ساعت را غیرفعال کنید.
    • چک کردن TimeZone
    به سرور خود لاگین کنید ابتدا تایم زون بررسی شود که روی Asia/Tehran و +3:30 باشد. برای مشاهده Timezone سرور ویندوزی خود دستور زیر را در Power Shell وارد کنید.
    کد PHP:
    # Get-TimeZone 


    در صورتیکه چیزی به غیر از منطقه زمانی که در آن زندگی میکنید بود میتوانید از دستورات زیر برای تغییر تایم زون سرور ویندوزی خود استفاده کنید.
    کد PHP:
    # Get-TimeZone -ListAvailable | Where-Object {$_.Id -like "*Iran*"}
    # Set-TimeZone -Name "Iran Standard Time" 
    • بررسی DNS های سرور
    با استفاده از دستور زیر یا به صورت گرافیکی از طریق اینترفیس نتورک بررسی کنید چه نیم سرورهایی روی سرور تعریف شده اند.
    کد PHP:
    # Get-DnsClientServerAddress
    ​Or
    # Get-DnsClientServerAddress -AddressFamily IPv4 


    آدرس آی پی های DNS ای که تعریف شده بررسی شود که به درستی ست شده و در دسترس هست در غیر اینصورت تغییر داده شوند.
    • بررسی Routing Table
    با استفاده از دستور زیر defualt route و Gateway را بررسی بفرمایید.
    کد PHP:
    # route print
    ​Or
    # Get-NetRoute -DestinationPrefix 0.0.0.0/0
    ​ 


    در اینجا Gateway و Interface و Metric بررسی شود.
    • بررسی Windows Firewall
    در اینجا بررسی کنید که مشکل سمت فایروال نباشد. یک فایل لاگ درست کنید سپس تست و بررسی کنید.
    کد PHP:
    # netsh advfirewall set currentprofile logging droppedconnections enable
    # netsh advfirewall set currentprofile logging filename C:\temp\fw.log
    ​ 


    سپس دستور زیر را وارد کنید :
    کد PHP:
    # w32tm /resync
    ​ 


    بعد لاگ را مشاهده کنید. در صورتیکه داخل لاگ ها DROP UDP 123 مشاهده شد یعنی مشکل از سمت فایروال هست که باید رول مربوط به Inbound/Outbound برای NTP روی پروتکل UDP 123 تعریف و Allow شود.
    کد PHP:
    # type C:\temp\fw.log 


    سناریویی که من داشتم با توجه به اینکه دسترسی های رو بسته بودن ان تی پی سرور در دسترس نبود. در انتهای آموزش توضیح کاملتری در مورد اینکه چطور NTP Server ای که روی سیستم شما تعریف شده مشاهده بفرمایید و خروجی آن به صورت کامل تحلیل شده. اما ابتدا چک کنید چه NTP سروری بر روی سیستم شما تعریف شده :
    کد PHP:
    PS C:\Users\Administratorw32tm /query /status

    Source
    test.ntp.org,0x8 


    علاوه بر دستور بالا شما میتوانید از طریق ریجیستری ویندوز و دستورات زیر لیست سرورهای NTP که روی سیستم ویندوز کلاینت شما تعریف شده را به دست بیاورید.
    کد PHP:
    # reg query HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Parameters
    Or
    # ​reg query HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Parameters /v NtpServer
    ​ 




    در قسمت Source در خروجی دستور، شما میتوانید آدرس سرور NTP را مشاهده کنید. آدرس دامنه test.ntp.org برای من در دسترس نبود.





    مرحله اول : جستجوی NTP Server و تست در دسترس بودن

    ابتدا لیست یکسری NTP Server داخل ایران (Iran) که در دسترس هستند را جستجو کنید. یکسری آدرس ها اینجا میذارم ممکنه دوباره اینترنت قطع بشه یکسری آدرس ها برای تنظیم داشته باشیم. مثلا :
    کد HTML:
    0.ir.pool.ntp.org
    1.ir.pool.ntp.org
    2.ir.pool.ntp.org
    3.ir.pool.ntp.org​
    
    
    ntp.aut.ac.ir
    ntp.ut.ac.ir
    ntp.nict.ir



    شما اگر آدرس های جدیدتری پیدا کردید میتوانید به جای آدرس های NTP بالا، از آدرس های مد نظر استفاده کنید. (مثلا آدرس NTP لوکال) با استفاده از دستور nslookup آدرس هایی که مد نظر هست را میتوانید تست کنید که قابل Resolve شدن هست یا خیر. قبل از اجرای دستور کش سیستم را خالی میکنیم که تست واقعی تر باشد. در قسمت Address باید IP Address سرور NTP برگردانده شود.
    کد PHP:
    PS C:\Users\Administratoripconfig /flushdns
    ​PS C
    :\Users\Administrator>
    ​PS C:\Users\Administrator>
    PS C:\Users\Administratornslookup 0.ir.pool.ntp.org
    Server
    :  UnKnown
    Address
    :  172.29.2.100

    Non
    -authoritative answer:
    DNS request timed out.
        
    timeout was 2 seconds.
    Name:    0.ir.pool.ntp.org
    Address
    :  194.225.150.25

    PS C
    :\Users\Administrator>
    ​PS C:\Users\Administrator>
    PS C:\Users\Administratornslookup 2.ir.pool.ntp.org
    Server
    :  UnKnown
    Address
    :  172.29.2.100

    Non
    -authoritative answer:
    Name:    1.ir.pool.ntp.org
    Address
    :  194.225.150.25

    PS C
    :\Users\Administrator>
    ​PS C:\Users\Administrator>
    PS C:\Users\Administratornslookup ntp.aut.ac.ir
    Server
    :  UnKnown
    Address
    :  172.29.2.100

    *** UnKnown can't find ntp.aut.ac.ir: Non-existent domain
    PS C:\Users\Administrator>​
    ​ 





    با توجه به اینکه NTP روی پروتکل UDP و پورت 123 هست علاوه بر تست ریزالو شدن دامنه که در بالا گرفتیم حتما باید تست اتصال از طریق پروتکل UDP هم بگیریم که مطمئن بشم Client ما روی پروتکل و پورت UDP 123 به NTP Server وصل میشود. برای انجام این تست از دستور stripchart کمک میگیریم. (البته با ابزارهای دیگر هم میشه تست گرفت ولی چون NTP روی پروتکل UDP => Port 123 هست، ابزارهای 3rd Party ممکن هست از پروتکل TCP برای تست استفاده کنند که تست درستی نیست. لطفا به این نکته دقت داشته باشید و تست حتما روی UDP باشد)

    ابزار stripchart سرور NTP ما را روی پروتکل UDP تست میگیرد و از تستی که میگیریم اطمینان حاصل میکنیم که سرور ما که NTP Client هست امکان اتصال به NTP Server را دارد.
    کد PHP:
    PS C:\Users\Administratorw32tm /stripchart /computer:2.ir.pool.ntp.org /samples:/dataonly
    Tracking 2.ir
    .pool.ntp.org [194.225.150.25:123].
    Collecting 5 samples.
    The current time is 1/27/2026 3:03:09 PM.
    15:03:09, -00.0031636s
    15
    :03:11, -00.0027790s
    15
    :03:13, -00.0026582s
    15
    :03:15, -00.0032176s
    15
    :03:17, -00.0032350s
    PS C
    :\Users\Administrator


    دستور stripchart



    در صورتیکه عدد ms یا s دیدید یعنی NTP Server جواب میدهد و پورت UDP 123 باز هست. در صورتیکه مشکلی باشد، Timeout یا Error نمایش میدهد.


    نکته : به عددهایی که برگردانده میشود دقت بفرمایید. گهگاهی ممکن هست مثلا عددی مثل +37798 seconds برگردانده شود. این یعنی سرور NTP به ما جواب داده و پورت 123 هم باز هست اما اختلاف ساعت سرور شما با NTP بیش از حد هست و مراحلی که در ادامه برای تنظیم ساعت گفته شده اعمال نمیشود. دلیلش هم این هست که ویندوز به صورت پیش فرض اجازه نمیدهد اگر اختلاف زمان زیاد باشد ساعت اصلاح شود. این کار برای جلوگیری از خراب شدن Kerberos یا Crash سرویس ها و Corruption لاگ ها انجام میشه. به همین دلیل در صورتیکه اختلاف ساعت سرور شما با NTP جهانی زیاد باشد از این کار جلوگیری شده و خطای زیر نمایش داده میشه و ویندوز لج میکنه به شما میگه که اختلاف زیاد هست، من اصلاح نمیکنم. 😄
    کد HTML:
    The computer did not resync because no time data was available


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

    1 : اینکه این مقدارها رو موقتا از طریق ریجیستری بزرگ میکنیم. برای این کار از دستورات زیر استفاده میکنیم :
    کد HTML:
    # reg add HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config /v MaxPosPhaseCorrection /t REG_DWORD /d 172800 /f
    # reg add HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config /v MaxNegPhaseCorrection /t REG_DWORD /d 172800 /f

    در دستور بالا مقدار 172800 ثانیه، برابر است با 48 ساعت اختلاف ساعت که کاملا امن هست. در صورتیکه این مقدارها رو تغییر دادید حتما بعد از اینکه ساعت سرور سینک شد مقدار آنرا به مقدار پیش فرض که مقدار 54000 هست برگردانید.



    2 : یا اینکه به صورت دستی ساعت سرور رو جابجا کنید به ساعت کنونی که هست. حداقل یک یا دو دقیقه اختلاف بیشتر نباید باشه که از خطای The computer did not resync because no time data was available رها بشیم بعد ادامه تنظیماتی که در جلوتر گفته شده را انجام میدهیم که ساعت سرور به صورت کامل Sync بشه.

    دستورات زیر برای تنظیم تاریخ و ساعت سرور ویندوز به صورت دستی میباشد. آن ها را در PowerShell اجرا کنید. (پاور شل را با دسترسی Run as Administrator اجرا کنید) دستور اول برای تنظیم تاریخ و ساعت سرور با همدیگر هست و دستور دوم برای تغییر تنها ساعت سرور استفاده میشه. در صورتیکه تاریخ درست هست آنرا تغییر ندهید.
    کد PHP:
    # Set-Date -Date "2026-01-26 03:30:00"
    # ​Set-Date -Date (Get-Date "03:30:00") 




    مرحله دوم : تنظیم NTP Server جدید

    قبل از اینکه آدرس های NTP Server جدید را روی کلاینت سرور NTP ست کنیم ابتدا تنظیمات قبلی که تعریف شده را با استفاده از یکی از دستورات زیر پاکسازی میکنیم.
    کد PHP:
    # w32tm /config /syncfromflags:manual /manualpeerlist:""
    Or
    # w32tm /config /syncfromflags:manual /manualpeerlist:"" /update 


    بعد از اینکه سرور NTP مورد نظر را از طریق مرحله اول انتخاب کردیم اکنون نوبت آن است که آنرا روی سرور خودمان تعریف کنیم. من آدرس NTP سرور 2.ir.pool.ntp.org را انتخاب کردم. برای این کار با استفاده از دستورات زیر آدرس سرور NTP که مد نظر هست را وارد میکنم سپس سرویس Time را stop و Start میکنم و در آخر تنظیمات ساعت سرور ویندوز را resync میکنیم.
    کد PHP:
    # ​w32tm /config /manualpeerlist:"2.ir.pool.ntp.org,0x8" /syncfromflags:manual /update

    # net stop w32time
    # net start w32time​

    # w32tm /resync
    Or
    # w32tm /resync /rediscover

    # w32tm /query /status
    ​​ 


    تنظیمات ntp در ویندوز سرور 2022




    نکته : در صورتیکه سرور حساس میباشد میتوانید از چندین آدرس NTP به صورت همزمان استفاده کنید. آدرس هایی که انتخاب میکنید دقت کنید حتما از طریق سرور در دسترس باشند. در صورتیکه چندین آدرس مختلف مد نظرتان بود به جای دستور بالا از دستور زیر استفاده کنید. تعداد 2 یا 4 تا آدرس کفایت میکنه. 10 تا به بالا توصیه نمیشه.
    کد PHP:
    # ​w32tm /config /manualpeerlist:"2.ir.pool.ntp.org,0x8 time.google.com,0x8 time.cloudflare.com,0x8" /syncfromflags:manual /update 


    در خروجی دستورات باید successfully نمایش داده بشه. جهت مشاهده وضعیت سینک از دستور زیر استفاده میکنیم :
    کد PHP:
    PS C:\Users\Administratorw32tm /query /status
    Leap Indicator
    0(no warning)
    Stratum(secondary reference syncd by (S)NTP)
    Precision: -23 (119.209ns per tick)
    Root Delay0.1518944s
    Root Dispersion
    0.0439902s
    ReferenceId
    0xC2E19619 (source IP:  194.225.150.25)
    Last Successful Sync Time1/27/2026 3:14:53 PM
    Source
    2.ir.pool.ntp.org,0x8
    Poll Interval
    10 (1024s)

    PS C:\Users\Administrator>
    ​ 


    خروجی سالم باید شبیه به این باشد. به پارامترهای زیر دقت بفرمایید.
    کد PHP:
    Stratum(secondary reference syncd by (S)NTP)
    Last Successful Sync Time1/27/2026 3:14:53 PM
    Source
    2.ir.pool.ntp.org,0x8​ 


    مقدار Stratum باید 2 یا 3 باشد و جلوی Source هم آدرس سرور NTP را نوشته باشد.


    نکته : بنابه شرایط اینترنت ممکن هست نیم سرورها از کار بیوفتد یا دسترسی هاشون بسته بشه که باعث میشه تقریبا هیچ آدرسی نشه استفاده کرد. برای همین در صورتیکه مثل چند روز اولی که اینترنت ها رو بسته بودند و غالب دامنه ها ریزالو نمیشدند، شما میتونید به جای آدرس URL سرور NTP از IP Address آنها استفاده کنید. فقط کافی هست آدرس آی پی سرور NTP که مد نظر هست را با یک روشی پیدا کنید (ping/nslookup و هر ابزاری دیگری که میشناسید) سپس بعد از اینکه آدرس IP سرور NTP به دست آمد همانند زیر آنرا تنظیم کنید. ( به جای <IP Address> شما آدرس آی پی مد نظر خود را وارد کنید.)
    کد PHP:
    # ​​w32tm /config /manualpeerlist:"<IP Address>,0x8" /syncfromflags:manual /update

    # net stop w32time
    # net start w32time​


    # w32tm /resync /force
    Or
    # w32tm /resync /rediscover​

    # w32tm /query /status 



    نکات آموزشی اضافی

    خب تا اینجا باید تونسته باشید که آدرس NTP Server سیستم ویندوز خودتان را تغییر داده باشید که ساعت و تاریخ ویندوز شما به روز رسانی یا update شده باشد. از اینجا به بعد مطالب اضافی جهت بررسی خروجی دستوراتی که در بالا گفته شد بیان کردم و صرفا جهت افزایش آگاهی مطرح کردم.



    در صورتیکه نیاز داشتید بررسی کنید که چه آدرس NTP روی سرور یا سیستم ویندوزی شما تنظیم شده، همانند بالا که آموزش داده شد میتوانید از کوئری زیر استفاده کنید. (بخش NTP Client و قسمت NtpServer)
    کد PHP:
    PS C:\Users\Administratorw32tm /query /status
    Leap Indicator
    0(no warning)
    Stratum(secondary reference syncd by (S)NTP)
    Precision: -23 (119.209ns per tick)
    Root Delay0.0825955s
    Root Dispersion
    0.0564505s
    ReferenceId
    0xC2E19619 (source IP:  194.225.150.25)
    Last Successful Sync Time1/28/2026 2:05:13 PM
    Source
    2.ir.pool.ntp.org,0x8
    Poll Interval
    10 (1024s)

    PS C:\Users\Administrator>
    PS C
    :\Users\Administratorw32tm /query /configuration
    [Configuration]

    EventLogFlags(Local)
    AnnounceFlags10 (Local)
    TimeJumpAuditOffset28800 (Local)
    MinPollInterval(Local)
    MaxPollInterval10 (Local)
    MaxNegPhaseCorrection54000 (Local)
    ​ 


    در خروجی دستور بالا دو تا Poll Interval نمایش داده میشه که این مقدار فاصله زمانی هست که سرور NTP Client، بین هر بار چک کردن ساعت با NTP Server استفاده میکند. عددهایی که نمایش داده میشود به توان 2 هست. یعنی 2^6 = 64 ثانیه میشود. که هر 64 ثانیه یکبار تلاش برای Sync انجام میشود. عدد 10 هم در صورتیکه به توان 2 تبدیل کنیم مقدارش 1024 ثانیه (برابر با 17 دقیقه) میشود. در اینجا حداقل Poll Interval روی 64 ثانیه هست و حداکثر 1024 ثانیه میباشد)
    کد HTML:
    Poll Interval = 2^N Sec


    در صورتیکه ساعت سرور پایدار هست فاصله Sync باید بیشتر باشد و در صورتیکه ناپایدار هست فاصله Sync کمتر باید باشه.

    در صورتیکه نیاز داشتیم Poll Interval ها را تغییر دهیم میتوانیم با استفاده از دستورات زیر در ریجیستری آنها را تغییر دهیم.
    کد PHP:
    # reg add HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient /v MinPollInterval /t REG_DWORD /d 8 /f
    # ​net stop w32time
    # net start w32time
    ​ 


    همچنین شما میتوانید مقدار Drift (جلو و عقب بودن ساعت سرور)‌ را بررسی کنید. برای این کار همانطور که بالاتر مطرح شده بود از دستور stripchart استفاده میشود :
    کد PHP:
    # w32tm /stripchart /computer:0.ir.pool.ntp.org /samples:10 /dataonly
    .
    .
    .
    +
    0.023s
    +0.025s
    +0.030s 


    توی این مثال داره میگه که ساعت سرور کم کم داره میره جلو بعد ویندوز میگه اوکی و مقدار poll رو کمتر میکند، اما در صورتیکه مقدار Drift رو به پایین باشه ویندوز poll رو زیاد میکنه. همچنین برای اینکه متوجه بشیم Drift مان نرمال هست یا نه به خروجی عددهایی که نمایش میدهد دقت میکنیم. زیر ±100 میلی‌ثانیه کاملا سالم هست مثل زیر.
    کد HTML:
    +0.010s
    +0.012s
    +0.011s
    +0.013s
    ​
    Or
    
    -0.020s
    -0.021s
    -0.019s
    ​


    اگر مقدار Drift روی ثانیه (s) بود کمی مشکوک هست :
    کد HTML:
    +0.3s
    +0.5s
    +0.8s
    ​
    Or
    
    -0.4s
    -0.6s


    اگر مقدارهاش بالا بود تقریبا غیرنرمال هست. اینجا Drift سخت‌افزاری یا Time Provider مشکل داره.
    کد HTML:
    +5s
    +10s
    +30s


    البته این موضوع را هم مطرح کنم، خود اعداد خیلی مهم نیستند، بلکه آن روندی که جلو میروند مهم هستند. مثلا اینجا نوسان جزئی دارن اعداد.
    کد HTML:
    +0.020
    +0.021
    +0.020
    +0.019


    یا حالت دوم نوسان زیاد یعنی Drift داره جمع میشه و این بد هست.
    کد HTML:
    +0.5
    +1.2
    +2.8
    +5.1
    ​


    و اینکه NTP قرار نیست همیشه دقیقا صفر باشد. در صورتیکه مقدارش مثلا +22.56s بود ولی ثابت بود این Drift نیست و اختلاف اولیه بوده که ویندوز به صورت تدریجی اصلاح (Slew) کرده.


    منابع :
    کد HTML:
    https://learn.microsoft.com/en-us/windows-server/networking/windows-time-service/windows-time-service-tools-and-settings?tabs=config
    
    https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-timezone?view=powershell-7.5


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



    نویسنده مقاله :
    محمد نعمتی هابیلی
    Mohammad Nemati Habili

    ​​
    آخرین ویرایش توسط Habili; در تاریخ/ساعت دیروز, 06:08 PM.

درباره انجمن منطقه لینوکسی ها

انجمن منطقه لینوکسی ها با هدف ارتقاء سطح علمی کاربران در سطح جهانی و همچنین کمک به بالا بردن سطح علمی عمومی در زمینه های تخصصی فوق پایه گذاری شده است. انجمن منطقه لینوکسی ها از طریق کارشناسان و متخصصان پاسخگوی سوالات گوناگون کاربران مبتدی یا پیشرفته میباشد تا حد امکان تلاش شده که محیطی متنوع و کاربر پسند و به دور از هرگونه حاشیه جهت فعالیت کاربران در این انجمن ایجاد شود. لذا ما به صورت مستمر برای پیشرفت کمی و کیفی محتوی و اطلاعات انجمنمان میکوشیم که این برای ما ارزشمند و حائز اهمیت است. کلیه حقوق،اطلاعات و مقالات در این انجمن متعلق به سایت منطقه لینوکسی ها میباشد، و هرگونه نسخه برداری بدون ذکر منبع مورد پیگرد قانونی خواهد شد.

در حال انجام ...
X