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의 호스트와 다른 컴퓨터에서 모두 성공합니다! 그러나 호스트는 여전히 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를 기반으로 합니다.[이메일 보호됨](우분투 공식 저장소에서) 호스트는 4.2.6p5를 실행하는 Ubuntu 14.04를 실행합니다.
ntpdc -c kerninfo <container_host>
추신: Collectd는 ntpd가 컨테이너에서 실행될 때 및 제한 시간 과 동일한 명령을 제출합니다 . 모든 제한 문이 정확하더라도 마찬가지입니다.
업데이트-ddd
: 더 자세한 출력을 얻을 수 있는 옵션을 사용하여 컨테이너 내부에서 ntpd를 실행했다는 사실을 언급하는 것을 잊어버렸습니다 . 기록된 유일한 관련 데이터는 다음과 같습니다.
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: 해결책을 찾은 후, 같은 문제에 대해 다른 분들이 검색하실 때 질문/답변을 더 잘 찾을 수 있기를 바라며 질문을 변경했습니다. 또한 한 가지 실수를 수정했습니다. 호스트가 Ubuntu 16.04를 실행하고 있다고 생각했지만 실제로는 여전히 14.04를 실행하고 있었습니다.
답변1
내 문제를 해결했습니다. 이 오류는 ntp 4.2.8이 도구 ntpdc
와 도구에서 사용하던 통신 모드(mode7이라고도 함)를 더 이상 사용하지 않고(기본적으로 비활성화하기 때문에) 발생합니다.
ntpq
ntp 4.2.8 및 최신 버전에서는 ntpdc 대신 도구를 사용해야 합니다. 이제 ntpdc와 동일한 명령을 지원합니다. 그래서 나는 ntpq -c kerninfo <container_host>
성공적으로 달릴 수 있다. 이 ntpq
명령은 통신에 다른 모드(즉, mode6)를 사용합니다.
ntp 4.2.8에서는 아직 마이그레이션되지 않은 도구와의 호환성을 지원하기 위해 mode7을 다시 활성화할 수 있습니다. 다음 줄을 다음 줄에 추가해야 합니다 /etc/ntp.conf
.
enable mode7
그러나 제한사항에는 매우 주의해야 합니다. mode7을 활성화하고 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에 대한 오해를 줄이기 위해 질문을 편집하겠습니다.