ntpd 4.2.8 サービスを実行する Ubuntu 16.04 ベースの Docker コンテナがあります。コンテナをインスタンス化すると、ポート 123/udp が公開されます。
LAN 上のホストまたは他のコンピューターから、ntpq -p <container_host>
ピアのリストと同期ステータスを取得するために使用できます。ただし、collectd を使用して監視したり、実行したりするとntpdc -c kerninfo <container_host>
失敗/タイムアウトが発生します。これは私を困惑させています。
コンテナ内で、適切なステートメントをいくつか使用してテストしたrestrict
ほか、何も使用せずにテストしました。しかし、どちらの場合もタイムアウトになりました。コンテナ内で tcpdump を実行すると (特権コンテナに昇格した後)、UDP パケットは到着しますが、何も応答されないことがわかります。もちろん、tcpdump を使用すると、ntpq を使用しているときに要求と応答の両方が表示され、動作しています。
同じ ntp.conf ファイルを使用して、ホスト上で ntpd サーバーを直接実行すると、ntpdc -c kerninfo <container_host>
ホストと、許可した LAN 上の他のコンピューターからの collectd の両方が成功します。ただし、ホストでは、ntp 4.2.6 が付属する古いバージョンの Ubuntu (14.04) がまだ実行されています。
したがって、唯一の違いは Docker ネットワーク (私が理解した限りでは NAT) と ntp バージョン (4.2.6 と 4.2.8) です。しかし、ntp.org のドキュメントには、NAT についても 4.2.8 の更新についても何も記載されていません。コマンドがタイムアウトするのは、クライアントがサーバーとは異なるサブネット上にあるため (NAT のため) ですか? それとも、4.2.8 で何かが変更されたためですか?
注: 私のコンテナイメージは、ntpdを実行するubuntu:16.04に基づいています。[メールアドレス](Ubuntu 公式リポジトリから)。ホストは 4.2.6p5 を実行する Ubuntu 14.04 を実行しています。
ntpdc -c kerninfo <container_host>
PS: collectd は、すべての restrict ステートメントが正しい場合でも、コンテナ内で ntpd が実行されると、と同等のコマンドを送信してタイムアウトします。
アップデート: コンテナ内で ntpd を実行し、-ddd
より詳細な出力を取得するオプションも設定したことを言い忘れました。ログに記録された関連データは次のとおりです。
read_network_packet: fd=19 length 192 from 192.168.1.3
receive: at 26 172.17.0.2<-192.168.1.3 flags 19 restrict 000
アップデート2: 解決策を見つけた後、同じ問題に遭遇した他の人が検索したときに質問/回答を見つけやすくなるように、質問を変更しました。また、1 つの間違いを修正しました。ホストは Ubuntu 16.04 を実行していると思っていましたが、実際には 14.04 を実行していました。
答え1
問題は解決しました。エラーは、ntp 4.2.8 がツールntpdc
とそれが使用していた通信モード (別名 mode7) を非推奨 (デフォルトで無効) にしたために発生しました。
ntp 4.2.8 以降のバージョンでは、このツールをntpq
ntpdc の代わりに使用する必要があります。現在、ntpdc と同じコマンドがサポートされています。そのため、ntpq -c kerninfo <container_host>
正常に実行できます。このntpq
コマンドは、通信に別のモード (別名 mode6) を使用します。
ntp 4.2.8 では、まだ移行されていないツールとの互換性をサポートするために、モード 7 を再度有効にすることができます。 に次の行を追加する必要があります/etc/ntp.conf
。
enable mode7
しかし、この制限には十分注意する必要があります。モード7を有効にしてntpdサーバーを開放したままにしておくと、DDoS増幅攻撃に利用される可能性があるからです。私は現在、UbuntuでIPv4とIPv6の両方にデフォルトの制限を使用しています。私は思う- このモードの使用をブロックします:
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited
collectdはmode7のみをサポートしているため(問題 #932)、コンテナ内の設定でこのモードを再度有効にすることにしました。ntp がこのモードの再有効化をサポートしている限り、この変更により、collectd が Ubuntu 16.04 (または ntp 4.2.8+ を使用するディストリビューション) 上の ntpd を監視できないという問題が解決されるはずです。
注: この問題に遭遇した人がより適切に解決策を見つけられるように、当初根本的な原因だと思っていた NAT に関して誤解を招かないように質問を編集します。