13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] Netplan

  • [Linux] 리눅스 서버 네트워크 연결 장애: IP 설정부터 방화벽까지 디버깅 5단계

    [Linux] 리눅스 서버 네트워크 연결 장애: IP 설정부터 방화벽까지 디버깅 5단계

    [리눅스] 리눅스 서버 네트워크 연결 장애: IP 설정부터 방화벽까지 디버깅 5단계

    리눅스 네트워크 장애는 평소엔 조용하다가 꼭 바쁠 때 터지더라고요. SSH는 안 붙고, 서비스 Health Check(헬스 체크, 상태 확인)는 빨갛게 뜨고, 팀 메신저에는 왜 서버가 안 되냐는 메시지가 쌓입니다. 저도 홈랩이랑 운영 서버를 만지면서 비슷한 상황을 정말 많이 겪었는데, 처음엔 케이블 문제인가 싶었는데, 실제로는 리눅스 IP 설정 하나가 꼬였던 적도 있었고, 반대로 IP는 멀쩡한데 iptables(아이피테이블스, 리눅스 패킷 필터) 규칙 때문에 통신이 막힌 적도 많았어요.

    그래서 오늘은 제가 실제로 쓰는 기준으로 리눅스 네트워크 장애를 좁혀 가는 5단계 디버깅 흐름을 정리해보겠습니다. 무작정 재부팅부터 하는 게 아니라, 아래에서 위로 차근차근 확인하는 방식이죠. 특히 Ubuntu 계열에서 자주 쓰는 netplan(넷플랜, 네트워크 설정 추상화 도구), systemd-networkd(시스템디 네트워크 관리 데몬), 그리고 방화벽 쪽의 nftables(엔에프테이블스, 최신 패킷 필터 프레임워크)까지 같이 보겠습니다.

    리눅스 네트워크 장애 점검 순서를 보여주는 전체 흐름도

    리눅스 서버에서 링크 상태, IP 설정, 라우팅, DNS, 방화벽 순서로 점검하는 전체 디버깅 흐름을 보여주는 개요 이미지입니다.

    리눅스 네트워크를 층으로 나눠 봐야 하는 이유

    쉽게 말해 네트워크 장애는 한 덩어리가 아니라 여러 층으로 나뉘어 있거든요. 물리 링크가 살아 있는지, 인터페이스가 Up(업, 활성화) 상태인지, IP가 붙었는지, 기본 게이트웨이(Default Gateway, 기본 경로)가 맞는지, 이름 해석 DNS가 되는지, 마지막으로 방화벽이 막고 있지는 않은지요. 여기서 중요한 포인트는 위 증상만 보고 아래 원인을 단정하면 삽질이 길어진다는 점입니다.

    제가 직접 해보니 제일 효율적인 방법은 이렇더라고요. 1단계에서 링크와 인터페이스를 확인하고, 2단계에서 리눅스 IP 설정을 보고, 3단계에서 라우팅과 DNS를 확인한 뒤, 4단계에서 netplan과 systemd-networkd를 보고, 마지막 5단계에서 iptables 또는 nftables를 점검하는 겁니다. 이 순서대로 보면 원인 범위가 빠르게 줄어들어요.

    리눅스 네트워크 장애 디버깅 5단계

    1단계. 링크 상태와 인터페이스 확인 (제일 많이 놓치는 부분)

    제일 먼저 보는 건 케이블, 가상 NIC, 스위치 포트, 인터페이스 상태입니다. 이 단계에서 해결되는 경우가 생각보다 많더라고요. 특히 VM(가상머신)에서는 가상 스위치 설정이, 베어메탈에서는 포트 비활성화가 원인일 때가 꽤 있거든요.

    ip link show
    ip -br link
    ethtool eth0
    

    여기서 보는 포인트는 간단해요.

    1. 인터페이스 상태가 UP인지 확인하세요.
    2. LOWER_UP 표시가 있는지 봐야 합니다. 이게 없으면 링크 자체가 안 잡힌 경우가 많거든요.
    3. ethtool로 Speed(속도), Duplex(이중화 모드), Link detected 여부를 봅니다.

    예를 들어 인터페이스가 내려가 있으면 이렇게 올릴 수 있어요.

    sudo ip link set eth0 up
    

    별거 아닌 것 같지만, 저도 예전에 테스트하다가 인터페이스를 내려놓고 그대로 잊어버려서 한참 헤맨 적이 있습니다. 진짜 허무했어요 ㅎㅎ

    2단계. 리눅스 IP 설정 확인

    다음은 IP 주소, 서브넷 마스크(Subnet Mask, 네트워크 범위 정보), DHCP(디에이치씨피, 자동 IP 할당) 여부를 확인하는 거예요. 여기서 리눅스 IP 설정이 의도와 다르게 잡혀 있으면 외부 통신이 바로 꼬입니다.

    ip addr show
    ip -br addr
    hostname -I
    

    출력에서 확인할 것은 아래입니다.

    • 예상한 인터페이스에 IP가 붙었는지
    • 대역이 맞는지 예: 192.168.10.0/24
    • 중복 IP 가능성은 없는지
    • DHCP로 받아야 하는 서버인데 주소가 비어 있지는 않은지

    Ubuntu 서버에서 netplan을 쓴다면 설정 파일은 보통 이렇게 생겨요.

    network:
      version: 2
      renderer: networkd
      ethernets:
        eth0:
          dhcp4: false
          addresses:
            - 192.168.10.20/24
          routes:
            - to: default
              via: 192.168.10.1
          nameservers:
            addresses:
              - 1.1.1.1
              - 8.8.8.8
    

    설정 반영은 아래처럼 하면 됩니다.

    sudo netplan generate
    sudo netplan apply
    

    처음엔 이게 뭔가 싶었는데, YAML(야믈, 들여쓰기 기반 설정 형식) 들여쓰기 하나만 틀려도 적용이 안 되더라고요. 그래서 저는 반영 전에 꼭 눈으로 한 번 더 봅니다.

    리눅스 IP 설정과 netplan 점검 장면

    netplan YAML 설정과 ip 명령 결과를 나란히 확인하는 실전 점검 장면을 담은 이미지입니다.

    3단계. 라우팅과 DNS 확인

    IP가 붙어 있어도 목적지로 가는 길이 없으면 통신이 안 되거든요. 그래서 라우팅 테이블(Route Table, 경로 정보)과 DNS를 따로 봐야 합니다. 이 구간에서 많이들 헷갈리세요. 핑은 IP로 되는데 도메인은 안 된다면 DNS 쪽일 가능성이 높고, 같은 대역은 되는데 외부가 안 된다면 기본 게이트웨이 문제일 가능성이 커요.

    ip route show
    ip route get 8.8.8.8
    ping -c 4 192.168.10.1
    ping -c 4 8.8.8.8
    getent hosts example.com
    resolvectl status
    

    제가 주로 이렇게 해석하더라고요.

    증상 가능성 높은 원인 우선 확인할 것
    게이트웨이 핑 실패 L2 링크, VLAN, 잘못된 IP 케이블, 스위치, 인터페이스 상태
    외부 IP 핑 실패 기본 라우트 누락, 업스트림 차단 ip route, 게이트웨이
    도메인만 실패 DNS 설정 오류 nameserver, resolvectl
    특정 포트만 실패 방화벽 또는 서비스 미기동 ss, iptables, nftables

    여기서 중요한 포인트! DNS 문제를 네트워크 전체 장애로 오해하는 경우가 정말 많아요. 실제로 써보니까 IP 통신과 이름 해석을 분리해서 보는 습관이 장애 시간을 많이 줄여줍니다.

    4단계. netplan, systemd-networkd 로그 확인

    설정 파일이 맞아 보여도 실제 적용 과정에서 실패할 수 있거든요. 특히 cloud-init(클라우드이닛, 초기 인스턴스 설정 도구)와 netplan이 같이 엮인 환경에서는 예상과 다르게 덮어써지는 경우도 있어요.

    networkctl status eth0
    systemctl status systemd-networkd
    journalctl -u systemd-networkd --no-pager
    sudo netplan try
    

    netplan try는 꽤 유용하더라고요. 원격 서버에서 네트워크 설정 바꿀 때 잘못 적용하면 SSH가 끊길 수 있거든요. 이 명령은 일정 시간 안에 확인하지 않으면 롤백되는 방식이라 조금 더 안전합니다.

    저도 홈랩에서 라우트를 바꾸다가 접속이 끊겨서 콘솔로 다시 들어간 적이 몇 번 있어요. 그 뒤로는 원격 작업에서는 무조건 보수적으로 갑니다. 가능하면 콘솔 접근 경로를 하나 확보하고 작업하시길 권장합니다.

    리눅스 네트워크 장애 원인을 systemd-networkd 로그로 분석하는 모습

    systemd-networkd 상태 출력과 journal 로그를 보며 적용 실패 원인을 찾는 디버깅 장면입니다.

    5단계. iptables, nftables, 서비스 포트 확인

    마지막 단계는 방화벽과 리스닝 포트(Listening Port, 대기 중인 서비스 포트)예요. 여기까지 왔는데도 통신이 안 되면, 사실 방화벽일 때가 꽤 많습니다. 특히 오래된 서버는 iptables를, 최근 배포판은 nftables를 쓰는 경우가 많아서 둘 다 확인해야 헷갈리지 않아요.

    sudo iptables -L -n -v
    sudo iptables -S
    sudo nft list ruleset
    ss -tulpn
    

    체크 포인트는 이렇습니다.

    • INPUT 체인 기본 정책이 DROP인지
    • SSH, HTTP, HTTPS 등 필요한 포트 허용 규칙이 있는지
    • 서비스가 실제로 해당 포트에서 listen 중인지
    • iptables와 nftables가 혼재되어 정책을 헷갈리게 만들고 있지는 않은지

    예를 들어 SSH 22/tcp가 막혀 있으면 서버는 살아 있어도 접속이 안 돼요. 반대로 방화벽은 열려 있는데 서비스가 안 떠 있으면 역시 안 되죠. 그래서 저는 항상 패킷 필터와 서비스 포트를 같이 봅니다.

    ⚠️ 실제로 자주 겪는 트러블슈팅 포인트

    여기서는 제가 삽질 좀 했던 사례를 중심으로 적어보겠습니다. 혹시 이런 경험 있으신가요? 겉으로는 리눅스 네트워크 장애처럼 보이는데, 실제 원인은 아주 사소한 설정 하나인 경우 말입니다.

    1. YAML 들여쓰기 오류
      netplan은 형식이 엄격해요. 공백 수가 틀리면 적용이 실패하거나 의도와 다르게 해석됩니다.
    2. 인터페이스 이름 혼동
      예전엔 eth0로 익숙했는데, 환경에 따라 ens18, enp1s0처럼 다르게 보여요. 설정 파일과 실제 NIC 이름이 다르면 당연히 안 붙습니다.
    3. 기본 라우트 누락
      같은 대역 통신만 되고 외부가 안 되는 전형적인 증상이죠.
    4. DNS 서버 미설정
      핑은 되는데 apt 업데이트나 도메인 접근이 안 됩니다.
    5. 방화벽 정책 잔존
      이전 작업에서 넣어둔 DROP 규칙이 그대로 남아 있는 경우가 있더라고요.

    이런 문제를 줄이려면 변경 전후 비교가 중요합니다. 저는 보통 현재 상태를 먼저 저장해 둬요.

    ip addr show
    ip route show
    resolvectl status
    sudo iptables -S
    sudo nft list ruleset
    

    그리고 변경 후에는 꼭 다시 비교합니다. 이 습관이 쌓이면 리눅스 네트워크 디버깅 속도가 확실히 빨라집니다.

    검증 방법: 어디까지 확인해야 정말 해결된 걸까요?

    설정만 반영됐다고 끝이 아닙니다. 리눅스 네트워크 장애는 재현이 사라진 것처럼 보여도 실제 서비스 경로가 여전히 막혀 있을 수 있거든요. 그래서 저는 최소한 아래 검증은 꼭 합니다.

    1. 게이트웨이 핑 확인
    2. 외부 IP 핑 확인
    3. 도메인 이름 해석 확인
    4. 필요 포트 접속 확인
    5. 서비스 로그와 클라이언트 관점 확인
    ping -c 2 192.168.10.1
    ping -c 2 8.8.8.8
    getent hosts example.com
    curl -I http://example.com
    nc -zv 127.0.0.1 22
    

    여기까지 다 통과하면 거의 끝입니다. 드디어 됐다! 싶은 순간이 오죠. 다만 운영 환경이라면 여기서 한 번 더, 다른 서버나 사용자 위치에서 역방향 확인도 해보시는 걸 권장합니다. 서버 안에서만 되는 경우가 있거든요.

    리눅스 네트워크 장애 복구 후 검증 화면

    ping, curl, 포트 체크 결과가 정상으로 돌아온 모습을 한눈에 보여주는 검증 이미지입니다.

    정리 표: 단계별 점검 포인트 한 번에 보기

    단계 확인 명령 핵심 질문
    1. 링크 ip link, ethtool 인터페이스와 물리 링크가 살아 있나?
    2. IP ip addr 리눅스 IP 설정이 맞게 붙었나?
    3. 라우팅/DNS ip route, getent, resolvectl 길이 있나? 이름 해석이 되나?
    4. 설정 적용 netplan, networkctl, journalctl 설정이 실제로 반영됐나?
    5. 방화벽/포트 iptables, nft, ss 패킷과 서비스 포트가 열려 있나?

    이 표만 머릿속에 넣어두셔도 현장에서 꽤 도움이 됩니다. 특히 초반에 당황해서 이것저것 동시에 건드리기 시작하면 원인 추적이 더 어려워져요. 순서대로, 하나씩, 확인한 사실만 쌓아가는 게 제일 빠릅니다.

    리눅스 네트워크 장애 5단계 디버깅 요약 인포그래픽

    링크, IP, 라우팅, 설정 적용, 방화벽 점검 순서를 한 장으로 요약한 체크리스트 이미지입니다.

    마무리: 리눅스 네트워크 장애는 감으로 풀기보다 순서로 푸는 게 낫습니다

    오늘 정리한 흐름의 핵심은 단순합니다. 리눅스 네트워크 장애가 생기면 링크, IP, 라우팅, DNS, 설정 적용, 방화벽 순서로 보자는 거예요. 저도 처음엔 여기저기 막 건드렸는데, 실제로 써보니까 장애 대응에서 제일 중요한 건 화려한 명령어보다 점검 순서였습니다.

    특히 netplan과 systemd-networkd를 쓰는 환경에서는 설정 파일과 적용 로그를 같이 봐야 하고, 구형 환경이나 혼재된 환경에서는 iptables와 nftables를 둘 다 체크해야 합니다. 이 부분만 익숙해져도 리눅스 네트워크 디버깅이 훨씬 덜 막막해집니다.

    다음 글에서는 tcpdump(티씨피덤프, 패킷 캡처 도구)로 패킷 흐름을 직접 보면서 원인을 좁히는 방법도 다뤄보겠습니다. 이전 글에서 다뤘던 홈랩 VLAN 구성 글이 있다면 같이 보셔도 흐름 이해에 도움이 됩니다. 현장에서 바로 써먹을 수 있는 기준으로 계속 정리해보겠습니다.

    자주 묻는 질문

    Q1. ping은 되는데 웹 접속만 안 되면 어디부터 봐야 하나요?

    A. 보통은 서비스 포트와 방화벽을 먼저 봅니다. ss -tulpn으로 리스닝 여부를 확인하고, 그다음 iptables 또는 nftables 규칙을 점검해보세요.

    Q2. netplan apply 전에 더 안전한 방법이 있나요?

    A. 원격 서버라면 netplan try를 먼저 권장합니다. 잘못 적용돼도 자동 롤백되는 흐름이라 실수 비용이 줄어듭니다.

    Q3. DNS 문제와 라우팅 문제는 어떻게 구분하나요?

    A. IP로는 되는데 도메인만 안 되면 DNS 문제일 가능성이 커요. 반대로 외부 IP 자체가 안 되면 라우팅이나 게이트웨이를 먼저 보시면 됩니다.

  • [리눅스] NetworkManager vs systemd-networkd 비교: 최적의 선택은?

    [리눅스] NetworkManager vs systemd-networkd 비교: 최적의 선택은?

    [리눅스] NetworkManager vs systemd-networkd 비교: 최적의 선택은?

    리눅스에서 네트워크가 한 번 꼬이기 시작하면, 진짜 별거 아닌 설정 하나 때문에 한참 붙잡고 있게 되더라고요. 특히 NetworkManager systemd-networkd 비교를 제대로 안 하고 그냥 배포판 기본값만 따라가면, 데스크톱에서는 편한데 서버에서는 과한 경우가 있고, 반대로 서버에서는 깔끔한데 노트북에서는 불편한 경우가 생깁니다. 저도 홈랩에서 Ubuntu, Debian, Fedora 계열을 섞어 쓰면서 리눅스 네트워크 관리 방식 때문에 삽질 좀 했습니다 ㅎㅎ

    이번 글에서는 제가 실제로 운영하면서 느낀 기준으로, NetworkManager와 systemd-networkd를 비교해보겠습니다. 쉽게 말해 둘 다 네트워크 인터페이스를 올리고 IP, 게이트웨이, DNS를 관리하는 도구인데, 철학과 쓰임새가 꽤 다릅니다. 데스크톱, 노트북, 서버, 홈랩 환경에서 뭐가 더 잘 맞는지 감 잡으실 수 있게 정리해볼게요.

    NetworkManager systemd-networkd 비교를 보여주는 리눅스 네트워크 아키텍처 이미지

    데스크톱, 노트북, 서버 환경에서 두 도구가 어디에 잘 맞는지 한눈에 보여주는 개요 이미지입니다.

    1. 왜 이 비교가 중요한가: 서버 네트워크 설정은 한번 정하면 오래 갑니다

    네트워크 설정 도구는 단순히 IP만 넣는 수준이 아닙니다. DNS Resolver(리졸버, 이름 해석기), Bridge(브리지, 가상 스위치), Bonding(본딩, 다중 NIC 묶기), VLAN(가상 LAN), Wi-Fi(무선 네트워크), VPN(가상사설망)까지 이어지거든요. 처음 선택이 애매하면 운영 중간에 갈아타면서 서비스 다운타임까지 생길 수 있습니다.

    제가 직접 해보니 데스크톱 네트워크는 사용자가 자주 바뀌는 연결 상태를 다뤄야 해서 자동화와 UI가 중요했고, 반대로 서버 네트워크 설정은 단순하고 예측 가능한 구성이 더 중요했습니다. 여기서 중요한 포인트! 편의성이 곧 정답은 아니고, 단순함이 곧 만능도 아닙니다.

    2. 개념부터 쉽게: NetworkManager와 systemd-networkd는 뭐가 다른가

    쉽게 말해 NetworkManager는 사용자 환경 친화적인 네트워크 관리자거든요. 유선뿐 아니라 Wi-Fi, VPN, 여러 프로파일 전환, GUI 연동까지 잘 해주죠. 반면 systemd-networkd는 더 작고 단순한 서비스 지향 도구에 가까워요. 설정 파일 기반으로 네트워크를 선언하고, 부팅 시 안정적으로 올리는 데 강점이 있습니다.

    항목 NetworkManager systemd-networkd
    주 사용 환경 데스크톱, 노트북, 혼합 환경 서버, VM, 컨테이너 호스트, 홈랩
    설정 방식 nmcli, nmtui, GUI, 프로파일 기반 .network, .netdev 파일 기반
    Wi-Fi/VPN 강함 제한적, 별도 도구 조합 필요
    구성 단순성 기능이 많아 다소 복잡할 수 있음 단순하고 예측 가능함
    서버 자동화 가능하지만 환경 따라 다름 설정 파일 관리에 잘 맞음
    학습 난이도 입문은 쉬움 개념 이해가 필요함

    처음엔 이게 뭔가 싶었는데, 결국 차이는 이겁니다. NetworkManager는 변화가 많은 사용자 환경에 강하고, systemd-networkd는 고정된 인프라 환경에 강합니다. 이 한 줄이 핵심이에요.

    3. 어떤 환경에서 뭘 고르면 좋나: 선택 기준 정리

    데스크톱 네트워크라면 NetworkManager가 편합니다

    • Wi-Fi SSID를 자주 바꿔야 할 때
    • VPN 연결을 자주 올리고 내릴 때
    • GUI 환경에서 빠르게 상태를 보고 싶을 때
    • 노트북처럼 이동성이 중요한 환경

    실제로 써보니까 노트북에서는 NetworkManager가 진짜 편하더라고요. 유선 꽂았다가 빼고, 집 Wi-Fi와 회사 Wi-Fi를 넘나들고, 잠깐 핫스팟 붙는 일까지 생각하면 이쪽이 훨씬 자연스럽습니다.

    서버 네트워크 설정이라면 systemd-networkd가 깔끔한 경우가 많습니다

    • 고정 IP 위주로 운영할 때
    • 브리지, VLAN, Bonding 같은 선언형 구성이 필요할 때
    • GUI 없이 최소 구성으로 운영할 때
    • 재부팅 후에도 예측 가능한 상태가 중요할 때

    저는 홈랩 KVM 호스트와 몇몇 작은 서비스 VM에서는 networkd 쪽을 더 선호합니다. 설정 파일이 명확해서 Git으로 추적하기도 좋고, 나중에 다시 봐도 덜 헷갈리거든요.

    4. 실전 구현 1: NetworkManager로 고정 IP 구성하기

    먼저 NetworkManager 예제를 보겠습니다. 인터페이스 이름은 예시로 <code>enp1s0를 쓰겠습니다. 배포판마다 이름이 다를 수 있으니 먼저 인터페이스를 확인하세요.

    1. 현재 인터페이스와 연결 상태를 확인합니다.
    2. 새 프로파일을 만들고 고정 IP를 넣습니다.
    3. 연결을 활성화한 뒤 상태를 확인합니다.
    ip link show
    nmcli device status
    nmcli connection show

    고정 IP 프로파일 생성 예제입니다.

    sudo nmcli connection add \
      type ethernet \
      ifname enp1s0 \
      con-name static-enp1s0 \
      ipv4.addresses 192.168.10.20/24 \
      ipv4.gateway 192.168.10.1 \
      ipv4.dns "1.1.1.1 8.8.8.8" \
      ipv4.method manual \
      autoconnect yes

    적용은 이렇게 합니다.

    sudo nmcli connection up static-enp1s0
    nmcli connection show static-enp1s0

    기존 DHCP 프로파일이 남아 있으면 우선순위 때문에 헷갈릴 수 있습니다. 저도 예전에 유선 프로파일이 두 개 살아 있어서, 분명 고정 IP 넣었는데 DHCP 주소가 다시 붙는 바람에 한참 봤었거든요. 이럴 때는 안 쓰는 프로파일을 정리하는 게 좋습니다.

    nmcli connection show
    sudo nmcli connection delete "Wired connection 1"
    NetworkManager systemd-networkd 비교 중 NetworkManager nmcli 고정 IP 설정 이미지

    NetworkManager에서 nmcli로 프로파일을 만들고 활성화하는 흐름을 보여주는 이미지입니다.

    5. 실전 구현 2: systemd-networkd로 고정 IP 구성하기

    이번에는 systemd-networkd입니다. 이쪽은 선언형 설정 파일이 핵심입니다. 파일 이름은 보통 숫자 접두어를 붙여 정렬되게 관리합니다.

    1. /etc/systemd/network/ 아래에 인터페이스 설정 파일을 만듭니다.
    2. networkd와 필요하면 resolved를 활성화합니다.
    3. 상태를 확인하고, 기존 관리자와 충돌이 없는지 점검합니다.

    예시 파일입니다.

    # /etc/systemd/network/10-enp1s0.network
    [Match]
    Name=enp1s0
    
    [Network]
    Address=192.168.10.20/24
    Gateway=192.168.10.1
    DNS=1.1.1.1
    DNS=8.8.8.8

    서비스 활성화는 아래처럼 진행합니다.

    sudo systemctl enable --now systemd-networkd
    sudo systemctl enable --now systemd-resolved
    networkctl status enp1s0

    DNS 쪽은 배포판마다 차이가 있어서 /etc/resolv.conf 연결 상태도 같이 보는 게 좋습니다.

    ls -l /etc/resolv.conf
    resolvectl status

    Bridge가 필요한 서버라면 networkd가 꽤 직관적입니다. 예를 들어 가상화 호스트에서 브리지 인터페이스를 만들 때, 파일 두세 개로 구조가 눈에 보이게 정리됩니다. GUI가 필요 없는 환경에서는 이게 정말 편하더라고요.

    # /etc/systemd/network/20-br0.netdev
    [NetDev]
    Name=br0
    Kind=bridge
    # /etc/systemd/network/21-br0.network
    [Match]
    Name=br0
    
    [Network]
    Address=192.168.10.30/24
    Gateway=192.168.10.1
    DNS=1.1.1.1
    # /etc/systemd/network/22-enp1s0.network
    [Match]
    Name=enp1s0
    
    [Network]
    Bridge=br0
    systemd-networkd 브리지와 고정 IP 구성을 보여주는 서버 네트워크 설정 이미지

    systemd-networkd에서 파일 기반으로 인터페이스와 브리지를 선언하는 구조를 설명하는 이미지입니다.

    6. ⚠️ 주의사항과 트러블슈팅: 여기서 많이 꼬입니다

    NetworkManager systemd-networkd 비교에서 성능이나 취향보다 더 중요한 건, 둘을 동시에 어설프게 건드리지 않는 겁니다. 제가 제일 많이 본 문제도 이거였어요.

    1) 두 도구가 같은 인터페이스를 같이 관리하는 문제

    한 인터페이스를 두 서비스가 동시에 건드리면 IP가 바뀌거나, 라우팅이 꼬이거나, 부팅 후 상태가 달라질 수 있습니다.

    • 서버에서 networkd를 쓸 거면 해당 인터페이스를 NetworkManager 관리 대상에서 빼는지 확인
    • 데스크톱에서 NetworkManager를 주로 쓸 거면 networkd 설정 파일을 남겨두지 않기

    2) DNS가 적용되지 않는 문제

    IP는 잘 붙는데 이름 해석이 안 되는 경우가 있습니다. 이건 대개 Resolver(리졸버) 경로가 꼬인 겁니다. resolvectl status, cat /etc/resolv.conf를 같이 보셔야 합니다. 특히 배포판 기본 설정이나 설치 도구가 DNS 체인을 이미 잡아둔 경우가 있거든요.

    3) Netplan 같은 상위 설정 도구와의 관계

    일부 배포판은 Netplan(넷플랜, 네트워크 추상화 설정 도구) 같은 레이어가 중간에 있습니다. 이 경우 실제 백엔드는 NetworkManager일 수도 있고 systemd-networkd일 수도 있어요. 겉으로는 YAML만 보이는데, 실제 적용 주체는 다른 셈이죠. 저도 처음엔 설정 파일을 직접 만졌는데 적용이 이상해서 봤더니 상위 도구가 덮어쓰고 있더라고요.

    4) 원격 서버에서 전환 작업할 때

    SSH로 붙어 있는 서버에서 네트워크 관리자 교체 작업은 정말 조심하셔야 합니다. 잘못하면 세션이 바로 끊깁니다. 가능하면 콘솔 접근 수단을 확보하고, 변경 전 현재 라우팅과 IP를 메모해 두세요.

    ip addr
    ip route
    networkctl
    nmcli device status

    💡 팁: 원격 작업이면 먼저 보조 NIC나 관리용 콘솔이 있는지 확인하세요. 이거 하나로 심장 덜 철렁합니다.

    7. 검증과 결과 확인: 설정했다고 끝이 아닙니다

    네트워크는 적용보다 검증이 더 중요합니다. 드디어 됐다! 싶어도 DNS, 게이트웨이, 재부팅 후 유지 여부까지 확인해야 진짜 끝입니다.

    1. 인터페이스에 기대한 IP가 붙었는지 확인
    2. 기본 게이트웨이가 맞는지 확인
    3. DNS 질의가 되는지 확인
    4. 재부팅 후에도 유지되는지 확인
    ip addr show enp1s0
    ip route
    ping -c 4 192.168.10.1
    ping -c 4 1.1.1.1
    getent hosts example.com

    NetworkManager 쪽 확인 명령입니다.

    nmcli device show enp1s0
    nmcli general status

    systemd-networkd 쪽 확인 명령입니다.

    networkctl status enp1s0
    resolvectl status
    NetworkManager systemd-networkd 비교 결과를 검증하는 리눅스 네트워크 상태 이미지

    라우팅, DNS, 인터페이스 상태를 검증하는 결과 화면을 한 장으로 요약한 이미지입니다.

    실제로 써보니까 데스크톱 네트워크는 NetworkManager가 관리 포인트가 적었고, 홈랩 서버는 systemd-networkd가 더 담백했습니다. 특히 재부팅 후에도 상태가 예측 가능하다는 점이 마음에 들었네요. 반대로 Wi-Fi나 VPN을 자주 다루는 장비는 굳이 networkd로 억지 구성할 이유가 없었습니다.

    8. 정리와 FAQ: 최적의 선택은 결국 환경에 따라 다릅니다

    리눅스 네트워크 관리에서 정답은 하나가 아닙니다. 다만 기준은 분명합니다.

    환경 추천 이유
    개인 데스크톱 NetworkManager GUI, Wi-Fi, VPN, 프로파일 전환이 편함
    노트북 NetworkManager 이동성과 연결 변경이 많음
    고정 IP 서버 systemd-networkd 단순하고 예측 가능함
    가상화 호스트/홈랩 systemd-networkd 브리지, VLAN 같은 선언형 구성이 깔끔함
    혼합 환경 상황별 선택 역할에 따라 분리 운영이 현실적임
    NetworkManager systemd-networkd 비교와 추천 환경을 요약한 인포그래픽 이미지

    어떤 환경에 어떤 도구가 더 적합한지 빠르게 판단할 수 있도록 정리한 요약 이미지입니다.

    자주 묻는 질문

    • Q. 서버에도 NetworkManager를 써도 되나요?
      네, 가능합니다. 다만 고정 구성이 중심이고 Wi-Fi나 사용자 세션 연동이 필요 없다면 networkd가 더 단순할 수 있습니다.
    • Q. systemd-networkd가 더 가볍나요?
      일반적으로 더 단순한 구성에 잘 맞습니다. 다만 실제 체감은 기능 요구사항에 따라 달라집니다.
    • Q. 둘 중 하나가 절대적으로 더 좋은가요?
      아닙니다. 데스크톱 네트워크와 서버 네트워크 설정의 요구가 다르기 때문입니다.

    정리하면 이렇습니다. Wi-Fi, VPN, 사용자 친화성 중심이면 NetworkManager, 고정 구성과 선언형 관리 중심이면 systemd-networkd가 잘 맞습니다. 저도 처음엔 무조건 하나로 통일하려고 했었는데, 실제로 운영해보니 역할별로 나누는 게 훨씬 덜 힘들더라고요.

    다음 글에서는 Netplan과 NetworkManager/systemd-networkd의 관계도 따로 다뤄볼 예정입니다. Ubuntu 계열에서 설정이 왜 한 번 더 꼬이는지, 그 부분이 궁금하셨다면 이어서 보시면 도움이 되실 겁니다. 이전 글에서 다룬 홈랩 브리지 구성과 같이 보셔도 흐름이 잘 이어집니다. 🎉