當 VPS 一直無法 NTP 對時,結果兇手竟然是防火牆
背景
前陣子發現我的VPS上面執行的n8n、cron以及Hermes的一些排程任務時間都越來越不穩定
突發奇想上去看了一下,發現居然和ntp時間差了30幾秒
後來實際看了系統log才發現NTP一直沒有成功同步,乍看之下想說是不是Linux的NTP壞掉了?
但後來發現並不是。
影響
首先確定了 NTP 的 log,發現一直沒有正常運作
造成的影響範圍其實可能會蠻大
Log timestamp會不准
真的錯位太大,TLS憑證/JWT/OAuth都有可能會失敗
Cron排程偏移,有些提醒很即時的(例如Calendar叫我去搶票!)會錯過時間
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。
因此最後再執行:
1 | hwclock--systohc |
把目前已校正好的 System Clock 寫回 RTC,避免下一次重開機又讀到錯誤的時間繼續偏掉。
這個問題也就這樣落幕,發個小文章記錄一下。