Ubuntu NetPlan

IP 주소 설정을 위한 Ubuntu NetPlan 구성

개요

Netplan은 네트워크를 YAML로 선언하고 systemd-networkd나 NetworkManager 같은 백엔드(“renderer”)에 넘기는, Ubuntu의 표준 방식이다. 설정은 /etc/netplan/*.yaml 아래에 있고, Netplan은 자동 롤백과 함께 변경을 안전하게 시험해볼 수 있다.

YAML을 쓰기 전에 인터페이스부터 확인하라

장비가 새것이거나 YAML이 아직 없을 때, 실제 장치 이름을 빠르게 찾아보자:

# 인터페이스 목록 (이름, 상태)
ip -br link

# 주소 포함 (IPv4/IPv6)
ip -br addr
ip -br -4 addr
ip -br -6 addr

# 특정 인터페이스 자세히 보기
ip addr show dev enp3s0
ip -br addr show dev enp3s0
  • -br/--brief는 깔끔한 표를 보여주고, -j/--json은 기계가 읽을 수 있는 출력을 준다.
  • ip a는 ip addr의 축약이다. 한 장치로 좁힐 때만 show dev IFACE가 필요하고, 목록을 볼 때는 show도 없어도 된다.

최소 레시피

아래 중 하나를 /etc/netplan/01-net.yaml에 넣고, sudo netplan try → 확인 → sudo netplan apply.

DHCP (서버 스타일)

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: true

고정 IPv4 + DNS + 기본 라우트

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      addresses: [10.10.10.20/24]
      nameservers:
        search: [corp.local]
        addresses: [10.10.10.253, 8.8.8.8]
      routes:
        - to: default
          via: 10.10.10.1

게이트웨이 여러 개 (metric으로 주/예비 구분)

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      addresses: [10.0.0.10/24]
      routes:
        - to: default
          via: 10.0.0.1
          metric: 100
        - to: default
          via: 10.0.1.1
          metric: 200

Bridge (주로 KVM/컨테이너용)

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0: { dhcp4: false }
  bridges:
    br0:
      dhcp4: true
      interfaces: [enp3s0]

Bond (active-backup 또는 802.3ad/LACP)

network:
  version: 2
  renderer: networkd
  bonds:
    bond0:
      interfaces: [enp3s0, enp4s0]
      dhcp4: true
      parameters:
        mode: active-backup # 또는: 802.3ad

VLAN (태그된 서브인터페이스)

network:
  version: 2
  renderer: networkd
  ethernets:
    mainif: { dhcp4: false }
  vlans:
    vlan15:
      id: 15
      link: mainif
      addresses: [10.3.99.5/24]

Wi-Fi (데스크톱/노트북. NetworkManager 사용)

network:
  version: 2
  renderer: NetworkManager
  wifis:
    wlp2s0:
      access-points:
        "MY_SSID":
          password: "********"
      dhcp4: true

안전한 적용 절차 (원격에서도 안심)

  1. 병합된 설정을 확인한다:
sudo netplan get
  1. 자동 롤백과 함께 시험한다:
sudo netplan try   # 기본 120초 카운트다운
  1. 확정한다:
sudo netplan apply

2단계에서 연결이 끊기면 타임아웃 후 Netplan이 이전 상태를 자동으로 복구한다. SSH로 작업할 때 정확히 원하는 동작이다.

문제 해결 체크리스트

  • netplan status [IFACE] (--diff를 붙이면 YAML과 실제 상태를 비교).
  • 자세한 적용 로그: sudo netplan --debug apply.
  • IP/라우트: ip -br addr, ip route.
  • DNS: resolvectl status.
  • 로그: journalctl -u systemd-networkd 또는 journalctl -u NetworkManager.
  • Netplan 자신도 실제 IP 상태를 볼 때는 ip addr를 쓰라고 권한다.

클라우드 이미지와 자동 생성 YAML

클라우드 이미지에서는 /etc/netplan/50-cloud-init.yaml 같은 자동 생성 파일을 자주 보게 된다. Netplan 전용으로 전환하거나 템플릿을 손보기 전까지는 플랫폼 (cloud-init, MAAS 등)이 네트워크를 소유하고 있을 수 있다. 핵심은 Netplan이 /{lib,etc,run}/netplan의 모든 YAML을 읽어 사전순으로 병합하며, 뒤쪽 파일이 앞쪽을 보완/덮어쓴다는 점을 아는 것이다.

부록: iproute2 한 줄 명령

# 인터페이스 이름만
ip -o link show | awk -F': ' '{print $2}'

# NIC별 IPv4 (쉼표 구분)
for i in $(ls /sys/class/net | grep -v lo); do
  printf "%-12s %s\n" "$i" "$(ip -4 -o addr show dev $i | awk '{print $4}' | paste -sd, -)"
done

# JSON (스크립트용으로 좋다)
ip -j addr show | jq .
  • 압축된 표에는 -br/--brief, 기계가 읽을 출력에는 -j/--json을 쓰고, 객체 이름은 줄여 쓸 수 있다 (ip addr → ip a).