대상 OS: Debian 12 (bookworm)
서버를 오래 운영하다 보면 네트워크 설정이 ‘한 번 맞춰두면 손 안 대는 영역’이 되기 쉽습니다. 그런데 장애가 나거나, NIC 이름이 바뀌거나, VLAN을 추가해야 할 때 가장 먼저 발목을 잡는 것도 네트워크입니다. Debian 12에서는 systemd가 기본이니, 네트워크도 systemd-networkd로 정리해두면 설정 위치가 명확해지고 트러블슈팅 동선이 짧아집니다.
이번 글은 ifupdown(/etc/network/interfaces) 기반 서버를 systemd-networkd로 전환하는 과정을 “되돌릴 수 있게” 진행하는 운영 관점 가이드입니다. 고정 IP + DNS + 기본 게이트웨이, 그리고 자주 쓰는 VLAN까지 포함합니다.
---
# 1) 전환 전 체크(현재 상태를 ‘채집’해두기)
전환은 결국 ‘같은 라우팅/주소/DNS를 다른 데몬이 재현’하는 작업입니다. 먼저 현재 구성을 텍스트로 남겨두면, 문제가 생겼을 때 비교가 쉽습니다.
1) 인터페이스/주소/라우트 덤프
ip -br link
ip -br addr
ip route
ip -6 route
resolvectl status 2>/dev/null || true
cat /etc/resolv.conf
2) ifupdown 설정 백업
sudo cp -a /etc/network/interfaces /etc/network/interfaces.bak.$(date +%F)
ls -l /etc/network/interfaces*
3) “원격 접속으로 작업 중”이면 안전장치
# tmux/스크린 권장(끊겨도 세션 유지)
tmux new -s net-migrate
---
# 2) 네트워크 스택 충돌 방지(누가 링크를 잡는지 1명만)
Debian 서버에서 흔한 조합은 아래 중 하나입니다.
- ifupdown (ifup/ifdown)
- NetworkManager (데스크탑/일부 서버)
- systemd-networkd
전환 후에는 systemd-networkd만 링크를 관리하게 만드는 게 핵심입니다.
1) NetworkManager가 있다면(서버라면 보통 제거/비활성)
systemctl is-enabled NetworkManager 2>/dev/null || true
systemctl is-active NetworkManager 2>/dev/null || true
# 있다면 우선 stop/disable(바로 제거가 부담되면)
sudo systemctl disable --now NetworkManager
2) ifupdown 서비스 정리(완전 삭제가 아니라 ‘비활성 + 파일 보관’)
# ifupdown 패키지가 설치되어 있는지 확인
dpkg -l | awk '/ifupdown/{print}'
# interfaces 파일은 보관하되, 자동으로 올리지 않도록
# (환경에 따라 networking.service 이름이 다를 수 있음)
sudo systemctl disable --now networking 2>/dev/null || true
sudo systemctl disable --now networking.service 2>/dev/null || true
주의: 일부 환경은 여전히 ifupdown이 부팅 시 hook처럼 동작합니다. 가장 안전한 방식은 “systemd-networkd가 정상 작동하는 걸 확인한 뒤” ifupdown을 purge하는 것입니다.
---
# 3) systemd-networkd + systemd-resolved 활성화
Debian 12에서는 systemd-resolved를 함께 쓰면 DNS 상태 확인(resolvectl)과 per-link DNS가 깔끔해집니다.
1) 서비스 활성화
sudo systemctl enable --now systemd-networkd
sudo systemctl enable --now systemd-resolved
2) /etc/resolv.conf 정리(중요)
ifupdown이나 다른 도구가 /etc/resolv.conf를 직접 건드리면 DNS가 자주 꼬입니다. systemd-resolved를 쓰려면 심볼릭 링크를 맞춰둡니다.
# 현재 상태 확인
ls -l /etc/resolv.conf
# systemd-resolved 표준 링크로 교체
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
# 혹은 로컬 스텁(127.0.0.53)이 싫으면 아래를 선택하기도 함
# sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
---
# 4) .network 파일로 고정 IP/게이트웨이/DNS 설정
systemd-networkd는 /etc/systemd/network/*.network 파일로 설정합니다. 파일명은 정렬만 영향을 주므로, 사람이 보기 좋게 이름을 붙이면 됩니다.
예시 상황:
- 실제 NIC: eno1
- IPv4 고정: 192.0.2.10/24
- 게이트웨이: 192.0.2.1
- DNS: 1.1.1.1, 8.8.8.8
1) 기본 NIC 설정 파일 생성
sudo tee /etc/systemd/network/10-eno1.network >/dev/null <<'NET'
[Match]
Name=eno1
[Network]
Address=192.0.2.10/24
Gateway=192.0.2.1
DNS=1.1.1.1
DNS=8.8.8.8
# 링크가 올라온 뒤 DNS 질의가 잘 되는지 확인하기 좋게
# (필수는 아님)
Domains=~.
NET
2) 적용
sudo systemctl restart systemd-networkd
sudo networkctl status eno1 --no-pager
ip -br addr show dev eno1
ip route
resolvectl status | sed -n '1,80p'
---
# 5) VLAN 추가: 802.1Q를 ‘명시적으로’ 올리기
운영에서 VLAN은 “갑자기 필요해지는 기능”의 대표입니다. systemd-networkd에서는 .netdev로 VLAN 인터페이스를 만들고, .network로 주소/DNS/라우팅을 붙입니다.
예시 VLAN:
- VLAN ID: 120
- 인터페이스: eno1.120
- 주소: 10.120.0.10/24
- 게이트웨이: 10.120.0.1
1) VLAN netdev 생성
sudo tee /etc/systemd/network/20-vlan120.netdev >/dev/null <<'NETDEV'
[NetDev]
Name=eno1.120
Kind=vlan
[VLAN]
Id=120
NETDEV
2) 부모 NIC에 VLAN을 ‘연결’
sudo tee /etc/systemd/network/10-eno1.network >/dev/null <<'NET'
[Match]
Name=eno1
[Network]
Address=192.0.2.10/24
Gateway=192.0.2.1
DNS=1.1.1.1
DNS=8.8.8.8
Domains=~.
VLAN=eno1.120
NET
3) VLAN 쪽 주소/라우트 설정
sudo tee /etc/systemd/network/30-eno1.120.network >/dev/null <<'NET'
[Match]
Name=eno1.120
[Network]
Address=10.120.0.10/24
Gateway=10.120.0.1
# VLAN 내부 DNS가 따로 있다면 여기서 per-link DNS를 분리 가능
# DNS=10.120.0.53
NET
4) 적용/검증
sudo systemctl restart systemd-networkd
networkctl --no-pager
ip -br addr show eno1 eno1.120
ip route
ping -c 2 192.0.2.1
ping -c 2 10.120.0.1
---
# 6) 전환 후 트러블슈팅: “안 되는 지점”을 빨리 특정하기
systemd-networkd는 로그와 상태가 잘 나옵니다. 습관적으로 아래 3개를 먼저 보세요.
1) link 상태/설정 적용 여부
networkctl status eno1 --no-pager
networkctl status eno1.120 --no-pager
2) 데몬 로그(최근 5분)
journalctl -u systemd-networkd --since "5 min ago" --no-pager
3) DNS가 애매할 때(Stub/링크별 DNS 확인)
resolvectl status --no-pager
resolvectl query deb.debian.org
자주 만나는 증상:
- 주소는 붙었는데 외부 통신이 안 된다 → 기본 게이트웨이/정책 라우팅/방화벽(nftables) 확인
- ping은 되는데 DNS만 실패 → /etc/resolv.conf 링크, resolved 활성화 여부, per-link DNS 확인
- VLAN 인터페이스가 안 생긴다 → 8021q 모듈(보통 자동 로드), netdev 파일명/Kind 확인
---
# 7) 롤백 플랜(원격 작업에서 가장 중요)
전환을 원격으로 하고 있다면 “되돌리는 명령”을 미리 준비해두는 게 운영입니다.
1) 즉시 롤백(네트워크가 끊기기 직전이라면 콘솔에서)
sudo systemctl disable --now systemd-networkd systemd-resolved
# ifupdown 쪽 서비스 되살리기
sudo systemctl enable --now networking 2>/dev/null || true
sudo systemctl enable --now networking.service 2>/dev/null || true
# resolv.conf를 기존 방식으로 돌려야 할 수 있음(환경마다 다름)
# 예: DHCP client가 생성하도록 하거나, 수동으로 nameserver를 적어둔 파일로 교체
2) “재부팅하면 살아나게” 만들기
# networkd 설정 파일을 잠시 치우기
sudo mkdir -p /root/networkd.rollback.$(date +%F)
sudo mv /etc/systemd/network/*.network /root/networkd.rollback.$(date +%F)/ 2>/dev/null || true
sudo mv /etc/systemd/network/*.netdev /root/networkd.rollback.$(date +%F)/ 2>/dev/null || true
---
# 8) 운영 팁: 설정을 ‘테스트 가능’하게 쪼개두기
- NIC별로 10-*, VLAN/브릿지/netdev는 20-*, 세부 라우팅은 30-*처럼 파일을 계층화하면 나중에 확장이 편합니다.
- DNS를 링크별로 분리할 계획이 있다면, 처음부터 systemd-resolved를 켜고 resolv.conf 링크를 맞춰두는 게 좋습니다.
- 팀 운영이라면 /etc/systemd/network를 Git으로 관리하는 것도 추천합니다(서버 템플릿/변경 이력 추적에 효과적).