當 VPS 一直無法 NTP 對時,結果兇手竟然是防火牆


背景

前陣子發現我的VPS上面執行的n8n、cron以及Hermes的一些排程任務時間都越來越不穩定

突發奇想上去看了一下,發現居然和ntp時間差了30幾秒

後來實際看了系統log才發現NTP一直沒有成功同步,乍看之下想說是不是Linux的NTP壞掉了?

但後來發現並不是。


影響

首先確定了 NTP 的 log,發現一直沒有正常運作

造成的影響範圍其實可能會蠻大

  1. Log timestamp會不准

  2. 真的錯位太大,TLS憑證/JWT/OAuth都有可能會失敗

  3. Cron排程偏移,有些提醒很即時的(例如Calendar叫我去搶票!)會錯過時間

  4. Docker container內全部服務都會時間錯位(包含我一些追蹤股票的,好危險)

所以可想而知時間同步壞掉非同小可


排除錯誤

第一個懷疑,是不是NTP Server還是我自己NTP服務壞了?

結果直接對NTP server發送UDP 123,發現都擋住了

再來請AI agent看一下Linux防火牆,果然如我印象根本沒設定Linux內的防火牆


找到兇手

結果最後找到原因,是我當時在VPS供應商那,為了安全性設定的outbound限制,只有打開HTTP/HTTPS的服務,因為一般現代常見的真的都是HTTP…

但是對時服務為了時間敏感性,甚至都不是走TCP,是走UDP的。

為了安全性我還是不想全開UDP port outbound,但是NTP節點是DNS round robin,加上全球的志願節點,所以IP會頻繁變動,其實不是固定的

所以一般會建議寫成

Egress Protocol: UDP Port: 123 Destination: 0.0.0.0/0

所以最後決定寫死google time server作為我的校時服務

Protocol: UDP Port: 123 Destination: 216.239.35.0/24


RTC同步

原本以為修到這裡就結束了,還好有ai提醒我, Linux 還有另一個時鐘:

RTC(Real-Time Clock)

Linux 有兩份時間:

System Clock

  • Kernel 維護

  • 所有程式使用

  • NTP 校正的是它

RTC

  • 主機板硬體時鐘

  • 關機仍持續計時

  • 開機時提供初始時間

NTP 不會自動更新 RTC。

因此最後再執行:

text
1
hwclock--systohc

把目前已校正好的 System Clock 寫回 RTC,避免下一次重開機又讀到錯誤的時間繼續偏掉。


這個問題也就這樣落幕,發個小文章記錄一下。