読者です 読者をやめる 読者になる 読者になる

ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

NTPサーバーを構築してLAN内サーバーでも日本時刻を同期する

ネットワーク NTP サーバー環境構築

NTPサーバーを構築してLAN内サーバーでも日本時刻を同期する。

NTPサーバーとは時刻を同期する為のもの(説明適当)。
LAN内にNTPサーバーを構築するメリットして

・LAN内の全てのサーバーで時刻を同期できる
 →各サーバーで外部NTPサーバーを参照する事も可能だが多少のズレが発生する可能性あるみたい
・NTPサーバーだけが外部問い合わせをする事で、外部ネットワークへのトラフィックの削減につながる

環境

・サーバーA
ゲストOS(CentOS6)
eth0:192.168.10.30
eth1:10.0.10.30
※eth0がWAN(グローバルネットワーク)に繋がっている

・サーバーB
ゲストOS(CentOS6)
eth0:10.0.10.40
※WANにつながっていない

ntpd 4.2.6

手順

NTPサーバー

現在時刻を確認

[root@lb ~]# date
2017年  1月 28日 土曜日 08:52:00 JST

ハードウェアクロックの時刻を確認

hwclock -r 
2017年01月28日 10時13分09秒  -0.353933 秒

ずれてる・・

ntpインストール

yum -y install ntp


ntp設定ファイル修正

LAN内のNTPサーバーはNICTのNTPサーバーを元にして時刻を同期する。
ntp.nict.jpは独立行政法人情報通信研究機構NICT)が管理している日本標準時に直結したNTPサーバー

vi /etc/ntp.conf  

以下の設定を行います。

#NTPサーバーの時刻と,ローカル・マシンの時刻のずれを記録するファイル
driftfile /var/lib/ntp/drift
#デフォルトのアクセス制御を設定、明示的に許可されていないアクセスを禁止
restrict -6 default ignore
restrict default ignore
restrict 210.173.160.27 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.57 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery

最初の2行でipv6ipv4のデフォルトのアクセス制限として拒否設定。
その後、必要なアクセスのみを許可していってる。
上記3つのIPはこちらからアクセスする上位NTPサーバーのIP(後述)。
こちらからのタイムクエリーはしますが、あちらからのntpqやntpdcクエリーはさせないようnomodify以降のオプションを付与。

restrictでは外部からのアクセスと外部へのアクセス両方の設定となるようです。
各オプションは
ignore ... 指定したサーバからのすべてのNTPアクセスを無視
noquery ... 指定したサーバからの時刻問い合わせパケットを無視
nomodify... 指定したサーバからの設定変更要求パケットを無視
notrap ... 指定したサーバに対して状変時にトラップを上げない

# 自分自身のアクセスを許可
restrict 127.0.0.1
# 10.0.10.0/24からのアクセスを許可
restrict 10.0.10.0 mask 255.255.255.0 nomodify notrap

書いての通り、NTPサーバーへのアクセス許可設定です。

# 時刻同期先NTPサーバーを指定
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst

ちなみにデフォルトの下記だと、デフォルトのNTPサーバーを参照するらしい。
これでも動くみたいだけど、変更したほうが良さ気。

server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org

server に 127.127.1.0 を指定すると、自分自身のローカルクロック(システム時刻)を使用するみたい。
外部ネットワークに接続できない場合に使用する事あるみたいだけど、今回は上位NTPサーバーを参照するのでこの設定は使用しない。

server 127.127.1.0

上位サーバーを参照しない場合は、以下のようにfedgeをつける?
Stratumは、小さい方が優先度が高くなるとの事。
ちょっとこの辺よくわかってない。。

fudge 127.127.1.0 stratum 10

iptablesにNTPサーバーへのアクセスを許可する
※ntp.confのserverのIP

iptables -A OUTPUT -p udp -d 210.173.160.27 --dport 123 --sport 123 -j ACCEPT
iptables -A OUTPUT -p udp -d 210.173.160.57 --dport 123 --sport 123 -j ACCEPT
iptables -A OUTPUT -p udp -d 210.173.160.87 --dport 123 --sport 123 -j ACCEPT

ntpを起動する前に手動で時刻を合わせてみる。
※ntpdateの後にNTPサーバーのホスト名またはIPを指定する

ntpdate ntp.nict.jp

28 Jan 12:32:56 ntpdate[37946]: step time server 133.243.238.164 offset 122958.759329 sec
ntpdate

以下のようなメッセージが出た場合ntpdが起動中、またはNTPサーバーの指定がない。

27 Jan 00:01:09 ntpdate[38507]: no servers can be used, exiting
27 Jan 00:01:09 ntpdate[38507]: the NTP socket is in use, exiting

自動起動設定

chkconfig ntpd on

確認

[root@lb ~]# chkconfig --list ntpd
ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

ntp起動

service ntpd start


NTPサーバーとの同期確認
※remoteで指定されたホストの左に*が表示されていれば、そのサーバと同期していることを確認できるらしい

[root@lb ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp1.jst.mfeed. 133.243.236.17   2 u    -   64    1   44.714   54.252   8.762
*ntp2.jst.mfeed. 133.243.236.17   2 u    1   64    1   46.647   57.935   5.071
 ntp3.jst.mfeed. 133.243.236.17   2 u    -   64    1   44.669   57.794   5.860
※refidの値がずっと「.INIT.」の場合

以下のようにrefidの値が「.INIT.」の場合、「.INIT.」はNTPサーバに到達できないという事。
st(Stratum) 16 は、最下位の階層で、NTPクライアントはこの階層のNTPサーバには同期しない。
ntpdは、上位サーバの時刻の違いが 1000 秒より大きい場合、何か決定的にまずいことが生じたと仮定し同期しない。

[root@lb ~]# ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp-b2.nict.go. .INIT.          16 u    -   64    0    0.000    0.000   0.000
 ntp1.jst.mfeed. .INIT.          16 u    -   64    0    0.000    0.000   0.000
 ntp2.jst.mfeed. .INIT.          16 u    -   64    0    0.000    0.000   0.000
 ntp3.jst.mfeed. .INIT.          16 u    -   64    0    0.000    0.000   0.000

自分はここでかなりハマりました。
結論から言うと、設定してる上位NTPサーバーのIPのアクセスを許可するよう設定しntpdを再起動する事で解決しました。

ntp.confのserverにしているホストのIPを調べ、

server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst

restrictに指定

restrict 210.173.160.27 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.57 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery
※同期確認時にタイムアウトエラーが出た場合。
$ ntpq -np

::1: timed out, nothing received
***Request timed out

色々可能性はありますが、自分の場合はipv6localhostに対して通信しようとしており、ntp.conf側ではipv6を許可していないのが原因でした。
そもそもipv6は使用しないのでシステム側でipv6の通信をさせないように設定。

sysctl.confを編集し、

vi /etc/sysctl.conf

ipv6の通信をさせないように設定追加

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

反映

sysctl -p

これで解決しました。

iptablesのログでNTPのポート123がDropされていた場合。

下記の例だとntp.confのserverで指定した下記IPの123ポートがDropされてる。
210.173.160.27
210.173.160.57
210.173.160.87
これらは、ntpd.confに設定したNTPサーバーのIP

Jan 28 13:02:49 lb kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=192.168.10.30 DST=210.173.160.27 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 
Jan 28 13:06:59 lb kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=192.168.10.30 DST=210.173.160.57 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 
Jan 28 13:07:00 lb kernel: Dropped by OUTPUT: IN= OUT=eth0 SRC=192.168.10.30 DST=210.173.160.87 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56

iptablesに下記設定で解決した

iptables -A OUTPUT -p udp -d 210.173.160.27 --dport 123 --sport 123 -j ACCEPT
iptables -A OUTPUT -p udp -d 210.173.160.57 --dport 123 --sport 123 -j ACCEPT
iptables -A OUTPUT -p udp -d 210.173.160.87 --dport 123 --sport 123 -j ACCEPT

同期確認

最後に時刻の同期が取れている事を確認。

[root@lb ~]# date                      
2017年  1月 28日 土曜日 09:58:18 JST

動作確認の為、故意的に時間をずらしてみる。
※ntpサーバーとのズレが大きすぎると同期されない為、2,3分だけずらしてみる。

date -s "2017/01/29 08:57:00"

直後は以下のようだけど

[root@lb ~]# ntpstat
unsynchronised
   polling server every 64 s

同期されると以下のように表示される

ntpstat
synchronised to NTP server (210.173.160.87) at stratum 3
time correct to within 34 ms
polling server every 64 s

20分位すると同期されました。
直ぐに動悸したい場合は、ntpdateコマンドを使用した方が良いでしょう。

[root@lb ~]# date
2017年  1月 29日 日曜日 09:20:13 JST

クライアントサーバー

インストール手順は省略します。


ntp.confを編集

vi /etc/ntp.conf
restrict -6 default ignore
restrict default ignore
restrict 127.0.0.1
restrict 10.0.10.0 mask 255.255.255.0 nomodify notrap

server 10.0.10.30

sysctl.confを編集

vi /etc/sysctl.conf

ipv6の通信をさせないように設定追加

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

反映

sysctl -p

ntp.conf設定

vi /etc/ntp.conf  

同期確認
refidやstが正常に表示されてればOKだはず。

[root@web ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 10.0.10.30      210.173.160.87   3 u    2   64    1    0.386  1823354   0.000
※「ntpq -p」実行後タイムアウトし、NTPサーバーのiptablesのログでNTPのポート123がDropされていた場合。
Jan 29 09:25:02 lb kernel: Dropped by INPUT: IN=eth1 OUT= MAC=00:0c:29:73:76:73:00:0c:29:5c:ba:fd:08:00 SRC=10.0.10.40 DST=10.0.10.30 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 

Jan 29 09:28:20 lb kernel: Dropped by OUTPUT: IN= OUT=eth1 SRC=10.0.10.30 DST=10.0.10.40 LEN=76 TOS=0x00 PREC=0xC0 TTL=64 ID=0 DF PROTO=UDP SPT=123 DPT=123 LEN=56 

NTPサーバー側でファイアウォール設定する事で解決した。

iptables -A INPUT -p udp -s 10.0.10.0/24 --dport 123 -j ACCEPT
iptables -A OUTPUT -p udp -d 10.0.10.0/24 --dport 123 --sport 123 -j ACCEPT

クライアント側から「ntpq -p」実行してタイムアウトが発生する場合は、NTPサーバー側のiptables設定やntp.confのrestrict設定あたりも疑った方が良い