DNS를 바꾸려고 resolv.conf를 고쳤다가 사라졌다 — 네트워크 관리

DNS 서버를 바꾸려고 /etc/resolv.conf를 직접 편집했다. 잘 되는 듯했는데 재부팅하니 원래대로 돌아갔다. 왜? Rocky 10에선 NetworkManager가 /etc/resolv.conf를 자동 관리한다. 직접 편집하면 덮어쓴다. DNS 변경은 nmcli로 해야 한다.

이런 함정이 네트워크 관리엔 많다. 서버의 대부분은 네트워크로 통신하고, IP 설정·포트 점검·DNS 오류·라우팅 문제는 운영 일상이다. 이 글은 컴퓨터가 서로 통신하는 세 가지 기반 — 서로를 식별할 주소(IP), 데이터를 전달할 경로(라우팅), 이름을 주소로 바꿀 DNS — 과, Rocky 10이 이걸 NetworkManager로 관리하는 방식을 다룬다.

우편 시스템으로 보는 네트워크 — 주소·포트·이름

네트워크 통신은 우편 시스템과 정확히 대응된다(오래된 표준 비유):

  네트워크 우편
호스트 식별 IP 주소 우편번호 + 집 주소
서비스 구분 포트 번호 건물 내 호수(한 건물에 여러 수신자)
패킷 전달 라우팅 우체부 경로(목적지까지 거쳐가는 우체국들)
이름→주소 DNS 전화번호부
우체부 규칙 TCP/UDP 등기(TCP, 확실) / 엽서(UDP, 빠름)

우편 비유는 "주소-경로-이름해석" 구조만 잡는다. 패킷은 여러 홉을 거치며 분할/재조립되고, 포트는 동시 다수 연결이 가능하다는 점에서 비유를 넘어선다.

IP 주소와 CIDR

  • IPv4: 32비트, 4옥텟(192.168.1.10). 약 43억 개.
  • CIDR 표기: 192.168.1.10/24 = 앞 24비트가 네트워크(255.255.255.0).
    • /24 → 호스트 254개(네트워크·브로드캐스트 주소 제외, 256이 아님). /30 → 2개(링크용). /16 → 65,534개.
대역 용도
10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 사설(인터넷 직접 불가, NAT 필요)
127.0.0.0/8 루프백(loopback, localhost)
169.254.0.0/16 링크 로컬(DHCP 실패 시 자동)

TCP vs UDP

항목 TCP UDP
연결 연결 지향(3-way handshake) 비연결
신뢰성 보장(재전송, 순서) 보장 없음
속도 느림 빠름
용도 웹(HTTP), 메일(SMTP), SSH DNS, DHCP, 스트리밍, VoIP

포트는 16비트(0~65535). 잘 알려진 포트(<1024)는 root 권한이 필요하다. 22(SSH), 25(SMTP), 53(DNS), 80, 443(HTTPS).

TCP/IP 계층 — 4개로 압축

flowchart TB
    L4[4. 응용 Application<br/>HTTP, SSH, DNS, SMTP] --> L3[3. 전송 Transport<br/>TCP, UDP]
    L3 --> L2[2. 인터넷 Internet<br/>IP, ICMP]
    L2 --> L1[1. 링크 Link<br/>이더넷, Wi-Fi]

OSI 7계층을 실용적으로 4개로 압축. 각 계층은 하위 계층을 이용한다.

라우팅과 DNS — 경로와 이름 해석

라우팅

패킷이 목적지까지 가는 경로 결정. 커널은 라우팅 테이블에서 가장 길게 매칭되는(longest prefix match) 엔트리를 선택한다.

  • 게이트웨이(next hop): 다음 라우터.
  • 기본 라우트(default, 0.0.0.0/0): 매칭 엔트리가 없을 때 쓰는 탈출구.

DNS와 이름 해석

호스트 이름 → IP 변환. 해석 순서는 /etc/nsswitch.confhosts: 줄이 결정한다(보통 files dns).

  • /etc/hosts: 정적 로컬 매핑(가장 먼저).
  • /etc/resolv.conf: DNS 서버 목록 — 그런데 Rocky 10에선 NetworkManager가 자동 관리.

핑은 되는데 DNS가 안 된다면? 핑은 IP 연결만 확인한다. DNS는 53번 포트로 따로 동작하니 dig로 확인해야 한다.

NetworkManager — Rocky 10의 네트워크 데몬

단일 데몬이 유선/무선/VPN/브리지/본딩을 통합 관리한다. 설정은 연결 프로필(key file) 단위.

flowchart LR
    NM[NetworkManager 데몬] --> CLI[nmcli / nmtui]
    NM --> PROF[연결 프로필<br/>/etc/NetworkManager/system-connections/]
    NM --> KERNEL[커널 네트워크 스택<br/>ip 명령으로 확인]
  • 설정 파일: /etc/NetworkManager/system-connections/<name>.nmconnection(key-file).
  • /etc/sysconfig/network-scripts/ifcfg-*는 더 이상 권장 아니다(RHEL 9부터 단계적 제거).
  • 인터페이스 명명: eth0 구식 → enp0s3(버스 기반 예측 가능 이름)이 현대 기본. en=이더넷, p0s3=버스 위치.

Rocky 10에서 직접 확인하기

미검증(출처 인용). Rocky 10 VM에서 실행 권장.

# 인터페이스·주소 (ip - 저수준)
ip addr show              # 모든 인터페이스 + 주소 (ip a)
ip -4 addr show           # IPv4만
ip link show              # 링크 상태(up/down)
ip route show             # 라우팅 테이블 (ip r)
ip route show default     # 기본 게이트웨이
ip neigh show             # ARP/이웃 테이블
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    link/ether 08:00:27:ab:cd:ef brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.50/24 brd 192.168.1.255 scope global enp0s3
default via 192.168.1.1 dev enp0s3 proto static metric 100
192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.50
# NetworkManager (nmcli) — 권장 설정
nmcli general status               # NM 상태
nmcli device status                # 장치 목록
nmcli connection show              # 모든 연결 프로필

# 정적 IP 설정
sudo nmcli connection modify "enp0s3" \
    ipv4.method manual \
    ipv4.addresses 192.168.1.50/24 \
    ipv4.gateway 192.168.1.1 \
    ipv4.dns "8.8.8.8 1.1.1.1"
sudo nmcli connection up "enp0s3"  # 활성화

# DHCP 복귀
sudo nmcli connection modify "enp0s3" ipv4.method auto
# 소켓/포트 (ss - netstat 대체)
ss -tlnp                # TCP 리스닝 + 프로세스
ss -ulnp                # UDP 리스닝
ss -tunap               # TCP+UDP 모든 소켓 + 프로세스
ss -t state established # established만
ss -s                   # 요약
State   Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
LISTEN  0      128    0.0.0.0:22          0.0.0.0:*         users:(("sshd",pid=1234,fd=3))
LISTEN  0      511    *:80                *:*               users:(("nginx",pid=5678,fd=6))

netstatdeprecated. ss를 써라.

# 진단 도구
ping -c 4 8.8.8.8                   # 연결성/지연
ping -c 4 example.com               # DNS+연결 동시 확인
tracepath example.com               # 경로 추적(traceroute 대체)
dig example.com                     # DNS 상세
dig +short example.com              # IP만
dig @8.8.8.8 example.com            # 특정 DNS 서버
getent hosts example.com            # nsswitch 전체 조회
curl -I https://example.com         # HTTP 헤더만
curl -v https://example.com         # 상세
# 로컬 이름 해석
cat /etc/hosts                      # 정적 매핑
cat /etc/nsswitch.conf | grep hosts # 해석 순서
cat /etc/resolv.conf                # DNS 서버(NM 관리, 직접 편집 금지)

흔히 묻는 것, 흔히 틀리는 것

오해 정정
"/etc/resolv.conf 직접 고치면 된다" Rocky 10에선 NM이 덮어씀. nmcli로
"netstat를 쓴다" deprecated. ss 사용
"인터페이스는 eth0" 현대는 enp0s3, ens33(예측 가능 이름). e=이더넷, w=무선
"서비스가 127.0.0.1에만 묶어도 외부 접속된다" 아니다. 0.0.0.0(모든 IF)이나 특정 IP로 바인딩해야
"/24면 호스트 256개" 254개(네트워크·브로드캐스트 주소 제외)
"핑 되면 DNS도 된다" 핑은 IP 연결만. DNS는 53번 따로. dig로 확인
"DNS는 캐시된다" 리눅스는 보통 시스템 DNS 캐시가 없음(nscd/systemd-resolved 안 쓰면). 매번 쿼리
"CIDR /30은 쓸모 없다" 링크용 2개 호스트(라우터 간). 실제로 자주 씀

더 깊이

  • IPv6: IPv4 고갈 대안. 128비트(2001:db8::1). /64가 표준 서브넷. SLAAC(자동 설정) 또는 DHCPv6. Rocky 10은 기본 듀얼스택(IPv4+IPv6).
  • 본딩·브리지: 본딩은 여러 NIC를 하나의 논리 인터페이스로(이중화/대역폭, mode 1 active-backup·mode 4 LACP). 브리지는 L2 스위치 역할(가상화/컨테이너가 호스트 LAN에 직접 참여).
  • 방화벽과 nftables: Rocky 10의 firewalld 백엔드는 nftables. 패킷 필터링 규칙은 nmcli가 아니라 firewall-cmd로(10장 참조).

요약 — 이 글의 결론

  • IP/CIDR: /24 = 255.255.255.0 = 호스트 254개(256 아님). 사설대역(10/172.16/192.168)은 NAT 없이 인터넷 불가.
  • TCP(신뢰, 연결, 3-way handshake) vs UDP(빠름, 비연결).
  • 포트: 잘 알려진 <1024(root 필요). 22/25/53/80/443.
  • 라우팅: longest prefix match. 기본 라우트(0.0.0.0/0)가 탈출구.
  • DNS 해석 순서: /etc/hosts → DNS(/etc/nsswitch.conf hosts: 줄).
  • NetworkManager(nmcli): Rocky 10 중심. /etc/resolv.conf를 자동 관리하니 직접 편집 금지. 인터페이스 이름은 enp0s3(예측 가능), 구 eth0 아님.
  • ss > netstat(deprecated). 바인딩: 127.0.0.1(로컬만) vs 0.0.0.0(모든 IF, 외부 접속 가능).

생각해 볼 문제

  1. IP 주소·포트·라우팅·DNS를 우편 시스템에 비유해 설명하라.
  2. TCP와 UDP의 차이. 어떤 서비스가 각각 어울리는가?
  3. /24 서브넷에서 사용 가능한 호스트 수는? 왜 256이 아닌가?
  4. 사설 IP 대역 3가지를 말하고, 왜 인터넷에 직접 못 나가는가?
  5. Rocky 10에서 DNS 서버를 바꾸려면 어떻게 하는가? 왜 /etc/resolv.conf 직접 편집이 위험한가?
  6. ss -tlnp 출력에서 127.0.0.1:800.0.0.0:80의 차이는?
  7. 핑은 되는데 DNS가 안 될 때 의심할 곳은?
  8. enp0s3라는 인터페이스 이름의 의미는?

참고

'Tech Artifacts > Linux' 카테고리의 다른 글

Linux - 11. services  (0) 2026.07.09
Linux - 10. security  (0) 2026.07.09
Linux - 08. package  (0) 2026.07.09
Linux - 07. shell script  (0) 2026.07.09
Linux - 06. io device  (0) 2026.07.09