본문 바로가기
IT/Linux

리눅스 서버의 NTP에 대한 이해: chrony

by 엔지니어 문 2025. 4. 1.

 리눅스 서버를 관리하는 데 있어 정확한 시간 동기화는 생각보다 중요한 요소입니다. 로그 분석, 보안 인증, 클러스터 동기화, 데이터베이스 트랜잭션 등 다양한 서비스가 정확한 시간에 의존하고 있기 때문입니다. 이 글에서는 NTP(Network Time Protocol)의 기본 개념과 현대 리눅스 시스템에서 주로 사용하는 chrony를 이용한 시간 동기화 방법을 상세히 알아보겠습니다.

 

NTP란 무엇인가?

NTP(Network Time Protocol)는 컴퓨터 시스템 간의 시간을 동기화하기 위한 네트워크 프로토콜입니다. 1985년에 처음 개발된 이후로 계속 발전해 왔으며, 현재는 버전 4가 널리 사용되고 있습니다. NTP는 UDP 포트 123을 사용하며, 밀리초 단위 이하의 정확도로 시간을 동기화할 수 있습니다.

NTP의 작동 원리

NTP는 계층적인 구조(Stratum)를 가지고 있습니다:

  • Stratum 0: 원자시계, GPS 시계 등 매우 정확한 시간 소스
  • Stratum 1: Stratum 0 장치에 직접 연결된 서버 (Primary Time Server)
  • Stratum 2: Stratum 1 서버에서 시간을 동기화하는 서버
  • Stratum 3~15: 상위 계층의 서버로부터 시간을 동기화

NTP 클라이언트는 여러 NTP 서버로부터 시간 정보를 수집하고, 네트워크 지연시간을 계산하여 가장 정확한 시간을 결정합니다. 이 과정에서 복잡한 알고리즘이 사용되어 네트워크 지터(jitter), 지연 시간 변동, 시계 드리프트 등의 문제를 해결합니다.

    +-------------+
    | Stratum 0   |  (원자시계, GPS 등)
    +------+------+
           |
    +------v------+
    | Stratum 1   |  (Primary Time Server)
    +------+------+
           |
    +------v------+
    | Stratum 2   |  (Secondary Time Server)
    +------+------+
           |
    +------v------+
    | Stratum 3-15|  (클라이언트 서버)
    +-------------+

 

NTP vs Chrony: 왜 Chrony인가?

전통적으로 리눅스에서는 ntpd라는 데몬을 사용하여 NTP 서비스를 제공했습니다. 하지만 최근 대부분의 리눅스 배포판에서는 chronyd를 기본 NTP 구현체로 채택하고 있습니다. chrony가 선호되는 이유는 다음과 같습니다:

  1. 빠른 초기 동기화: chrony는 시스템 시간을 더 빠르게 동기화합니다.
  2. 간헐적 네트워크 연결에서의 안정성: 노트북처럼 네트워크 연결이 불규칙한 환경에서도 잘 작동합니다.
  3. 리소스 효율성: 더 적은 메모리와 CPU를 사용합니다.
  4. 정확성: 더 정확한 시간 동기화 알고리즘을 사용합니다.
  5. 유연성: 다양한 환경에 맞게 설정할 수 있는 옵션이 많습니다.

 

Chrony 기본 구성 이해하기

Chrony는 두 개의 주요 구성 요소로 이루어져 있습니다:

  1. chronyd: 백그라운드에서 실행되는 데몬으로, 실제 시간 동기화를 담당합니다.
  2. chronyc: chronyd를 제어하고 모니터링하기 위한 명령줄 인터페이스입니다.

Chrony의 작동 흐름

  1. chronyd 데몬이 시작됩니다.
  2. 구성 파일에 지정된 NTP 서버들로부터 시간 정보를 수집합니다.
  3. 네트워크 지연 시간을 측정하고 보정합니다.
  4. 최적의 시간 소스를 선택하고 시스템 시간을 조정합니다.
  5. 시간이 크게 어긋난 경우 한 번에 조정하거나, 작은 차이인 경우 점진적으로 조정합니다.
  6. 지속적으로 시간을 모니터링하고 필요에 따라 조정합니다.

출처: claude 생성 이미지

 

Chrony 설치하기

대부분의 최신 리눅스 배포판에는 chrony가 기본으로 설치되어 있습니다. 설치되어 있지 않다면 패키지 관리자를 통해 쉽게 설치할 수 있습니다.

Red Hat 계열 (RHEL, CentOS, Fedora)

sudo dnf install chrony

Debian 계열 (Ubuntu, Debian)

sudo apt-get update
sudo apt-get install chrony

SUSE 계열

sudo zypper install chrony

 

Chrony 구성 파일 설정

Chrony의 주요 설정 파일은 /etc/chrony.conf 또는 /etc/chrony/chrony.conf에 위치해 있습니다(배포판에 따라 다름). 이 파일을 통해 NTP 서버, 동기화 옵션, 보안 설정 등을 구성할 수 있습니다.

기본 설정 파일 예시

# NTP 서버 지정
server 0.pool.ntp.org iburst
server 1.pool.ntp.org iburst
server 2.pool.ntp.org iburst
server 3.pool.ntp.org iburst

# 시간 소스에서 층 대기 비활성화 (초기 동기화 속도 향상)
stratumweight 0

# 로컬 시계 드리프트 정보 저장 위치
driftfile /var/lib/chrony/drift

# 실시간 시계(RTC)를 UTC로 유지
rtcsync

# NTP 서버 허용 네트워크 범위
#allow 192.168.0.0/16

# 로깅 설정
logdir /var/log/chrony
log measurements statistics tracking

# 지역 시간대 설정
#local stratum 10

 

여러 서버 설정 시 우선순위:

 여러 NTP 서버를 설정할 경우, `prefer` 키워드가 지정된 서버가 우선적으로 선택됩니다. `prefer`가 없는 경우, Chrony는 내부 알고리즘에 따라 가장 신뢰할 수 있는 서버를 선택합니다.

설정 적용 순서:

  1. `/etc/chrony.conf` 파일을 로드합니다.
  2. `/etc/chrony.d/` 디렉토리 내의 `.conf or .sources` 파일들을 알파벳 순서로 로드합니다.

*동일한 설정 항목이 중복될 경우, 마지막에 로드된 설정이 적용됩니다.

주의사항:

  • 설정 파일의 로드 순서를 명확히 관리하기 위해, `/etc/chrony.d/` 내의 파일명에 숫자나 알파벳을 접두사로 사용하여 원하는 순서대로 로드되도록 할 수 있습니다. 예: `00-default.conf`, `10-custom.conf` 등.
  • 설정 변경 후에는 Chrony 서비스를 재시작하여 변경 사항을 적용해야 합니다

 

주요 설정 옵션 설명

NTP 서버 설정

server [주소] [옵션]
  • 주소: NTP 서버의 IP 주소나 도메인 이름
  • 옵션:
    • iburst: 초기 동기화를 빠르게 하기 위해 여러 개의 패킷을 한 번에 보냅니다.
    • burst: 폴링 간격마다 여러 패킷을 보냅니다.
    • minpoll, maxpoll: 최소/최대 폴링 간격(초의 로그 값, 예: 6은 64초)
    • prefer: 이 서버를 우선적으로 사용합니다.

시간 소스 설정

pool pool.ntp.org iburst

pool 명령은 여러 개의 NTP 서버를 자동으로 선택하는 DNS 기반 부하 분산을 사용합니다.

로컬 시계 드리프트 파일

driftfile /var/lib/chrony/drift

시스템 시계의 드리프트 정보를 저장하는 파일입니다. 이 정보를 통해 chronyd는 재시작 후에도 이전의 보정 정보를 유지할 수 있습니다.

실시간 시계 동기화

rtcsync

시스템 시계를 하드웨어 RTC(Real-Time Clock)와 동기화합니다.

NTP 클라이언트 접근 제어

allow 192.168.0.0/16
deny 10.0.0.0/8

특정 네트워크나 호스트가 이 서버를 NTP 서버로 사용할 수 있는지 설정합니다.

로컬 Stratum 설정

local stratum 10

외부 NTP 서버에 연결할 수 없을 때 로컬 시계를 특정 stratum으로 설정합니다.

makestep 설정

makestep 1.0 3

시간 차이가 1.0초를 초과할 때 최대 3번까지 시간을 즉시 조정합니다. 이후에는 점진적으로 조정합니다.

 

Chrony 서비스 관리

서비스 시작/중지/재시작

systemd 기반 시스템 (대부분의 최신 배포판)

# 서비스 시작
sudo systemctl start chronyd

# 서비스 중지
sudo systemctl stop chronyd

# 서비스 재시작
sudo systemctl restart chronyd

# 부팅 시 자동 시작 설정
sudo systemctl enable chronyd

# 부팅 시 자동 시작 해제
sudo systemctl disable chronyd

# 서비스 상태 확인
sudo systemctl status chronyd

SysV init 기반 시스템 (오래된 배포판)

# 서비스 시작
sudo service chrony start

# 서비스 중지
sudo service chrony stop

# 서비스 재시작
sudo service chrony restart

# 부팅 시 자동 시작 설정
sudo chkconfig chrony on

# 서비스 상태 확인
sudo service chrony status

 

NTP 상태 확인 및 문제 해결

Chrony는 chronyc 명령을 통해 상태를 확인하고 문제를 해결할 수 있는 다양한 기능을 제공합니다.

기본 상태 확인

현재 시간 소스 확인

chronyc sources

출력 예시:

MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp1.example.com             2   9   377    35  -1015us[-1015us] +/-   12ms
^- ntp2.example.com             2   9   377    35    +12ms[  +12ms] +/-   47ms
^+ ntp3.example.com             2   9   377    35  +2461us[+2461us] +/-   33ms
  • MS: 서버 상태 플래그
    • *: 현재 동기화 중인 서버
    • +: 신뢰할 수 있는 서버
    • -: 제외된 서버
    • ?: 연결할 수 없는 서버
  • Stratum: 해당 서버의 stratum 레벨
  • Poll: 폴링 간격(초의 로그 값)
  • Reach: 최근 8번의 폴링 성공 여부(8진수 비트마스크)
  • LastRx: 마지막으로 응답을 받은 시간
  • Last sample: 마지막 시간 차이 샘플

자세한 시간 소스 정보

chronyc sourcestats

출력 예시:

Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
ntp1.example.com          17  10  289m     +0.035      0.030    +14us    57us
ntp2.example.com          14   8  274m     -0.007      0.019    -25us    41us
ntp3.example.com          12   6  236m     +0.025      0.050    +29us    76us
  • NP: 처리된 샘플 수
  • NR: 거부된 샘플 수
  • Span: 샘플의 시간 범위
  • Frequency: 주파수 오프셋(ppm)
  • Freq Skew: 주파수 오프셋 안정성
  • Offset: 예상 시간 오프셋
  • Std Dev: 오프셋의 표준 편차

시간 동기화 상태 확인

chronyc tracking

출력 예시:

Reference ID    : C0A80001 (ntp1.example.com)
Stratum         : 3
Ref time (UTC)  : Wed Mar 30 05:34:12 2025
System time     : 0.000000015 seconds slow of NTP time
Last offset     : +0.000013514 seconds
RMS offset      : 0.000027725 seconds
Frequency       : 15.916 ppm fast
Residual freq   : +0.004 ppm
Skew            : 0.026 ppm
Root delay      : 0.013331386 seconds
Root dispersion : 0.000544 seconds
Update interval : 1026.2 seconds
Leap status     : Normal

이 출력은 현재 시스템 시계가 어떤 서버와 동기화되고 있는지, 얼마나 정확한지 등의 상세 정보를 제공합니다.

문제 해결 명령어

NTP 접근성 테스트

chronyc activity

이 명령은 현재 추적 중인 NTP 소스와 연결할 수 없는 소스의 수를 보여줍니다.

시간 소스 강제 갱신

sudo chronyc makestep

시스템 시간을 즉시 조정합니다. 일반적으로 시간 차이가 큰 경우 사용합니다.

구성 파일 다시 로드

sudo chronyc reload sources

구성 파일을 다시 로드하여 NTP 서버 목록을 갱신합니다.

디버깅 정보 확인

sudo chronyc -a

대화형 모드로 들어가 여러 명령을 실행할 수 있습니다.

 

실제 운영 환경에서의 Best Practice

다중 NTP 서버 구성

신뢰성과 정확성을 위해 최소 4개 이상의 NTP 서버를 구성하는 것이 좋습니다.

server 0.pool.ntp.org iburst
server 1.pool.ntp.org iburst
server 2.pool.ntp.org iburst
server 3.pool.ntp.org iburst

내부 NTP 서버 계층 구성

대규모 네트워크의 경우, 다음과 같은 계층 구조를 고려하세요:

  1. 소수의 서버를 외부 NTP 서버와 동기화 (Stratum 2)
  2. 내부 서버들은 이 Stratum 2 서버들과 동기화 (Stratum 3)
# Stratum 2 서버 설정
server 0.pool.ntp.org iburst
server 1.pool.ntp.org iburst

# 내부 클라이언트를 위한 접근 허용
allow 192.168.0.0/16
# Stratum 3 클라이언트 설정
server ntp-server-1.internal.example.com iburst
server ntp-server-2.internal.example.com iburst

보안 강화

NTP 서버를 안전하게 운영하기 위한 설정:

# 특정 네트워크만 접근 허용
allow 192.168.0.0/16

# 그 외 모든 접근 거부
deny all

# NTP 명령 접근 제한
cmdallow 192.168.1.0/24
cmddeny all

시간 동기화 모니터링

시간 동기화 문제를 조기에 발견하기 위한 모니터링 설정:

  1. 주기적으로 chronyc tracking의 출력을 로깅
  2. 시간 오프셋이 특정 임계값을 초과할 경우 알림 설정
  3. NTP 서버 연결 실패 시 알림 설정

모니터링 스크립트 예시:

#!/bin/bash
OFFSET=$(chronyc tracking | grep "Last offset" | awk '{print $4}')
THRESHOLD=0.05

if (( $(echo "$OFFSET > $THRESHOLD" | bc -l) )); then
    echo "Time offset exceeds threshold: $OFFSET seconds" | mail -s "NTP Alert" admin@example.com
fi

 

결론

정확한 시간 동기화는 현대 시스템 관리에서 중요한 부분입니다. Chrony는 이전 NTP 데몬보다 더 빠르고, 정확하며, 유연한 시간 동기화 솔루션을 제공합니다. 이 글에서 설명한 기본 개념과 설정 방법을 통해 리눅스 서버에서 NTP를 효과적으로 관리할 수 있을 것입니다.

시간 동기화는 네트워크 보안, 데이터베이스 트랜잭션, 로그 분석 등 많은 시스템 기능의 기반이 되므로, 적절한 NTP 설정과 모니터링은 시스템 관리자의 중요한 업무 중 하나입니다. 특히 여러 서버가 협업하는 환경에서는 더욱 중요하므로, 위에서 설명한 Best Practice를 참고하여 안정적인 시간 동기화 시스템을 구축하세요.

 

'IT > Linux' 카테고리의 다른 글

Linux kernel 엔트로피(Entropy)에 대한 이해와 관리  (0) 2023.09.01

댓글