komeの備忘録

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

【Ubuntu18.04のネットワーク設定方法】Netplanの解説

f:id:komee:20180612180947p:plain

目次

本記事の概要

これまで、Netplanのデザインや、サンプルコード一覧を紹介してきた。

www.komee.org

www.komee.org

本記事では、これまで紹介してきたYAML形式のファイルの詳細などを、公式のリファレンス( https://netplan.io/reference )を元にわかりやすく解説していく。

元になるページに関しては、これまでに紹介した2記事とも概要の部分がかぶっていたりするので、多くの部分を割愛する。本記事では、YAMLファイルの書き方と文法にフィーチャーする。

 物理デバイスに対する共通プロパティ

match(scalar)

後述する様々なハードウェアプロパティを用いて、デバイス(セット)の識別をする。

name(scalar)

正確なインタフェース名を記述する。globをサポートしており、名前をマッチする主な使いみちは、match:を使うことなく、IDを用いることによってインタフェースに一意の名前を簡単に与えることができる。現在、globはnetworkdのみがサポートしており、Network Managerはサポートしていない。ワイルドカード*を使える。

macaddress(scalar)

MACアドレスを記述する。globはサポートしていない。

driver(scalar)

カーネルのドライバ名を指定する。udevプロパティのDRIVERに一致するもの。networkdのみglobをサポートしている。

set-name(scalar)

マッチしたユニークなインタフェースに対して名前をつける。YAMLセットの中で、ユニークになるように注意する。デフォルトのudevの名前と同じ名前を用いるとエラーする。

wakeonlan(bool)

LAN経由でのシステムの起動をサポートする。デフォルトではオフになっている。

設定例

  • 2つ目のPCIバス上のネットワークカードを指定する
match:
    name: enp2*
  • MACアドレスで指定する
match:
    macaddress: 11:22:33:AA:BB:FF
  • ixgbeのドライバを使う最初のネットワークカード
match:
    driver: ixgbe
    name: en*s0

すべてのデバイスに対する共通プロパティ

renderer(scalar)

バックエンドで動作するネットワークレンダラを指定する。networkdもしくはNetwork Managerをサポートする。デフォルトではnetworkdとなっており、省略可能。

dhcp4(bool)

IPv4のDHCPを設定する。デフォルトではオフになっている。

dhcp6(bool)

dhcp4と同様に、IPv6でのDHCPを設定する。デフォルトではオフになっている。ステートレスDHCPとステートフルDHCPの両方をサポートする。

RDNSSを用いるSLAACのような、完全なステートレスな自動設定のIPv6専用環境の場合、このオプションを用いることでインタフェースを起動することが可能である。accept-raの設定だけでは設定できない。自動設定ではルータ広告の内容を引き続き重んじ、RAに要求されたときのみDHCPを使用する。

rdnssはnetworkdでRDNSSを使うときに必要となる。Network Managerでは、その他のソフトウェアは要求されない。

dhcp-identifier(scalar)

このキーにmacをセットすると、その設定をsystemd-networkdに渡し、デバイスのMACアドレスを、RFC4351準拠のクライアントIDではなく、ユニークな識別子として用いる。Network Managerを用いているときにはこのキーは使えない。

accept-ra(bool)

カーネルにIPv6を単独で設定させるルータ広告を受信する。デフォルトでオンになっている。

addresses(sequence of scalars)

静的なIPアドレスをインタフェースに与える。IPアドレスの書き方はCIDR表記である。IPv4, IPv6両方対応しているが、IPv6の:がYAMLの識別子の:と混同してしまうため、IPv6アドレスを記述する際はシングル/ダブルクォートで囲むようにする。

例: addresses: [192.168.0.2/24, "2001:1::1/64"]

gateway4(scalar)

IPアドレスを手動で設定する際にIPv4のデフォルトゲートウェイのIPアドレスを指定する。

例: gateway4: 192.168.0.1

gateway6(scalar)

同様にIPv6のデフォルトゲートウェイアドレスを指定する。

例: gateway6: "2001:4::1"

nameservers(mapping)

IPアドレスを手動で設定する際にDNSサーバと検索ドメインを設定する。このキーには更に2つのフィールドがあり、一つはaddreses、もう一つはsearchである。addressesにはDNSサーバのIPアドレス(v4、v6どちらも可)を指定し、searchには検索ドメインを記述する。どちらもリストの形式で渡せば、複数の値を保持することができる。

ethernets:
    id0:
        ...
        nameservers:
            addreses: [8.8.8.8, "FEDC::1"]
            search: [lab, home]

macaddress(scalar)

デバイスのMACアドレスを指定する。

例: macaddress: 52:52:00:6b:3c:59

optional(bool)

通常networkdはシステム起動時、デバイスが正しく起動しが設定されるまで一定時間待機する。しかしこのoptinalキーをtrueに設定したデバイスは、起動時にnetworkdが待たずにすぐに起動することができるようになる。optionalはnetworkdのみがサポートしており、デフォルトではオフになっている。インタフェースごとに設定する。

例:

ethernets:
    eth1:
        dhcp4: true
        optinoal: true

routes(mapping)

デバイスの静的ルーティングを記述する。書き方は後述する。

routing-policy(mapping)

デバイスのポリシールーティングを設定する。同様に書き方は後述する。

ルーティング

netplanでは単純なルーティングはもちろん、ポリシールーティングのような、複雑なルーティングも記述できる。ポリシールーティングはnetworkdでサポートしている。

routes(mapping)

前述のroutesと同様。詳しく記す。 インタフェースにスタンダードな静的ルートを定義できる。toviaが最低限必要となる。 fromtoviaはCIDR形式のaddr/prefixlenでもaddrのみでも記述できる。

from(scalar)

ソースのIPアドレスを指定する。

to(scalar)

宛先のIPアドレスを指定する。

via(scalar)

ゲートウェイのアドレスを指定する。

on-link(bool)

trueをセットすると、ルートがインタフェースに直接接続されていることを指定する。

metric(scalar)

経路の優先度を自然数で記述する。小さいほうが優先される。

type(scalar)

経路のタイプ。デフォルトはunicastであり、他のオプションはunreachablevlackholeprohibitedがある。

scope(scalar)

経路のスコープ。globallinkhostから選択する。

table(scalar)

経路に用いるテーブル番号。値は1以上の整数で指定する。予約されているテーブル番号もあるため、/etc/iproute2/rt_tablesを参照して確認する。

routing-policy(mapping)

特にソースIPや、ファイアウォールマーキングによって制御されるトラヒックの存在するネットワークでのルーティングポリシを定義する。アドレス記述の文法はroutingと同じ。

from(scalar)

ポリシールールに一致するソースのIPアドレスを指定する。

to(scalar)

ポリシルールに一致する宛先のIPアドレスを指定する。

table(scalar)

マッチさせる経路のテーブル番号を指定する。routesのtableと書き方は一緒。

priority(scalar)

ルーティングポリシの優先度を指定する。高いほど優先度は低くなる。

fwmark(scalar)

ここで指定した値とiptablesのファイアウォールによってマークされたトラヒックと一致する。1以上の整数を指定する。

type-of-service(scalar)

トラヒックに提供されたサービス番号のタイプに基づいてポリシルールをマッチさせる。

ethernet: イーサネットデバイスのプロパティ

イーサネットデバイスの定義は、これまでに述べたキーでのみ構成される。

wifis: Wi-Fiデバイスのプロパティ

systemd-networkdはWiFiをサポートしていないため、networkdでWiFiを動作させようとするなら、wpasupplicantをインストールする必要がある。

access-points(mapping)

Network Managerへ設定済みの接続ができるようになる。キーはSSIDによって制御される。また、2つの属性を持つ。一つはpassword、もう一つはmodeである。

password(scalar)

WPA2オーセンティケーションを可能にし、指定したSSIDのパスワードを記述する。他のオーセンティケーションに関しては、現在サポートしていない。

mode(scalar)

可能なオプションは、クライアントとしてアクセスポイントに接続するinfrastructure、他のデバイスが接続できるようにするアクセスポイントを作成するためのap、アクセスポイントを必要としないP2Pネットワークを作成するためのadhocがある。apはNetwork Managerのみがサポートしており、modeのデフォルト値はinfrastructureである。

bridges: ブリッジデバイスのプロパティ

interfaces(sequence of scalars)

この要素で指定したIDを持つ全てのデバイスは、ブリッジの構成に用いられる。

ethernets:
    switchports:
        match: {name: "enp2*"}
        ...
    brdges:
        br0:
            interfaces: [switchports]

parameters(mapping)

特殊はブリッジを作成するためのカスタムパラメタを指定する。Network Managerを用いた場合、パラメタの値をミリ秒単位で指定する。systemd-networkdを用いたときには、指定がない限り秒単位で指定することとなる。

ageing-time(scalar)

パケットが受信されたあとに、転送データベースにMACアドレスを保持する期間を指定する。

priority(scalar)

ブリッジの優先度を指定する。値は0以上65535以下で表現する。値が低いほど優先度は高くなる。高い優先度のブリッジは、ルートブリッジとして選ばれる。

port-priority(scalar)

ポートの優先度を指定する。優先度は0以上63以下で表現する。このメトリックは、特定のポートとルートポートの選択アルゴリズムに用いられる。

forward-delay(scalar)

ブリッジが転送状態を受け取るまでの間、リスニングとラーニングの応対を維持する時間を指定する。この値はsystemdでは秒単位でセットされ、Network Managerではミリ秒単位で指定される。

hello-time(scalar)

ルートブリッジと指定したブリッジから送信される2つのハローパケットの間隔を指定する。ハローパケットはネットワークトポロジの情報をやり取りする。

max-age(scalar)

ハローパケットの最大時間を指定する。直近のハローパケットがこの指定した値より古かったら、ブリッジはルートブリッジになる。

path-cost(scalar)

ブリッジ上のパスのコストを指定する。高速なインタフェースのコストは低くなる。この属性は、ネットワークトポロジに対してわかりやすい制御を提供し、これにより利用可能なときならいつでも最も速いパスを利用可能となる。

stp(bool)

ブリッジがスパニングツリープロトコル(SPT)を用いるかを定義する。デフォルトではtrueになっている。

bonds: ボンディングデバイスのプロパティ

interfaces(sequence of scalars)

この要素で指定したIDを持つ全てのデバイスは、ボンディングの構成に用いられる。

ethernets:
    switchports:
        match: {name: "enp2*"}
        ...
    bonds:
        bond0
            interfaces: [switchports]

parameters(mapping)

特殊はボンディングを作成するためのカスタムパラメタを指定する。Network Managerを用いた場合、パラメタの値をミリ秒単位で指定する。systemd-networkdを用いたときには、指定がない限り秒単位で指定することとなる。

mode(scalar)

インタフェースに用いられるボンディングモードを指定する。指定できる値は、balance-rractive-backupbalance-xorbroadcast802.3adbalance-tlbbalance-albである。デフォルトでは、balance-rrが指定されている。ちなみにbalance-rrrrは、round robinである。

lacp-rate(scalar)

LACPDUの通信レートを指定する。これは802.3adモードのみ用いられる。指定できる値は、lowもしくはfastである。lowを指定すると、デフォルトでは30秒となり、fastを指定すると毎秒となる。

mii-monitor-interval(scalar)

MIIモニタリングの間隔を指定する。デフォルトでは0病となっており、このときMIIモニタリングは無効になっている。

mii-links(scalar)

ボンドインタフェースをアップするための、ボンド内のリンクの最小数を指定する。

transmit-hash-policy(scalar)

スレーブ選択のための送信ハッシュポリシの指定をする。これはbalance-cor802.3adbalance-tlbのみで用いられる。指定できる値は、layer2layer3+4layer2+3excap2+3encap3+4である。

ad-select(scalar)

アグリゲーション選択モードの指定に用いる。指定できる値は、bandwidthstablecountである。これは802.3adモードのみで用いられる。

all-slaves-active(bool)

ボンディングデバイスがアクティブではないポート上で受信した重複フレームをドロップしたかったら、このオプションをfalseに設定する。もしそういったフレームも転送したかったら、このオプションはtrueに設定する。デフォルトではfalseとなっており、この状態が、様々な状況に対してもっとも要求される挙動である。

arp-interval(scalar)

ARPによるリンクの監視の頻度を値で設定する。デフォルト値は0となっており、このときARP監視は無効になっている。

arp-ip-targets(sequence of scalars)

スレーブが起動していることを確認するため、ARP要求を送信するリンク上のホアのホストのIPアドレス。これは、arp-intervalに0以外の値が設定されたときのみ使われる。ARP要求監視が機能するためには、少なくとも1つのIPアドレスを指定する必要がある。IPv4アドレスのみがサポートされている。最大で16個のIPアドレスを指定できる。デフォルトでは空のリストとなっている。

arp-validate(scalar)

ARPリンク監視を使ったときに、ARP応答をどのように検証するかを指定する。指定できる値は、nonebackupallである。

arp-all-targets(scalar)

スレーブが起動したとみなされるのに十分なARP IPターゲットを用いるか、もしくは全てのターゲットが起動している必要が有るかを指定する。これはactive-backupモードでarp-validateが有効なときのみ用いることができる。指定できる値は、anyまたはallである。

up-delay(scalar)

リンクが一度物理的に認識されてから、利用可能になるまでの時間。デフォルトでは0となっている。

down-delay(scalar)

一度リンクを認識できなくなってから、リンクを無効にするまでの時間。デフォルトでは0となっている。

fail-over-mac-policy(scalar)

ボンドに追加するときに、全てのスレーブを同じMACアドレスに設定するか、またはシステムがMACアドレスをどのように処理するかを指定する。指定できる値は、noneactivefollowである。

gratuitious-arp(scalar)

フェイルオーバ後に、いくつのARPはパケットを送るかを指定する。新しいスレーブ上でリンクが一度有効になると、通知が送られ、この値が1より大きい時には、その回数だけ通知が繰り返される。デフォルトでは1が設定され、1から255の間の値で設定する。これはactive-backupモードでのみ用いることができる。

packets-per-slave(scalar)

balance-rrモードでは、次のパケットに切り替わる前に、スレーブ上で送信できるパケットの数を指定する。0を指定すると、スレーブはランダムに選ばれる。指定できる値は、0から65535までで、デフォルトでは1が設定されている。この設定はbalance-rrモードでのみ有効である。

primary-reselect-policy(scalar)

優先スレーブの再選択ポリシを指定する。有効なスレーブがフェールしたとき、システムがどのように次の新しい有効スレーブを選択し、回復がどのように行われるかのポリシに用いられる。指定できる値は、alwaysbetterfailureである。

resend-igmp(scalar)

balance-rractive-backupbalance-tlbbalance-albでは、フェイルオーバが働き、あるスレーブから他のスレーブにIGMPトラヒックをスイッチすることができる。

このパラメタはいくつのIGMPメンバシップレポートがフェイルオーバイベントで発生するかを指定することができる。値は0から255までであり、0はメンバシップレポートがの送信が無効になっていることを意味する。一方で、最初のメンバシップレポートはフェイルオーバ時に送られ、連続したレポートは200ミリ秒ごとに送信される。

learn-packet-interval(scalar)

各スレーブへラーニングパケットを送信する間隔を指定する。値は1から0x7fffffffで指定し、デフォルトでは1が設定されている。これはbalance-tlbbalance-albモードのときのみ用いられる。

primary(scalar)

優先スレーブとして使われるデバイス、もしくはボンドのスレーブとして使うために好ましいデバイスを指定する。これは、active-backupbalance-albbalance-tlbモードのときのみ有効となる。

vlans: VLANデバイスのプロパティ

id(scalar)

VLAN IDを指定する。0から4094までの値で指定する。

link(scalar)

このVLANが属するインタフェースが作られるインタフェースの、IDを指定する。IDは、netplanのファイルの中で定義した識別子を用いる。

ethernets:
    eno1: {...}
vlans:
    en-infra:
        id: 1
        link: eno1
        dhcp4: yes
    en-vpn:
        id: 2
        link: eno1
        address:....

まとめ

Netplanは、ルーティングも記述できるし、ファイルを分割して記述することもできるし、使い勝手が非常に良くなったと感じた。networkdやNetwork Managerをラッパーして可読性のあるコンフィグを生成するし、従来の/etc/network/interfacesよりは格段に使いやすくなったと思う。積極的に使いこなしていきたいと思う。