시간 동기화가 안 될 때 "방화벽에서 막혔는지" 를 먼저 가르려 하는데, NTP 는 UDP 123 을 쓰기 때문에 TCP 에서 쓰던 확인 방법이 그대로 통하지 않는다. 잘못된 방법으로 확인하고 "열려 있다" 고 판단하는 일이 잦다.
# 의미 없다 — UDP 는 연결이 없으므로 대부분 succeeded 로 나온다
nc -z -v -u 192.168.0.1 123
# 통하지 않는다 — NTP 는 TCP 123 에서 대기하지 않는다
telnet 192.168.0.1 123
nc -zu 는 데이터그램을 보내고 ICMP port unreachable 이 돌아오지 않으면 성공으로 보고한다. 서버가 없어도, 중간에서 패킷이 버려져도 "succeeded" 가 나온다. 이 결과로 방화벽 상태를 판단하면 안 된다.
굳이 nc 로 확인하려면 실제 NTP 질의 패킷을 만들어 응답이 오는지 봐야 하는데, 그럴 바에는 전용 도구를 쓰는 편이 낫다.
질의만 하고 시각을 바꾸지 않는다. 응답이 오면 도달한 것이다.
sudo dnf install -y ntpdate
ntpdate -q 192.168.0.1
server 192.168.0.1, stratum 3, offset 0.000431, delay 0.02579
응답이 없으면 다음과 같이 끝난다.
no server suitable for synchronization found
RHEL 8 이상과 최근 Ubuntu 의 기본 시간 동기화 구현은 chrony 다.
chronyc sources -v
chronyc tracking
chronyc ntpdata 192.168.0.1
sources 의 Reach 칸은 최근 8회 질의의 성공 여부를 8진수로 표시한다. 377 이면 8회 모두 응답을 받았다는 뜻이고 0 이면 한 번도 받지 못한 것이다. 여기가 방화벽 차단을 가장 정확히 보여 준다.
한 번만 질의해 보려면 다음을 쓴다.
chronyd -Q 'server 192.168.0.1 iburst'
sntp -d 192.168.0.1
sudo tcpdump -nn -i any 'udp port 123'
나가는 패킷만 보이고 들어오는 응답이 없으면 경로상에서 막힌 것이다. 나가는 패킷조차 없으면 클라이언트 설정이나 로컬 방화벽 문제다.
# chrony 가 대기 중인지
sudo ss -ulnp | grep ':123'
# 클라이언트 허용 설정
grep -E '^allow|^local' /etc/chrony.conf
# 방화벽
sudo firewall-cmd --permanent --add-service=ntp
sudo firewall-cmd --reload
chronyc clients 로 어떤 클라이언트가 질의했는지 볼 수 있다. 여기에 대상 서버가 나타나지 않으면 패킷이 도달하지 않은 것이다.