macOS の時刻がずれる (time.apple.com 側の問題)

macOS の時刻がずれていたので調べていたら time.apple.com の IPv6 サーバーに問題がありそうでした。


ターミナルで time.apple.com の IPv6 サーバーを確認します。

$ dig AAAA time.apple.com
~~~(略)~~~
time.g.aaplimg.com.	456	IN	AAAA	2403:300:a0c:4000::1e2
time.g.aaplimg.com.	456	IN	AAAA	2403:300:a16:3000::1f2
~~~(略)~~~


2つのサーバーに対して sntp コマンドを実行してみます。

$ sudo sntp -sS 2403:300:a0c:4000::1e2
sntp: Exchange failed: Timeout
sntp_exchange {
        result: 6 (Timeout)
~~~(略)~~~
sntp: Clock select failed
$ sudo sntp -sS 2403:300:a16:3000::1f2
sntp: Exchange failed: Timeout
sntp_exchange {
        result: 6 (Timeout)
~~~(略)~~~
+0.003034 +/- 0.059945 2403:300:a16:3000::1f2 2403:300:a16:3000::1f2


"2403:300:a0c:4000::1e2" は何度やっても失敗します。

"2403:300:a16:3000::1f2" は成功することがあります。


IPv4 のサーバー (17.253.68.123, 17.253.68.251, 17.253.68.253) では確実に成功しています。


タイムサーバーがデフォルト (time.apple.com) でもずれる(デバイスの日時になる)ことがあります。

Mac mini, macOS 14.6

投稿日 2024/08/12 22:21

返信
スレッドに付いたマーク ランキングトップの返信

投稿日 2024/08/26 23:51

様々なコマンドを使って確認するのは面倒臭いので python スクリプトを作りました。


check_time_server.py として保存してください。

#!/usr/bin/env python3

import argparse
import socket
import sys

CHECK = {None: '--', False: 'NG', True: 'OK'}
PORT = 123

flag_dryrun = False
flag_verbose = False
timeout_second = 1
message = print


def verbose(msg):
    return flag_verbose and message(msg)


def try_sntp(addr):
    pkt = bytearray(4*12)
    pkt[0] = (3 << 3) | 3

    ipaddr = addr[4][0]
    sock = socket.socket(family=addr[0], type=addr[1], proto=socket.IPPROTO_UDP)
    if timeout_second > 0:
        sock.settimeout(timeout_second)
    try:
        sres = sock.sendto(pkt, (ipaddr, PORT))
        rres = sock.recvfrom(64)
    except OSError as e:
        message(f'Error: {e} ({ipaddr})')
        sock.close()
        return False
    sock.close()
    return True


def check_server(hostname):
    message(f'Server: {hostname}')
    addrs = socket.getaddrinfo(hostname, PORT, proto=socket.IPPROTO_UDP)
    verbose('Address:')
    hostmap = [{}, {}]
    for addr in addrs:
        ipaddr = addr[4][0]
        try:
            sname = socket.gethostbyaddr(ipaddr)[0]
        except OSError as e:
            verbose(f'Error: gethostbyaddr("{ipaddr}"): {e}')
            sname = hostname
        verbose(f'  {ipaddr:39} : {sname}')
        success = None
        if not flag_dryrun:
            success = try_sntp(addr)
        hmap = hostmap[int(addr[0] == socket.AF_INET6)]
        if sname not in hmap:
            hmap[sname] = []
        hmap[sname].append([ipaddr, success])
    for host in sorted(set(sum((list(h.keys()) for h in hostmap), []))):
        message('\n'.join([
            f'{host}:',
            *[f'  {CHECK[check]} - {addr}' for hmap in hostmap
              for addr, check in sorted(hmap.get(host, []))]]))


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-v', '--verbose', action='store_true')
    parser.add_argument('-d', '--dryrun', action='store_true')
    parser.add_argument('-t', '--timeout', type=int, default=1)
    parser.add_argument('server', metavar='SERVER')
    args = parser.parse_args()
    flag_dryrun = args.dryrun
    flag_verbose = args.verbose
    timeout_second = args.timeout
    check_server(args.server)


次のような結果が得られるでしょう。


$ python3 check_time_server.py time.apple.com
Server: time.apple.com
Error: timed out (2403:300:a0c:4000::1f2)
Error: timed out (2403:300:a0c:3000::1e2)
Error: timed out (2403:300:a16:4000::1f2)
jptyo5-ntp-001.aaplimg.com:
  OK - 17.253.68.125
jptyo5-ntp-002.aaplimg.com:
  OK - 17.253.68.253
  NG - 2403:300:a0c:4000::1f2
jptyo5-ntp-003.aaplimg.com:
  NG - 2403:300:a0c:3000::1e2
jptyo5-ntp-004.aaplimg.com:
  OK - 17.253.68.251
krsel6-ntp-002.aaplimg.com:
  NG - 2403:300:a16:4000::1f2
$ python3 check_time_server.py time.apple.com
Server: time.apple.com
Error: timed out (2403:300:a0c:4000::1f2)
Error: timed out (2403:300:a0c:3000::1e2)
jptyo5-ntp-001.aaplimg.com:
  OK - 17.253.68.125
jptyo5-ntp-002.aaplimg.com:
  OK - 17.253.68.253
  NG - 2403:300:a0c:4000::1f2
jptyo5-ntp-003.aaplimg.com:
  NG - 2403:300:a0c:3000::1e2
jptyo5-ntp-004.aaplimg.com:
  OK - 17.253.68.251
krsel6-ntp-002.aaplimg.com:
  OK - 2403:300:a16:4000::1f2


ちなみに、 ntp.nict.jp, time.google.com , time.aws.com など公開 NTP で NG が出るのは見た事がないです。

返信: 54

2024/09/12 09:03 はに への返信

追認ありがとうございます。


2403:300:a16:3000::1f2 krsel6-ntp-001.aaplimg.com


は、うちでも成功率は低くありません。時々


2403:300:a16:4000::1f2 krsel6-ntp-002.aaplimg.com


が出てきますが、こちらは成功率が下がります。


しかし、 これらが getaddrinfo で取得するリストの先頭 3 つの中に入ってなければ timed は同期に確実に失敗します。


2024/09/09 05:56 三毛猫大好き への返信

ページの一番下には

Apple は、提供された情報をもとに可能な解決方法を提供または推奨する場合があります。

とあるので、内容次第では Apple 側での対応も期待したいところです。


ソフトウェアがサーバー名から IP アドレスを取得する方法(getaddrinfo)を繰り返し実行すると変化するのですが、その変化の規則は分かりません。しかし、時刻同期が確実に失敗するタイミングが存在することが分かったので、誰もが遭遇しそうな状況は


  • 久しぶりに起動すると時刻が狂っている
    • うちの Mac は精度が月差約45秒[一日に約1.7秒ずれる]の内蔵時計のようです
    • 下記に保存された時刻から開始されることがある? (バッテリーや内蔵電池切れなど)
      • /var/db/timed/com.apple.timed.plist
  • タイムサーバーが Apple (time.apple.com.) である限りシステム設定を弄っても同期しない


でしょうか。


2024/09/11 16:16 Rondo_1 への返信

Rondo_1 さんによる書き込み:
Apple 側のプライオリティ

タイムサーバーの運用については問題なしと判断しているのではないか?という懸念があります。


tcpdump の内容から timed は必ず 3 つの時刻の取得要求を実行しています。

(「自動的に設定」のオフ>オン 時はリトライを含め最大4セット [3x4=12要求]を実行)

DNS に登録されている IPv4 と IPv6 のアドレスも 3 つずつです。


すると、timed は 3 つの IP アドレスに対して取得要求を実行する仕様と認識されているのでは?ということです。

そのうち一つが応答するので障害は発生しないと判断していても不思議ではありません。


しかし、実態は timed から macOS への「time.apple.com の IP アドレス変換要求」に対して重複した IP アドレス返しています。

これで 2 つの IP アドレス(1つは重複)に対して取得要求を実行していて、応答しないサーバーだけを相手にする結果が生じています。

この齟齬は timed 担当プログラマすら気付いていない可能性が低くありません。(というのも重複排除は timed が行う内容になるからです)


憶測だらけなので、フィードバックやサポートには連絡できませんが...

2024/08/14 18:35 SEI-1 への返信

>反応がないし確実に失敗するので、サーバーが落ちてますね…

NICTはIPアドレスでの指定はやめてくれと言ってるけど、これが一般的運用なのでは。

https://jjy.nict.go.jp/tsp/PubNtp/qa.html#q1-1


最近は知らないけど、アップルのタイムサーバ(アジア)だと時間がずれるというのは、OSXの初期頃からあったような。


2024/08/28 00:23 はに への返信

その環境で timed がどういう振る舞いをするのか分からないので何とも言えませんが、timed が時刻取得するときに IPv4 に見えていたら問題ない気はします。


いわゆる「時刻のずれ」が発生するのは


time.apple.com が timed には IPv6 として常に見える環境で、時刻取得が長期間失敗する場合


に限らると考えています。話がややこしいのは


  • 「自動的に設定」がオン
  • 「タイムサーバー」が「Apple(time.apple.com.)」


なのに


time.apple.com と関係無い Mac 本体の時刻が表示される現象


でしょうか。


2024/09/11 04:50 SEI-1 への返信

SEI-1 さんによる書き込み:
もしかして IPv6 側が機能していないのは Apple (日本?) も分かっていて、この措置だったりするのかな?


これに一票。


SEI-1 さんによる書き込み:
既にフィードバックとサポートには、応答しないサーバーがあると連絡済みです。サポートからは関連部署と情報共有したとの回答は頂いています。


ということはこれ以上一般ユーザにできることはなさそうです(苦情の量というより Apple 側のプライオリティという点で)。


とはいえ例えば X(Twitter)でも「time.apple.com で時刻がずれる」という話はそこそこあって少なくとも八月一日から確認できます。中にはこのスレッドを参照している人もいるようですので情報提供という点でこのスレッド(を継続すること)は意味があると思います。


なお(blog とかはともかく)SNS の個人アカウントの URL を張ることはここの利用規約に抵触する可能性があるので(張りたくても)張らない方が良いと思います。

2024/09/14 19:53 はに への返信

今まで見た情報から考えると、DNS から得られる IP アドレスをネットワークアドレスで表現すると

  2403:300:a0c::/48 - jptyo* が必ず2個(4個中)

  2403:300:a16::/48 - krsel* が必ず1個(2個中)

になっているようです。規則性は分からないのでランダムと思うしかありません。


DNS キャッシュ クリアは、 dig コマンドの出力(抜粋)

time.apple.com.		618	IN	CNAME	time.g.aaplimg.com.
time.g.aaplimg.com.	145	IN	AAAA	2403:300:a0c:3000::1e2

「618」や「145」部分(秒)は期限切れ、を早めることになります。その後、getaddrinfo を実行するときに DNS から取得し直しで結果が変化するのは妥当ですが、timed の getaddrinfo 実行間隔は DNS 更新間隔より長いようなので、timed は無関係だと思います。


2024/09/04 05:54 SEI-1 への返信

 SEI-1さん、こんばんは。


 もしかしたら、USのサポートコミュニティでご質問になった方が、テクニカルな内容など返信を得られやすいかもしれません。あちらのほうが参加ユーザ数が多いでしょうし、テクニカルな話題に付いて来られるユーザも日本より多そうです。

 Official Apple Support Community

2024/09/10 16:42 やすどん への返信

既にフィードバックとサポートには、応答しないサーバーがあると連絡済みです。サポートからは関連部署と情報共有したとの回答は頂いています。一般的に DNS に登録している IP アドレスのサーバーが応答しない場合、サービスに障害が発生する可能性が高いので、その状態を放置しないと思いますが...


フィードバックにしろサポートにしろ、同一人物が同用件で何度も連絡するのはどうなんでしょう?


このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

macOS の時刻がずれる (time.apple.com 側の問題)

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。