komeの備忘録

東大理系大学院生の技術ブログ。たまに趣味。

Netplanの使い方

f:id:komee:20180612180947p:plain

前回説明した、Netplanに関する記事の続き。公式リファレンスにあるサンプルコードを和訳した。 www.komee.org

目次

本記事の概要

https://netplan.io/examplesを元にNetplanの設定方法を構成例とともに日本語で書き直した。 ユースケースとともに、サンプルコードを記述する。

設定の反映方法

Netplanのシステムへの適用方法は、次の通りである。

  • /etc/netplan/以下に設定を書いたYAML形式の設定ファイルを作成
  • # sudo netplan applyで、/etc/netplan/以下のすべてのYAMLファイルが読み込まれる

ちなみにこの設定は、リブートしてもまた読み込まれる。

次から簡単なユースケースとサンプルコードを示す。

DHCPによるIPアドレス割当(IPv4、IPv6)

enp3s0という名前のインタフェースにDHCPでIPv4のIPアドレスを割り当てる。dhcp4キーをtrueにするとdhcpが有効になる。ちなみになぜか、dhcp4キーを無効にするオプションはfalseでもnoでもいい。また、有効にするのも、yesでもいいらしい。manコマンドを見るとbooleanって書いてあるんだから、true/falseに統一してもらいたいところだけど。。

同様にIPv6においてもdhcpでのアドレス取得をすることができ、dhcp6キーを用いる。

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

固定IPアドレスの割当(IPv4、IPv6)

DHCPと同様にenp3s0という名前のインタフェースに固定IPアドレスを割り当てる。addressesキーに固定にするIPアドレスを記述し、ゲートウェイをgateway4に、DNS情報をnameserversキーに記述する。なお、下記の例を見て分かる通り、複数のサーチドメイン、DNSサーバのIPアドレスを書く場合は、,で区切って続けて書くことで対応できる。

また、IPv6の記述も同時に書くことができる。以下のように、[]の中で,で区切って記述する。またYAMLファイルの中で:を用いるため、ご認識を防ぐために、IPv6のアドレスを記述する際にはシングルクォート、もしくはダブルクォートで囲むようにする。ゲートウェイに関しては、gateway6を用い、ネームサーバのアドレスに関しては、IPv4、IPv6を混在して書くことができる。

network:
    version: 2
    renderer: networkd
    ethernets:
        enp3s0:
            addresses: [10.10.10.2/24, '2001:1::2/64']
            gateway4: 10.10.10.1
            nameservers:
                search: [mydomain, example.jp]
                addresses: [10.10.10.1, 1.1.1.1]

無線インタフェース

無線デバイスはwifisキーを用い、イーサネットの有線デバイスと似たような設定となる。無線のアクセスポイント名とパスワードは各自で決めたものを用いる。なお今回の設定では無線デバイスとして、wlp2s0b1というインタフェース名のデバイスを用い、SSIDがsample-wifi、パスワードが12345678という無線LANに接続する。

network:
    version: 2
    renderer: networkd
    wifis:
        wlp2s0b1:
            dhcp4: no
            dhcp6: no
            sddresses: [192.168.0.21/24]
            gateway4: 192.168.0.1
            nameservers:
                addresses: [192.168.0.1, 8.8.8.8]
            access-points:
                "sample-wifi":
                    password: "12345678"

一つのインタフェースに複数のIPアドレスを付与

固定IPアドレスをつける方法と同様にするが、addressesキーはIPアドレスのリストを受け取れるので、これを用いて複数のIPアドレスを付与する。

また、インタフェースのエイリアスには対応していない。(例: eth0:0)

network:
    version:2
    renderer: networkd
    ethernets:
        enp3s0:
            addresses:
                - 10.100.1.38/24
                - 10.100.1.39/24
            gateway4: 10.100.1.1

複数のIPアドレスと複数のゲートウェイを用いる

インタフェースに複数のIPアドレスを付与できたように、ゲートウェイも複数指定することが可能である。

network:
    version:2
    renderer: networkd
    ethernets:
        enp3s0:
            addresses:
                -9.0.0.9/24
                - 10.0.0.10/24
                - 11.0.0.11/24
            # gateway: # 使用しない。代わりにroutesキーを用いる
            routes:
                - to 0.0.0.0/0
                via: 9.0.0.1
                metric: 100
                - to 0.0.0.0/0
                via: 10.0.0.1
                metric: 100
                - to 0.0.0.0/0
                via: 11.0.0.1
                metric: 100

この例を見て分かる通り、インタフェースenp3s0には複数のアドレスが付与されており、それぞれにゲートウェイがある。今回、gateway4キーは用いなかったが、これはroutesキーで代用することが可能である。というのも、0.0.0.0/0すなわち、すべての宛先に対しての経路を明示的に指定すれば、それはゲートウェイとなりうる。 また、metricも合わせて有事のために設定する。

DHCPを用いると、一つのインタフェースに一つのIPアドレスを設定でき、gateway4に対応するIPアドレスのmetricは100として自動的に設定される。

Network Manager

NetplanはNetwork Managerとnetworkdの両方をバックエンドとして対応している。そこで、rendererキーを用いることで、お好みのバックエンドを選択することができる。Ubuntu16などで用いられていたNetwork Managerを使用したいときには、次のように書くことで、Network Managerに権限を委譲することができる。

network:
    version: 2
    renderer: NetworkManager

ボンディング

ボンディングは、2つの物理インタフェースのボンドインタフェースを宣言し、ボンディングモードを宣言することで設定される。 IPアドレスを得るためにDHCPを用いたアクティブバックアップボンドの例を次に示す。

network:
    version: 2
    renderer: networkd
    bonds:
        bond0:
            dhcp4: yes
            interfaces:
                - enp3s0
                - enp4s0
            parameters:
                mode: active-backup
                primary: enp3s0

次に示すサンプルコードは、複数のボンドインタフェースと異なるタイプをもったルータとして動作するシステムの設定である。

netowrk:
    version: 2
    renderer: networkd
    ethernets:
        enp1s0:
            dhcp4: no
        enp2s0:
            dhcp4: no
        enp3s0:
            dhcp4: no
            optional: true
        enp4s0:
            dhcp4: no
            optional: true
        enp5s0:
            dhcp4: no
            optional: true
        enp6s0:
            dhcp4: no
            optional: true
    bonds:
        bond-lan:
            interfaces: [enp2s0, enp3s0]
            addresses: [192.168.93.2/24]
            parameters:
                mode: 802.3ad
                mii-monitor-interval: 1
            bond-wan:
                interfaces: [enp1s0, enp4s0]
                addresses: [192.168.1.252/24]
                gateway4: 192.168.1.1
                nameservers:
                    search: [local]
                    addresses: [8.8.8.8, 8.8.4.4]
                parameters:
                    mode: active-backup
                    mii-monitor-interval: 1
                    gratuitious-arp: 5
            bond-conntrack:
                interfaces: [enp5s0, enp6s0]
                addresses: [192.168.254.2/24]
                parameters:
                    mode: balance-rr
                    mii-monitor-interval: 1

ブリッジ

DHCPを用いた単一デバイスへの最も簡単なブリッジの構成は以下の通りである。

network:
    version: 2
    renderer: networkd
    bridges:
        br0:
            dhcp4: yes
            interfaces:
                - enp3s0

VLAN

リネームされたインタフェースに複数のVLANを設定する構成は以下の通りである。 今回では、mainifという名前にリネームしたインタフェースにtagged(trunk)のvlan10とvlan15を設定した。また、元のインタフェース自体にはuntagged(access)の設定もしてある。

network:
    version: 2
    renderer: networkd
    ethernets:
        mainif:
            match:
                macaddress: "de:ad:be:ef:ca:fe"
            set-name: mainif
            addresses: ["10.3.0.5/23"]
            gateway4: 10.3.0.1
            nameservers:
                addresses: ["8.8.8.8", "8.8.4.4"]
                search: [example.com]
    vlans:
        vlan15:
            id: 15
            link: mainif
            addresses: ["10.3.99.5/24"]
        vlan10:
            id: 10
            link: mainif
            addresses: ["10.3.98.5/24"]
            nameservers:
                addresses: ["127.0.0.1"]
                search: [domain1.example.com]

VLANを用いた複雑なブリッジ

libvritdにtaggedのVLANを持った特定のブリッジを使用させ、一方でuntaggedのインタフェースを提供し続ける例が以下のサンプルである。

network:
    version: 2
    renderer: networkd
    ethernets:
        enp0s25:
            dhcp4: true
    bridges:
        br0:
            addresses: [10.3.99.25/24]
            interfaces: [vlan15]
    vlans:
        vlan15:
            accepd-ra: no
            id: 15
            link: enp0s25

libvirtdで/etc/libvirtd/qemu/networks/以下に次に示す新しいXMLファイルを追加することで、このブリッジを使う事ができるようになる。XMLファイルのなかのタグで囲まれたブリッジの名前は、NetplanのYAMLファイルの中で定義したブリッジの名前と同一である必要がある。

<network>
    <name>br0</name>
    <bridge name='br0' />
    <forward mode="bridge" />
</network>

ゲートウェイに直接接続する

on-linkキーを用いることで、サブネットと一致しないネットワークのIPアドレスでも、任意のデフォルトルートやルートを設定することができる。ルータの設定等には必須かもしれない。

network:
    version: 2
    renderer: networkd
    ethernets:
        addresses: ["10.0.0.1/24"]
        routes:
            - to: 0.0.0.0/0
            via: 9.9.9.9
            on-link: true

ソースルーティング

2つのネットワーク間のルーティングを許可するため、ルートテーブルを特定のインタフェースに追加することがある。

次の例では、192.168.3.0/24上のens3と、192.168.5.0/24上のens5がある。これはそれぞれのネットワークのクライアントに他方のネットワークに接続することを許可し、正しいインタフェースからの応答を可能にする。

さらに、デフォルトルートはens5に割り当てられたままであり、他のトラヒックを通過させることも可能である。

network:
    version: 2
    renderer: networkd
    ethernets:
        ens3:
            addresses:
                -192.168.3.30/24
            dhcp4: no
            routes:
                - to: 192.168.3.0/24
                via 192.168.3.1
                table: 101
            -routing-policy:
                - from: 192.168.3.0/24
                table: 101
        ens5:
            addresses:
                -192.168.5.24/24
            dhcp4: no
            gateway4: 192.168.5.1
            routes:
                - to: 192.168.5.0/24
                via: 192.168.5.1
                table: 102
            routeing-policy:
                - from: 192.168.5.0/24
                table: 102

ループバックインタフェース

networkdは普通、新たなループバックデバイスを作成させないようにしているが、ユーザは新しいアドレスを通常のループバックインタフェースに付け加えることが可能である。これにより、マシン上の有効なアドレスを、編集されたルートの両方で考慮することが可能になる。

ループバックインタフェースの設定は、以下のように、名前がlomatchするインタフェースを指定してIPアドレスを指定する。

network:
    version: 2
    renderer: networkd
    ethernets:
        lo:
            match:
                name: lo
            addresses: [7.7.7.7/32]

WindowsのDHCPサーバ

Windows ServerによってDHCPが提供されるネットワークでは、dhcp-identifierキーを利用することで、運用が可能となる。

network:
    version: 2
    ethernets:
        enp3s0:
            dhcp4: yes
            dhcp-identifier: mac