NICTとDebianの時刻同期をIPv4に固定する

■上位のNTPサーバがIPv4を見ていれば起きない問題のようだが、直接参照する場合は注意が必要なようだ。
 ※通常は直接参照するだろうから、常にIPv4かIPv6かのどちらかを指定するべき。

■症状「stratum=16」で同期していない。
 ※以下はNICTの出力のみにしている。実際には別のntpサーバを参照しているので、同期自体に影響は無い。

$ sudo ntpq -p | head -3
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp-a2.nict.go. .INIT.          16 u    -   64    0    0.000    0.000   0.000

■IPv6を参照しているのが原因のようだ。

$ sudo ntpq -pn | head -3
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 2001:df0:232:ee .INIT.          16 u    -   64    0    0.000    0.000   0.000

■確かにNICTのIPv6アドレス

$ nslookup -type=AAAA ntp.nict.jp 127.0.0.1
Server:         127.0.0.1
Address:        127.0.0.1#53

Non-authoritative answer:
ntp.nict.jp     has AAAA address 2001:df0:232:eea0::fff3
ntp.nict.jp     has AAAA address 2001:df0:232:eea0::fff4

■ntpの設定ではIPv6が無効になっている。

$ grep "\-6\|::" /etc/ntp.conf
#restrict -6 default kod notrap nomodify nopeer noquery
#restrict ::1

■ntpdateでもIPv4、IPv6の両方を参照するようだ。

$ sudo /etc/init.d/ntp stop;sudo ntpdate -d ntp.nict.jp;sudo /etc/init.d/ntp start

■IPv4アドレスは以下の4つ。

$ nslookup ntp.nict.jp localhost
Server:         127.0.0.1
Address:        127.0.0.1#53

Non-authoritative answer:
Name:   ntp.nict.jp
Address

: 133.243.238.243
Name:   ntp.nict.jp
Address: 133.243.238.244
Name:   ntp.nict.jp
Address: 133.243.238.163
Name:   ntp.nict.jp
Address: 133.243.238.164

■IPv4のアドレスを直接指定した。

$ sudo ntpq -p | head -7
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp-a2.nict.go. .INIT.          16 u    -   64    0    0.000    0.000   0.000
*ntp-a2.nict.go. .NICT.           1 u   43   64  377    7.735    1.924   0.271
-ntp-a3.nict.go. .NICT.           1 u   27   64  377    7.768    2.218   0.436
+ntp-b2.nict.go. .NICT.           1 u   35   64  377    9.998    2.125   0.471
+ntp-b3.nict.go. .NICT.           1 u   26   64  377    9.868    1.842   2.784

■以下のようになる。

$ sudo ntpq -pn | head -7
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 2001:df0:232:ee .INIT.          16 u    -   64    0    0.000    0.000   0.000
*133.243.238.243 .NICT.           1 u   11   64  377    7.735    1.924   0.254
+133.243.238.244 .NICT.           1 u   59   64  377    7.768    2.218   0.436
+133.243.238.163 .NICT.           1 u    2   64  377    9.851    1.739   0.290
+133.243.238.164 .NICT.           1 u   58   64  377    9.868    1.842   2.784

■NICTのFAQにもあった。

 参考:[Q.1-1]	設定方法を教えてください。
 http://www2.nict.go.jp/w/w114/tsp/PubNtp/qa.htm

■「-4」が無かったからか。

$ grep "\-4" /etc/ntp.conf
server -4 ntp.nict.jp iburst dynamic
restrict -4 default kod notrap nomodify nopeer noquery

■ntpサービスを再起動して確認。

$ sudo ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 133.243.238.243 .NICT.           1 u    2   64    1    9.436    1.096   0.001

■ntpdateでも「-4」オプションが使える。

$ sudo /etc/init.d/ntp stop;sudo ntpdate -d -4 ntp.nict.jp;sudo /etc/init.d/ntp start

■上位のntpサーバがNICTのntpサーバにIPv4で参照するようになると、
 設定を変更しなくても、下位が直接NICTに取りに行くのはIPv4となる。

 逆にIPv6しか使わないのであれば、「-6」オプションが使える。
 IPv4がデフォルトだと油断していると困ることになるかも知れない。

 上位、下位に限らず、IPv4、v6の設定は正しく設定しておくべきという教訓を得た。

■システムメールも変更しておこう

$ sudo crontab -l | grep ntpd
0 0 * * * /bin/bash /usr/local/bin/ntpdcheckmail.sh

$ cat /usr/local/bin/ntpdcheckmail.sh
#!/bin/bash
set -e
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`\n
`ntpq -pn -c rv`\n
`date '+%s'` `env LANG=C date`\n
`ntptime`
" > ${NTPLOG}

cat ${NTPLOG} | mail -s "ntp report" root || exit 3
exit 0