DHCP는 IP 주소 풀(pool)을 서버가 중앙에서 관리하고, 클라이언트가 부팅할 때마다 임대(lease) 형태로 빌려 준다.
항목
수동 설정
DHCP
주소 할당
사람이 직접 입력
서버가 자동 배분
충돌 위험
높음
서버가 추적해 방지
이동성
매번 재설정
어디서든 자동
부가 정보
일일이 입력
게이트웨이·DNS도 함께 전달
DHCP는 IP뿐 아니라 서브넷 마스크·기본 게이트웨이·DNS 서버·도메인 이름 같은 설정 일체를 함께 내려 준다.
즉 클라이언트는 IP 하나가 아니라 "네트워크에 참여하는 데 필요한 모든 좌표"를 한 번에 받는다.
DHCP가 주는 것은 소유가 아니라 임대(lease)다. 일정 기간(lease time)만 빌려 주고, 클라이언트는 절반쯤 지나면 갱신(renew)을 시도한다. 그래서 떠난 기기의 IP는 시간이 지나면 회수되어 재활용된다. 정적 IP가 아닌 한 "이 IP는 영원히 내 것"이 아니라는 점이 핵심이다.
[클라이언트] [DHCP 서버]
|---- DISCOVER (브로드캐스트) ------->| 아직 IP 없음 → 0.0.0.0에서 출발
|<--- OFFER (제안 IP 포함) -----------|
|---- REQUEST (수락 통보) ----------->|
|<--- ACK (임대 확정) ----------------|
| 이제 IP 사용 가능 |
첫 DISCOVER는 클라이언트가 아직 IP가 없으므로 브로드캐스트(255.255.255.255)로 나간다.
DHCP 서버가 여러 대면 각각 OFFER를 보낼 수 있다. 클라이언트는 보통 가장 먼저 도착한 제안을 택한다.
REQUEST에 "어느 서버의 제안을 받아들였는지"를 명시해 나머지 서버에게는 거절을 알린다.
DHCP는 UDP를 쓰며 서버는 67번, 클라이언트는 68번 포트를 사용한다. 클라이언트가 IP가 없는 상태에서 통신해야 하므로 출발지 IP는 0.0.0.0, 목적지는 브로드캐스트가 된다. 또한 브로드캐스트는 라우터를 넘지 못하므로, 다른 서브넷의 DHCP 서버를 쓰려면 중간 라우터에 DHCP 릴레이(relay agent)를 설정해 요청을 대신 전달하게 해야 한다. "DHCP는 브로드캐스트라 라우터 너머는 릴레이 필요"가 핵심 포인트다.
# 전역 기본값default-lease-time 600; # 기본 임대 시간(초)max-lease-time 7200; # 최대 임대 시간(초)authoritative; # 이 네트워크의 공식 DHCP 서버 선언subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.200; # 배분할 IP 범위(pool) option routers 192.168.1.1; # 기본 게이트웨이 option subnet-mask 255.255.255.0; # 서브넷 마스크 option domain-name-servers 192.168.1.10; # DNS 서버 option domain-name "example.com"; # 도메인 이름}# 특정 장비에 고정 IP 할당(MAC 기준)host printer { hardware ethernet 00:1A:2B:3C:4D:5E; # 대상 MAC 주소 fixed-address 192.168.1.50; # 항상 이 IP를 줌}
지시어
역할
range
동적으로 배분할 IP 주소 범위(풀)
default-lease-time / max-lease-time
임대 기간(초) 기본값·최대값
option routers
클라이언트에게 알려 줄 기본 게이트웨이
option domain-name-servers
DNS 서버 주소
option subnet-mask
서브넷 마스크
host + hardware ethernet + fixed-address
특정 MAC에 고정 IP 예약
authoritative
이 서브넷의 공인 DHCP 서버임을 선언
⚠️ 함정: 고정 IP를 예약할 때 핵심은 hardware ethernet(MAC 주소)으로 장비를 식별하고 fixed-address로 줄 IP를 지정하는 것이다. 이때 고정 IP는 range로 지정한 동적 풀 밖에 두는 것이 안전하다 — 풀 안에 두면 동적 배분과 충돌할 수 있다. 또한 range의 IP 범위가 게이트웨이나 서버 IP를 포함하지 않도록 해야 한다.
DHCP의 전신은 BOOTP(Bootstrap Protocol)다. BOOTP는 디스크 없는 워크스테이션이 부팅할 때 IP를 받으려고 만들어졌는데, 주소를 영구 할당하고 수동 매핑이 필요했다. DHCP는 여기에 "임대"와 "자동 풀 관리" 개념을 더해 확장한 것이라, 지금도 같은 포트(67/68)와 메시지 형식의 상당 부분을 공유한다. 그래서 dhcpd.conf에서 BOOTP 호환 옵션을 종종 보게 된다.
우리 서버는 보통 인터넷의 Stratum 2~3 풀(pool.ntp.org)에 동기화한다.
Stratum 16은 "동기화 안 됨"을 뜻하는 특수값이다.
NTP는 단순히 시간을 "받아서 덮어쓰는" 것이 아니라, 왕복 지연(round-trip delay)과 오프셋을 계산해 네트워크 지연을 보정하며 시계를 서서히 조정(slew)한다. 시간을 갑자기 점프시키면 로그·타이머가 깨지므로, 작은 오차는 시계 속도를 미세하게 빠르거나 느리게 만들어 부드럽게 맞춘다. 이것이 시간 동기화가 단순 복사가 아닌 이유다.
# 동기화할 시간 서버(또는 풀)pool 2.pool.ntp.org iburstserver time.bora.net iburst # 특정 서버 지정# 시스템 시계를 RTC(하드웨어 시계)에 기록rtcsync# 클라이언트(하위 네트워크)에 시간 제공 허용allow 192.168.1.0/24# 외부 동기화 불가 시 자신을 stratum 10으로 간주local stratum 10
지시어
역할
server / pool
동기화 대상 시간 서버. iburst는 시작 시 빠르게 여러 번 질의
allow
이 서버를 시간 소스로 쓸 수 있는 클라이언트 대역
rtcsync
시스템 시각을 하드웨어 시계(RTC)에 반영
local stratum
외부 소스 단절 시 자체 stratum 값
상태 확인 명령(실기 대상)은 다음 네 가지다.
chronyc sources # 동기화 중인 시간 소스 목록·상태chronyc sources -v # 상세(범례 포함)chronyc tracking # 현재 동기화 정확도·오프셋·stratumtimedatectl # 시스템 시간·타임존·NTP 동기화 여부
⚠️ 함정: chronyc sources의 출력에서 소스 앞의 기호가 의미를 가진다. *는 현재 동기화 중인 기준 소스, +는 후보, ?는 도달 불가, x는 잘못된 시계(falseticker)다. 또한 server는 한 대를 지정하고 pool은 DNS가 여러 IP를 돌려주는 풀을 지정한다는 차이를 묻는 문제가 나온다. ntpd와 chrony를 동시에 켜면 53번이 아니라 123번 UDP 포트를 두고 충돌하므로 한쪽만 켜야 한다.
# 시간 상태 한눈에timedatectl # NTP 동기화 여부, 로컬/UTC 시각, 타임존chronyc tracking # 기준 서버·오프셋·stratum 확인chronyc sources # 어떤 서버에 붙어 있는지# 타임존 변경timedatectl set-timezone Asia/Seoul# DHCP 임대 즉시 갱신 후 확인dhclient -r eth0 && dhclient eth0ip addr show eth0 # 받은 IP 확인
timedatectl 출력에 NTP synchronized: yes가 보이면 시간이 정상 동기화된 것이다.
chronyc tracking의 Stratum과 Last offset(현재 오차)을 함께 보면 동기화 품질을 가늠할 수 있다.