Debian Lenny/Squeezeでのうるう秒対策まとめ

■自身の環境でテストする度にググるのが大変なのでまとめます。
 私の環境では、うるう秒対策として、ntpはSTEPモード(デフォルト)運用とすることにしました。
 ※ntpdateはSTEP/SLEWどちらを強制しても問題なかった。

 うるう秒の監視メールは、毎日(当然だが)leap=00」であることが確認出来る。
 ※Squeezeでも同じスクリプトで動く。後述の別のメール送信スクリプトを使っても良い。
   2012/07/01 08:59:60 のうるう秒は「leap=01」

 Debian Lenny + ntp でうるう秒の監視メール
 http://d.hatena.ne.jp/labunix/20120201

■Linux OSはUNIXTIMEを使用、UNIXTIMEはうるう秒を考慮しない。
 ※デフォルトであり、正しい動作

 うるう秒の検証について(Squeeze/Lenny)
 http://d.hatena.ne.jp/labunix/20120303

■NTPv4では、STEPモード、SLEWモードがあり、「-x」オプションで変更できる。
 ※OSがうるう秒を考慮しないことが前提

 Debianのntpdでのslewモード 
 http://d.hatena.ne.jp/labunix/20120304

■目視では、いつ完了したか分かりにくいと感じていたときに「ntptime」コマンドを見つけた。
 ※マニュアルは読もうw。

 うるう秒の検証に使えそう ntptime
 http://d.hatena.ne.jp/labunix/

■STEPモードであれば、私の環境では時刻同期が完了するまでの時間に大きなばらつきは無かった。
 ※時刻同期にかかる時間は約15分。目視ではなく「ntptime」の「returns code 0」となるので確実。

 STEPモード(ntpd)1秒のずれの調整にかかる時間の検証
 http://labunix.hateblo.jp/entry/2012/03/06/224942

■まとめ

1.以下でリアルタイム監視が出来る。
  ※後述のメールと同じ形式

$ sudo watch -d -n 1 'echo -e "
  `ntpq -p -c rv`\n
  `date '+%s'` `env LANG=C date`\n
  `ntptime`
  "'

2.ICMP TYPE 13,14はDNSに到達できなかった場合のみUnreachableパケットを受け取る
  ※ntpdで上位サーバとの時刻同期を確認した後は基本的に不要

★パケット監視方法

$ sudo tcpdump -X -nvvv icmp

★FWのログ取得方法

$ iptables -A INPUT -p icmp --icmp-type 13 -j LOG  \
    --log-prefix "Timestamp request " --log-level=info; \
   iptables -A INPUT -p icmp --icmp-type 14 -j LOG \
    --log-prefix "Timestamp reply " --log-level=info

3.123/UDPのパケットで上位NTPサーバから受け取った「TimeStamp」が確認出来る

$ sudo tcpdump -X -nvvv udp port 123 | grep Timestamp

■ntpdの正常性確認メール

 ※例えば、以下の4種類をトリガーにする

  1.cronで定期的に
  2.「leap=01」を見つけた場合のみ
  3.「returns code 0」で無い時
  4.手動で実行

$ sudo vim ntpdcheckmail.sh
#!/bin/bash
set -e
TEMPPATH=${PATH}
echo $PATH | sed s/":"/"\n"/g | grep "^/usr/sbin\$" > /dev/null 2>&1 || \
  export PATH=/usr/sbin:$PATH
echo $PATH | sed s/":"/"\n"/g | grep "^/sbin\$" > /dev/null 2>&1 || \
  export PATH=/sbin:$PATH

NTPLOG=/var/log/ntpmail.log

if [ `id -u` -ne "0" ];then
  echo "Sorry,Not Permit User"
  exit 1
fi

touch ${NTPLOG} || exit 2

echo -e "
`ntpq -p -c rv`\n
`date '+%s'` `env LANG=C date`\n
`ntptime`
" > ${NTPLOG}

cat ${NTPLOG} | mail -s "ntp report" root || exit 3
rm ${NTPLOG}
export PATH=${TEMPPATH}
unset NTPLOG TEMPPATH
exit 0

■上記「1」の場合のみ例を記載
 ※毎日 08:0008:3009:0009:30 にメールする

$ sudo chown root:root ntpdcheckmail.sh
$ sudo chmod 700 ntpdcheckmail.sh
$ sudo mv ntpdcheckmail.sh /usr/local/bin/
$ sudo env EDITOR=vim crontab -e
0,30 8,9 * * * /bin/bash /usr/local/bin/ntpdcheckmail.sh

■問題を見つけ、手動で同期する場合
 ※下記が成功したかどうかの確認方法は上述の通り。

 ntpdを停止、ntpdateで「ntp.nict.jp」との時刻同期、ntpdの再開
 ※「-d」はデバッグオプション

$ su root -c '
   /etc/init.d/ntp stop; \
   ntpdate -d ntp.nict.jp; \
   /etc/init.d/ntp start'

■「ntpdate」はntpクライアントであり、STEP/SLEWの動作も異なる。
 詳しくはマニュアルを参照して下さい。
 ※「-d」はデバッグオプション。

【A】「ntpdate」における手動同期については、SLEWモードを強制「-B」

$ su root -c '
   /etc/init.d/ntp stop; \
   ntpdate -d -B ntp.nict.jp; \
   /etc/init.d/ntp start'

【B】「ntpdate」における手動同期については、STEPモードを強制「-b」

$ su root -c '
   /etc/init.d/ntp stop; \
   ntpdate -d -b ntp.nict.jp; \
   /etc/init.d/ntp start'