The network configuration abstraction renderer

리눅스의 네트워크 인터페이스는 다양한 방법으로 설정할 수 있다. 예를 들어 ifconfig만으로도 네트워크 인터페이스에 ip를 할당할 수도 있지만 사용하기 까다로우므로 우리는 다른 방법으로 네트워크를 설정한다. 예를 들어 /etc/network/interfaces에 적당히 사람도 알아볼 수 있는 설정 내용을 기록한다면 이 설정 파일을 읽어 ifup 혹은 ifdown에서 이를 처리하는 식이다.

이런 편의성을 제공하기 위한 툴 중 이번 우분투 18.04부터 본격적으로 적용된 netplan에 대해서 알아보자.

netplan은 무엇인가

cli

$ netplan
You need to specify a command
usage: /usr/sbin/netplan  [-h] [--debug]  ...

Network configuration in YAML

optional arguments:
  -h, --help  show this help message and exit
  --debug     Enable debug messages

Available commands:
  
    help      Show this help message
    apply     Apply current netplan config to running system
    generate  Generate backend specific configuration files from
              /etc/netplan/*.yaml
    ip        Retrieve IP information from the system
    try       Try to apply a new netplan config to running system, with
              automatic rollback

보통 설정을 변경한 후 netplan apply를 사용하면 된다.

Example

우선 수많은 예제를 canonical에서 제공하고 있는데, 이 쪽을 천천히 살펴보는 것이 좋겠다. 여기서는 간단하게 기존 예제와 netplan을 비교해 보려고 한다.

우선 ifup/ifdown을 사용한 기존 방식의 ip할당은 다음과 같다.

$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

/etc/network/interfaces.d/ 를 source-directory로 삼는다.

$ ls /etc/network/interfaces.d/
eth0         ovsbr01

openvswitch를 사용하여 eth0을 브릿지로 만들어 사용하는 중이다.

$ cat /etc/network/interfaces.d/ovsbr01
auto ovsbr01
iface ovsbr01 inet static
        address 192.168.127.184
        netmask 255.255.255.0
        gateway 192.168.127.1

$ cat /etc/network/interfaces.d/eth0
auto eth0
iface eth0 inet static
        address 0.0.0.0

그럼 netplan은?

$ ls -la /etc/netplan/
total 12
drwxr-xr-x  2 root root 4096 Jan  2 16:12 .
drwxr-xr-x 68 root root 4096 Jan  2 16:23 ..
-rw-r--r--  1 root root  183 Jan  2 16:12 config.yaml

이름은 상관이 없고 그냥 내가 config.yaml이라고 이름을 정했다.

cat /etc/netplan/config.yaml
  network:
    version: 2
    ethernets:
      eth0:
        addresses: [192.168.127.184/24]
        gateway4: 192.168.127.184
        nameservers:
          addresses: [8.8.8.8,8.8.4.4]

디바이스 이름 바꾸기

관리 목적으로다가 이름을 변경해야 할 경우가 있는데, 예를 들어 여러 인터페이스를 사용하는 경우 이름을 다 같은 규칙에 맞게 만들고 싶어하는 경우가 있을 수 있다. 바로 아래와 같은 경우가 그렇다.

$ cat /etc/netplan/config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
        - 192.168.127.184/24
      gateway4: 192.168.127.1
      nameservers:
          addresses: [8.8.8.8, 8.8.4.4]
    enx00e04cXXXXXX:
      match:
        macaddress: 00:e0:4c:XX:XX:XX
      addresses:
        - 192.168.128.2/24
      set-name: eth1

$ ip link set $(ls /sys/class/net/ | grep enx) down
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 9a:f0:eb:XX:XX:XX brd ff:ff:ff:ff:ff:ff
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
4: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/tunnel6 :: brd ::
5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 02:fe:58:XX:XX:XX brd ff:ff:ff:ff:ff:ff
6: enx00e04cXXXXXX: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:e0:4c:XX:XX:XX brd ff:ff:ff:ff:ff:ff
7: datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether ee:62:7e:XX:XX:XX brd ff:ff:ff:ff:ff:ff

$ netplan apply
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 9a:f0:eb:XX:XX:XX brd ff:ff:ff:ff:ff:ff
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
4: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/tunnel6 :: brd ::
5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 02:fe:58:XX:XX:XX brd ff:ff:ff:ff:ff:ff
6: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 00:e0:4c:XX:XX:XX brd ff:ff:ff:ff:ff:ff
7: datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether ee:62:7e:XX:XX:XX brd ff:ff:ff:ff:ff:ff

디바이스 enx00e04cXXXXXX는 netplan의 set-name으로 인해 이름이 eth1로 변경되었다.

라우팅 테이블 변경

네트워크 인터페이스가 두 개 있을 경우, 인터페이스에 따른 라우팅 테이블을 잘 설정해 줘야 한다. netplan을 통해 이를 설정해 보자.

$ cat /etc/netplan/config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
        - 192.168.127.224/24
      routes:
        - to: 0.0.0.0/0
          via: 192.168.127.1
          metric: 100
      nameservers:
          addresses: [8.8.8.8, 8.8.4.4]
    enx00e04cXXXXXX:
      match:
        macaddress: 00:e0:4c:XX:XX:XX
      addresses:
        - 192.168.25.224/24
      routes:
        - to: 0.0.0.0/0
          via: 192.168.25.1
          metric: 101
        - to: 192.168.171.0/24
          via: 192.168.25.1
          metric: 101
      set-name: eth1

디바이스 eth0은 100의 우선순위로 모든 트래픽을 외부로 내보낸다. 101번 우선 순위로 eth1에 외부 트래픽이 향한다. 그 중에 목적지가 192.168.171.0/24192.168.25.1을 게이트웨이로 해서 외부로 향하게 된다.