ネットワークの設定および管理


Red Hat Enterprise Linux 10

ネットワークインターフェイスおよび高度なネットワーク機能の管理

Red Hat Customer Content Services

概要

Red Hat Enterprise Linux (RHEL) のネットワーク機能を使用すると、組織のネットワーク要件とセキュリティー要件に合わせてホストを設定できます。これには、ポリシーベースのルーティングや Multipath TCP (MPTCP) などのさまざまなネットワークタイプと高度なネットワーク機能が含まれます。

Red Hat ドキュメントへのフィードバック (英語のみ)

Red Hat ドキュメントに関するご意見やご感想をお寄せください。また、改善点があればお知らせください。

Jira からのフィードバック送信 (アカウントが必要)

  1. Jira の Web サイトにログインします。
  2. 上部のナビゲーションバーで Create をクリックします。
  3. Summary フィールドにわかりやすいタイトルを入力します。
  4. Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
  5. ダイアログの下部にある Create をクリックします。

第1章 一貫したネットワークインターフェイス命名の実装

udev デバイスマネージャーは、Red Hat Enterprise Linux で一貫したデバイス命名を実装します。デバイスマネージャーは、さまざまな命名スキームをサポートしています。デフォルトでは、ファームウェア、トポロジー、および場所の情報に基づいて固定名を割り当てます。

一貫したデバイス命名を使用しない場合、Linux カーネルは固定の接頭辞とインデックスを組み合わせて名前をネットワークインターフェイスに割り当てます。カーネルがネットワークデバイスを初期化すると、インデックスが増加します。たとえば、eth0 は、起動時にプローブされる最初のイーサネットデバイスを表します。別のネットワークインターフェイスコントローラーをシステムに追加すると、再起動後にデバイスが異なる順序で初期化される可能性があるため、カーネルデバイス名の割り当てが一定でなくなります。その場合、カーネルはデバイスに別の名前を付けることがあります。

この問題を解決するために、udev は一貫したデバイス名を割り当てます。これには、次の利点があります。

  • 再起動してもデバイス名が変わりません。
  • ハードウェアを追加または削除しても、デバイス名が固定されたままになります。
  • 不具合のあるハードウェアをシームレスに交換できます。
  • ネットワークの命名はステートレスであり、明示的な設定ファイルは必要ありません。
警告

通常、Red Hat は、一貫したデバイス命名が無効になっているシステムはサポートしていません。例外は、Red Hat ナレッジベースのソリューション記事 Is it safe to set net.ifnames=0 を参照してください。

1.1. udev デバイスマネージャーによるネットワークインターフェイスの名前変更の仕組み

ネットワークインターフェイスの一貫した命名スキームを実装するために、udev デバイスマネージャーは次のルールファイルを記載されている順番どおりに処理します。

  1. Dell システムのみ: /usr/lib/udev/rules.d/71-biosdevname.rules

    このファイルは、biosdevname パッケージがインストールされている場合にのみ存在します。このルールファイルは、前の手順でインターフェイスの名前が変更されていない場合に、biosdevname ユーティリティーが命名ポリシーに従ってインターフェイスの名前を変更することを定義します。

    注記

    biosdevname は Dell システムにのみインストールして使用してください。

  2. /usr/lib/udev/rules.d/75-net-description.rules

    このファイルは、udev がネットワークインターフェイスを検査し、udev の内部変数にプロパティーを設定する方法を定義します。これらの変数は、次のステップで /usr/lib/udev/rules.d/80-net-setup-link.rules ファイルによって処理されます。一部のプロパティーは未定義である場合があります。

  3. /usr/lib/udev/rules.d/80-net-setup-link.rules

    このファイルは udev サービスの net_setup_link ビルトインを呼び出します。udev/usr/lib/systemd/network/99-default.link ファイルの NamePolicy パラメーターのポリシーの順序に基づいてインターフェイスの名前を変更します。詳細は、ネットワークインターフェイスの命名ポリシー を参照してください。

    どのポリシーも適用されない場合、udev はインターフェイスの名前を変更しません。

1.2. ネットワークインターフェイスの命名ポリシー

デフォルトでは、udev デバイスマネージャーは /usr/lib/systemd/network/99-default.link ファイルを使用して、インターフェイスの名前を変更するときに適用するデバイス命名ポリシーを決定します。このファイルの NamePolicy パラメーターは、udev がどのポリシーをどの順序で使用するかを定義します。

NamePolicy=keep kernel database onboard slot path
Copy to Clipboard Toggle word wrap

次の表では、NamePolicy パラメーターで指定された最初に一致するポリシーに基づく、udev のさまざまなアクションを説明します。

Expand
ポリシー説明名前の例

keep

デバイスにユーザー空間で割り当てられた名前がすでにある場合、udev はこのデバイスの名前を変更しません。たとえば、名前がデバイスの作成中または名前変更操作によって割り当てられた場合がこれに該当します。

 

kernel

デバイス名が予測可能であるとカーネルが通知した場合、udev はこのデバイスの名前を変更しません。

lo

database

このポリシーは、udev ハードウェアデータベース内のマッピングに基づいて名前を割り当てます。詳細は、man ページの hwdb(7) を参照してください。

idrac

onboard

デバイス名には、ファームウェアまたは BIOS が提供するオンボードデバイスのインデックス番号が含まれます。

eno1

slot

デバイス名には、ファームウェアまたは BIOS が提供する PCI Express (PCIe) ホットプラグのスロットインデックス番号が含まれます。

ens1

path

デバイス名には、ハードウェアのコネクターの物理的な場所が含まれます。

enp1s0

mac

デバイス名には MAC アドレスが含まれます。デフォルトでは、Red Hat Enterprise Linux はこのポリシーを使用しませんが、管理者はこのポリシーを有効にすることができます。

enx525400d5e0fb

1.3. ネットワークインターフェイスの命名スキーム

udev デバイスマネージャーは、デバイスドライバーが提供する一定のインターフェイス属性を使用して、一貫したデバイス名を生成します。

新しいバージョンの udev によってサービスが特定のインターフェイス名を作成する方法が変更された場合、Red Hat は、新しいスキームバージョンを追加し、システム上の systemd.net-naming-scheme(7) man ページに詳細を記載します。デフォルトでは、Red Hat Enterprise Linux (RHEL) 10 は、ユーザーが RHEL のそれ以降のマイナーバージョンをインストールまたは更新した場合でも、rhel-10.0 命名スキームを使用します。

注記

RHEL 10 では、すべての rhel-8.* および rhel-9.* 命名スキームも使用できます。

デフォルト以外のスキームを使用する場合は、ネットワークインターフェイスの命名スキームを切り替える ことができます。

さまざまなデバイスタイプおよびプラットフォームの命名スキームの詳細は、システム上の systemd.net-naming-scheme(7) man ページを参照してください。

1.4. 別のネットワークインターフェイス命名スキームへの切り替え

デフォルトでは、Red Hat Enterprise Linux (RHEL) 10 は、ユーザーが RHEL のそれ以降のマイナーバージョンをインストールまたは更新した場合でも、rhel-10.0 命名スキームを使用します。デフォルトの命名スキームはほとんどの状況に適していますが、次のような理由で別のスキームバージョンに切り替える必要がある場合もあります。

  • 新しいスキームによりインターフェイス名にスロット番号などの追加属性を追加すると、デバイスをより適切に識別できるようになります。
  • 新しいスキームにより、カーネルによって割り当てられたデバイス名 (eth*) に udev がフォールバックするのを防ぐことができます。これは、ドライバーが 2 つ以上のインターフェイスに対して一意の名前を生成するのに十分な一意の属性を提供していない場合に発生します。

前提条件

  • サーバーのコンソールにアクセスできる。

手順

  1. ネットワークインターフェイスをリスト表示します。

    # ip link show
    2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap

    インターフェイスの MAC アドレスを記録します。

  2. オプション: ネットワークインターフェイスの ID_NET_NAMING_SCHEME プロパティーを表示して、RHEL が現在使用している命名スキームを特定します。

    # udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1
    ID_NET_NAMING_SCHEME=rhel-10.0
    Copy to Clipboard Toggle word wrap

    このプロパティーは lo ループバックデバイスでは使用できないことに注意してください。

  3. インストールされているすべてのカーネルのコマンドラインに net.naming-scheme=<scheme> オプションを追加します。次に例を示します。

    # grubby --update-kernel=ALL --args=net.naming-scheme=rhel-10.1
    Copy to Clipboard Toggle word wrap
  4. システムを再起動します。

    # reboot
    Copy to Clipboard Toggle word wrap
  5. 記録した MAC アドレスに基づいて、命名スキームの変更により変更されたネットワークインターフェイスの新しい名前を特定します。

    # ip link show
    2: eno1np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap

    スキームを切り替えた後、udev によって、指定された MAC アドレスを持つデバイスに eno1np0 という名前が付けられます。これは以前は eno1 という名前でした。

  6. 以前の名前を持つインターフェイスを使用する NetworkManager 接続プロファイルを特定します。

    # nmcli -f device,name connection show
    DEVICE  NAME
    eno1  example_profile
    ...
    Copy to Clipboard Toggle word wrap
  7. 接続プロファイルの connection.interface-name プロパティーを新しいインターフェイス名に設定します。

    # nmcli connection modify example_profile connection.interface-name "eno1np0"
    Copy to Clipboard Toggle word wrap
  8. 接続プロファイルを再アクティブ化します。

    # nmcli connection up example_profile
    Copy to Clipboard Toggle word wrap

検証

  • ネットワークインターフェイスの ID_NET_NAMING_SCHEME プロパティーを表示して、RHEL が現在使用している命名スキームを特定します。

    # udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1np0
    ID_NET_NAMING_SCHEME=_rhel-10.1
    Copy to Clipboard Toggle word wrap

1.5. インストール時のイーサネットインターフェイスの接頭辞のカスタマイズ

イーサネットインターフェイスにデフォルトのデバイス命名ポリシーを使用しない場合は、Red Hat Enterprise Linux (RHEL) のインストール時にカスタムデバイス接頭辞を設定できます。

重要

Red Hat は、RHEL のインストール時に接頭辞を設定した場合にのみ、カスタマイズされたイーサネット接頭辞を持つシステムをサポートします。すでにデプロイされているシステムでの prefixdevname ユーティリティーの使用はサポートされていません。

インストール時にデバイス接頭辞を設定した場合、udev サービスはインストール後にイーサネットインターフェイスに <prefix><index> という形式を使用します。たとえば、接頭辞 net を設定すると、サービスはイーサネットインターフェイスに net0net1 などの名前を割り当てます。

udev サービスはカスタム接頭辞にインデックスを追加し、既知のイーサネットインターフェイスのインデックス値を保存します。インターフェイスを追加すると、udev は、以前に割り当てたインデックス値より 1 大きいインデックス値を新しいインターフェイスに割り当てます。

前提条件

  • 接頭辞が ASCII 文字で構成されている。
  • 接頭辞が英数字の文字列である。
  • 接頭辞が 16 文字未満である。
  • 接頭辞が、ethenoensem などの他の既知のネットワークインターフェイス接頭辞と競合しない。

手順

  1. Red Hat Enterprise Linux インストールメディアを起動します。
  2. ブートマネージャーで、次の手順を実行します。

    1. Install Red Hat Enterprise Linux <version> エントリーを選択します。
    2. Tab を押してエントリーを編集します。
    3. net.ifnames.prefix=<prefix> をカーネルオプションに追加します。
    4. Enter を押してインストールプログラムを起動します。
  3. Red Hat Enterprise Linux をインストールします。

検証

  • インターフェイス名を確認するには、ネットワークインターフェイスを表示します。

    # ip link show
    ...
    2: net0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap

1.6. udev ルールを使用したユーザー定義のネットワークインターフェイス名の設定

udev ルールを使用して、組織の要件を反映したカスタムネットワークインターフェイス名を実装できます。

手順

  1. 名前を変更するネットワークインターフェイスを特定します。

    # ip link show
    ...
    enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap

    インターフェイスの MAC アドレスを記録します。

  2. インターフェイスのデバイスタイプ ID を表示します。

    # cat /sys/class/net/enp1s0/type
    1
    Copy to Clipboard Toggle word wrap
  3. /etc/udev/rules.d/70-persistent-net.rules ファイルを作成し、名前を変更する各インターフェイスのルールを追加します。

    SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="<MAC_address>",ATTR{type}=="<device_type_id>",NAME="<new_interface_name>"
    Copy to Clipboard Toggle word wrap
    重要

    ブートプロセス中に一貫したデバイス名が必要な場合は、ファイル名として 70-persistent-net.rules のみを使用してください。RAM ディスクイメージを再生成すると、dracut ユーティリティーはこの名前のファイルを initrd イメージに追加します。

    たとえば、次のルールを使用して、MAC アドレス 00:00:5e:00:53:1a のインターフェイスの名前を provider0 に変更します。

    SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:5e:00:53:1a",ATTR{type}=="1",NAME="provider0"
    Copy to Clipboard Toggle word wrap
  4. オプション: initrd RAM ディスクイメージを再生成します。

    # dracut -f
    Copy to Clipboard Toggle word wrap

    この手順は、RAM ディスクにネットワーク機能が必要な場合にのみ必要です。たとえば、ルートファイルシステムが iSCSI などのネットワークデバイスに保存されている場合がこれに当てはまります。

  5. 名前を変更するインターフェイスを使用する NetworkManager 接続プロファイルを特定します。

    # nmcli -f device,name connection show
    DEVICE  NAME
    enp1s0  example_profile
    ...
    Copy to Clipboard Toggle word wrap
  6. 接続プロファイルの connection.interface-name プロパティーの設定を解除します。

    # nmcli connection modify example_profile connection.interface-name ""
    Copy to Clipboard Toggle word wrap
  7. 一時的に、新しいインターフェイス名と以前のインターフェイス名の両方に一致するように接続プロファイルを設定します。

    # nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
    Copy to Clipboard Toggle word wrap
  8. システムを再起動します。

    # reboot
    Copy to Clipboard Toggle word wrap
  9. リンクファイルで指定した MAC アドレスを持つデバイスの名前が Provider0 に変更されていることを確認します。

    # ip link show
    provider0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
        link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap
  10. 新しいインターフェイス名のみと一致するように接続プロファイルを設定します。

    # nmcli connection modify example_profile match.interface-name "provider0"
    Copy to Clipboard Toggle word wrap

    これで、接続プロファイルから古いインターフェイス名が削除されました。

  11. 接続プロファイルを再アクティブ化します。

    # nmcli connection up example_profile
    Copy to Clipboard Toggle word wrap

第2章 イーサネット接続の設定

NetworkManager は、ホストにインストールされている各イーサネットアダプターの接続プロファイルを作成します。デフォルトでは、このプロファイルは IPv4 接続と IPv6 接続の両方に DHCP を使用します。次の場合は、この自動作成されたプロファイルを変更するか、新しいプロファイルを追加してください。

  • ネットワークに、静的 IP アドレス設定などのカスタム設定が必要な場合
  • ホストが異なるネットワーク間をローミングするため、複数のプロファイルが必要な場合

Red Hat Enterprise Linux は、イーサネット接続を設定するためのさまざまなオプションを管理者に提供します。以下に例を示します。

  • nmcli を使用して、コマンドラインで接続を設定します。
  • nmtui を使用して、テキストベースのユーザーインターフェイスで接続を設定します。
  • GNOME Settings メニューを使用して、グラフィカルインターフェイスで接続を設定します。
  • nmstatectl を使用して、Nmstate API を介して接続を設定します。
  • RHEL システムロールを使用して、1 つまたは複数のホストで接続の設定を自動化する。
注記

Microsoft Azure クラウドで実行しているホストでイーサネット接続を手動で設定する場合は、cloud-init サービスを無効にするか、クラウド環境から取得したネットワーク設定を無視するように設定します。それ以外の場合は、cloud-init は、手動で設定したネットワーク設定を次回の再起動時に上書きされます。

2.1. nmcli を使用したイーサネット接続の設定

イーサネット経由でホストをネットワークに接続する場合は、nmcli ユーティリティーを使用してコマンドラインで接続の設定を管理できます。

前提条件

  • サーバーの構成に物理または仮想イーサネットネットワークインターフェイスコントローラー (NIC) が存在する。

手順

  1. NetworkManager 接続プロファイルをリストします。

    # nmcli connection show
    NAME                UUID                                  TYPE      DEVICE
    Wired connection 1  a5eb6490-cc20-3668-81f8-0314a27f3f75  ethernet  enp1s0
    Copy to Clipboard Toggle word wrap

    デフォルトでは、NetworkManager はホスト内の各 NIC のプロファイルを作成します。この NIC を特定のネットワークにのみ接続する予定がある場合は、自動作成されたプロファイルを調整してください。この NIC をさまざまな設定のネットワークに接続する予定がある場合は、ネットワークごとに個別のプロファイルを作成してください。

  2. 追加の接続プロファイルを作成する場合は、次のように実行します。

    # nmcli connection add con-name <connection-name> ifname <device-name> type ethernet
    Copy to Clipboard Toggle word wrap

    既存のプロファイルを変更するには、この手順をスキップしてください。

  3. オプション: 接続プロファイルの名前を変更します。

    # nmcli connection modify "Wired connection 1" connection.id "Internal-LAN"
    Copy to Clipboard Toggle word wrap

    ホストに複数のプロファイルがある場合は、わかりやすい名前を付けると、プロファイルの目的を識別しやすくなります。

  4. 接続プロファイルの現在の設定を表示します。

    # nmcli connection show Internal-LAN
    ...
    connection.interface-name:     enp1s0
    connection.autoconnect:        yes
    ipv4.method:                   auto
    ipv6.method:                   auto
    ...
    Copy to Clipboard Toggle word wrap
  5. IPv4 を設定します。

    • DHCP を使用するには、次のように実行します。

      # nmcli connection modify Internal-LAN ipv4.method auto
      Copy to Clipboard Toggle word wrap

      ipv4.method がすでに auto (デフォルト) に設定されている場合は、この手順をスキップしてください。

    • 静的 IPv4 アドレス、ネットワークマスク、デフォルトゲートウェイ、DNS サーバー、および検索ドメインを設定するには、次のように実行します。

      # nmcli connection modify Internal-LAN ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
      Copy to Clipboard Toggle word wrap
  6. IPv6 設定を行います。

    • ステートレスアドレス自動設定 (SLAAC) を使用するには、次のように実行します。

      # nmcli connection modify Internal-LAN ipv6.method auto
      Copy to Clipboard Toggle word wrap

      ipv6.method がすでに auto (デフォルト) に設定されている場合は、この手順をスキップしてください。

    • 静的 IPv6 アドレス、ネットワークマスク、デフォルトゲートウェイ、DNS サーバー、および検索ドメインを設定するには、次のように実行します。

      # nmcli connection modify Internal-LAN ipv6.method manual ipv6.addresses 2001:db8:1::fffe/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
      Copy to Clipboard Toggle word wrap
  7. プロファイルの他の設定をカスタマイズするには、次のコマンドを使用します。

    # nmcli connection modify <connection-name> <setting> <value>
    Copy to Clipboard Toggle word wrap

    値はスペースまたはセミコロンで引用符で囲みます。

    変更できる設定の詳細は、システム上の nm-settings(5) man ページを参照してください。

  8. プロファイルをアクティブ化します。

    # nmcli connection up Internal-LAN
    Copy to Clipboard Toggle word wrap

検証

  1. NIC の IP 設定を表示します。

    # ip address show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. IPv4 デフォルトゲートウェイを表示します。

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  3. IPv6 デフォルトゲートウェイを表示します。

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  4. DNS 設定を表示します。

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    複数の接続プロファイルが同時にアクティブな場合、nameserver エントリーの順序は、これらのプロファイルの DNS 優先度の値と接続タイプによって異なります。

  5. ping ユーティリティーを使用して、このホストがパケットを他のホストに送信できることを確認します。

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

トラブルシューティング

  • ネットワークケーブルがホストとスイッチに差し込まれていることを確認します。
  • リンク障害がこのホストだけに存在するか、同じスイッチに接続された他のホストにも存在するかを確認します。
  • ネットワークケーブルとネットワークインターフェイスが予想どおりに機能していることを確認します。ハードウェア診断手順を実行し、不具合のあるケーブルとネットワークインターフェイスカードを交換します。
  • ディスクの設定がデバイスの設定と一致しない場合は、NetworkManager を起動するか再起動して、インメモリー接続を作成することで、デバイスの設定を反映します。この問題の詳細と回避方法は、Red Hat ナレッジベースのソリューション記事 NetworkManager duplicates a connection after restart of NetworkManager service を参照してください。

2.2. nmtui を使用したイーサネット接続の設定

イーサネット経由でホストをネットワークに接続する場合は、nmtui アプリケーションを使用して、テキストベースのユーザーインターフェイスで接続の設定を管理できます。nmtui では、グラフィカルインターフェイスを使用せずに、新しいプロファイルの作成や、ホスト上の既存のプロファイルの更新を行います。

注記

nmtui で以下を行います。

  • カーソルキーを使用してナビゲートします。
  • ボタンを選択して Enter を押します。
  • Space を使用してチェックボックスをオンまたはオフにします。
  • 前の画面に戻るには、ESC を使用します。

前提条件

  • サーバーの構成に物理または仮想イーサネットネットワークインターフェイスコントローラー (NIC) が存在する。

手順

  1. 接続に使用するネットワークデバイス名がわからない場合は、使用可能なデバイスを表示します。

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    enp1s0     ethernet  unavailable             --
    ...
    Copy to Clipboard Toggle word wrap
  2. nmtui を開始します。

    # nmtui
    Copy to Clipboard Toggle word wrap
  3. Edit a connection を選択し、Enter を押します。
  4. 新しい接続プロファイルを追加するか、既存の接続プロファイルを変更するかを選択します。

    • 新しいプロファイルを作成するには、以下を実行します。

      1. Add を押します。
      2. ネットワークタイプのリストから Ethernet を選択し、Enter を押します。
    • 既存のプロファイルを変更するには、リストからプロファイルを選択し、Enter を押します。
  5. オプション: 接続プロファイルの名前を更新します。

    ホストに複数のプロファイルがある場合は、わかりやすい名前を付けると、プロファイルの目的を識別しやすくなります。

  6. 新しい接続プロファイルを作成する場合は、ネットワークデバイス名を connection フィールドに入力します。
  7. 環境に応じて、IPv4 configuration および IPv6 configuration 領域に IP アドレス設定を設定します。これを行うには、これらの領域の横にあるボタンを押して、次を選択します。

    • この接続に IP アドレスが必要ない場合は、Disabled にします。
    • DHCP サーバーが IP アドレスをこの NIC に動的に割り当てる場合は、Automatic にします。
    • ネットワークで静的 IP アドレス設定が必要な場合は、Manual にします。この場合、さらにフィールドに入力する必要があります。

      1. 設定するプロトコルの横にある Show を押して、追加のフィールドを表示します。
      2. Addresses の横にある Add を押して、IP アドレスとサブネットマスクを Classless Inter-Domain Routing (CIDR) 形式で入力します。

        サブネットマスクを指定しない場合、NetworkManager は IPv4 アドレスに /32 サブネットマスクを設定し、IPv6 アドレスに /64 サブネットマスクを設定します。

      3. デフォルトゲートウェイのアドレスを入力します。
      4. DNS servers の横にある Add を押して、DNS サーバーのアドレスを入力します。
      5. Search domains の横にある Add を押して、DNS 検索ドメインを入力します。

    図2.1 静的 IP アドレス設定によるイーサネット接続の例

  8. OK を押すと、新しい接続が作成され、自動的にアクティブ化されます。
  9. Back を押してメインメニューに戻ります。
  10. Quit を選択し、Enter キーを押して nmtui アプリケーションを閉じます。

検証

  1. NIC の IP 設定を表示します。

    # ip address show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. IPv4 デフォルトゲートウェイを表示します。

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  3. IPv6 デフォルトゲートウェイを表示します。

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  4. DNS 設定を表示します。

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    複数の接続プロファイルが同時にアクティブな場合、nameserver エントリーの順序は、これらのプロファイルの DNS 優先度の値と接続タイプによって異なります。

  5. ping ユーティリティーを使用して、このホストがパケットを他のホストに送信できることを確認します。

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

トラブルシューティング

  • ネットワークケーブルがホストとスイッチに差し込まれていることを確認します。
  • リンク障害がこのホストだけに存在するか、同じスイッチに接続された他のホストにも存在するかを確認します。
  • ネットワークケーブルとネットワークインターフェイスが予想どおりに機能していることを確認します。ハードウェア診断手順を実行し、不具合のあるケーブルとネットワークインターフェイスカードを交換します。
  • ディスクの設定がデバイスの設定と一致しない場合は、NetworkManager を起動するか再起動して、インメモリー接続を作成することで、デバイスの設定を反映します。この問題の詳細と回避方法は、Red Hat ナレッジベースのソリューション記事 NetworkManager duplicates a connection after restart of NetworkManager service を参照してください。

2.3. control-center によるイーサネット接続の設定

イーサネット経由でホストをネットワークに接続する場合は、GNOME Settings メニューを使用して、グラフィカルインターフェイスで接続の設定を管理できます。

control-centernmcli ユーティリティーほど多くの設定オプションをサポートしていないことに注意してください。

前提条件

  • サーバーの構成に物理または仮想イーサネットネットワークインターフェイスコントローラー (NIC) が存在する。
  • GNOME がインストールされている。

手順

  1. Super キーを押して Settings を入力し、Enter を押します。
  2. 左側のナビゲーションにある Network を選択します。
  3. 新しい接続プロファイルを追加するか、既存の接続プロファイルを変更するかを選択します。

    • 新しいプロファイルを作成するには、Ethernet エントリーの横にある + ボタンをクリックします。
    • 既存のプロファイルを変更するには、プロファイルエントリーの横にある歯車アイコンをクリックします。
  4. オプション: Identity タブで、接続プロファイルの名前を更新します。

    ホストに複数のプロファイルがある場合は、わかりやすい名前を付けると、プロファイルの目的を識別しやすくなります。

  5. 環境に応じて、IPv4 タブと IPv6 タブで IP アドレス設定を設定します。

    • DHCP または IPv6 ステートレスアドレス自動設定 (SLAAC) を使用するには、方法として Automatic (DHCP) を選択します (デフォルト)。
    • 静的 IP アドレス、ネットワークマスク、デフォルトゲートウェイ、DNS サーバー、および検索ドメインを設定するには、方法として Manual を選択し、タブのフィールドに入力します。

  6. 接続プロファイルを追加するか変更するかに応じて、Add または Apply ボタンをクリックして接続を保存します。

    GNOME の control-center は、接続を自動的にアクティブにします。

検証

  1. NIC の IP 設定を表示します。

    # ip address show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. IPv4 デフォルトゲートウェイを表示します。

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  3. IPv6 デフォルトゲートウェイを表示します。

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  4. DNS 設定を表示します。

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    複数の接続プロファイルが同時にアクティブな場合、nameserver エントリーの順序は、これらのプロファイルの DNS 優先度の値と接続タイプによって異なります。

  5. ping ユーティリティーを使用して、このホストがパケットを他のホストに送信できることを確認します。

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

トラブルシューティングの手順

  • ネットワークケーブルがホストとスイッチに差し込まれていることを確認します。
  • リンク障害がこのホストだけに存在するか、同じスイッチに接続された他のホストにも存在するかを確認します。
  • ネットワークケーブルとネットワークインターフェイスが予想どおりに機能していることを確認します。ハードウェア診断手順を実行し、不具合のあるケーブルとネットワークインターフェイスカードを交換します。
  • ディスクの設定がデバイスの設定と一致しない場合は、NetworkManager を起動するか再起動して、インメモリー接続を作成することで、デバイスの設定を反映します。この問題の詳細と回避方法は、Red Hat ナレッジベースのソリューション記事 NetworkManager duplicates a connection after restart of NetworkManager service を参照してください。

nmstatectl ユーティリティーを使用して、Nmstate API を介してイーサネット接続を設定します。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

Nmstate を使用すると、静的 IP アドレス、ゲートウェイ、および DNS 設定を使用してイーサネット接続を設定し、それらを指定のインターフェイス名に割り当てることができます。

前提条件

  • サーバーの構成に物理または仮想イーサネットネットワークインターフェイスコントローラー (NIC) が存在する。
  • nmstate パッケージがインストールされている。

手順

  1. 以下の内容を含む YAML ファイル (例: ~/create-ethernet-profile.yml) を作成します。

    ---
    interfaces:
    - name: enp1s0
      type: ethernet
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: enp1s0
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: enp1s0
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    これらの設定では、次の設定を使用して enp1s0 デバイスのイーサネット接続プロファイルを定義します。

    • 静的 IPv4 アドレス: 192.0.2.1 (サブネットマスクが /24)
    • 静的 IPv6 アドレス: 2001:db8:1::1 (サブネットマスクが /64)
    • IPv4 デフォルトゲートウェイ - 192.0.2.254
    • IPv6 デフォルトゲートウェイ - 2001:db8:1::fffe
    • IPv4 DNS サーバー - 192.0.2.200
    • IPv6 DNS サーバー - 2001:db8:1::ffbb
    • DNS 検索ドメイン - example.com
  2. オプション: interfaces プロパティーで identifier: mac-address および mac-address: <mac_address> プロパティーを定義すると、ネットワークインターフェイスカードを名前ではなく MAC アドレスで識別できます。次に例を示します。

    ---
    interfaces:
    - name: <profile_name>
      type: ethernet
      identifier: mac-address
      mac-address: <mac_address>
      ...
    Copy to Clipboard Toggle word wrap
  3. 設定をシステムに適用します。

    # nmstatectl apply ~/create-ethernet-profile.yml
    Copy to Clipboard Toggle word wrap

検証

  1. 現在の状態を YAML 形式で表示します。

    # nmstatectl show enp1s0
    Copy to Clipboard Toggle word wrap
  2. NIC の IP 設定を表示します。

    # ip address show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  3. IPv4 デフォルトゲートウェイを表示します。

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  4. IPv6 デフォルトゲートウェイを表示します。

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  5. DNS 設定を表示します。

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    複数の接続プロファイルが同時にアクティブな場合、nameserver エントリーの順序は、これらのプロファイルの DNS 優先度の値と接続タイプによって異なります。

  6. ping ユーティリティーを使用して、このホストがパケットを他のホストに送信できることを確認します。

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

2.5. nmstatectl で PCI アドレスを指定して静的 IP アドレスによるイーサネット接続を設定する

nmstatectl ユーティリティーを使用して、Nmstate API を介してイーサネット接続を設定します。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

Nmstate を使用すると、静的 IP アドレス、ゲートウェイ、および DNS 設定を使用してイーサネット接続を設定し、それらをインターフェイス名ではなく PCI アドレスに基づいてデバイスに割り当てることができます。

前提条件

  • サーバーの構成に物理イーサネットネットワークインターフェイスコントローラー (NIC) が存在する。
  • デバイスの PCI アドレスがわかっている。PCI アドレスは、ethtool -i <interface_name> | grep bus-info コマンドを使用して確認できます。
  • nmstate パッケージがインストールされている。

手順

  1. 以下の内容を含む YAML ファイル (例: ~/create-ethernet-profile.yml) を作成します。

    ---
    interfaces:
    - name: <profile_name>
      type: ethernet
      state: up
      identifier: pci-address
      pci-address: 0000:00:14.3
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: <profile_name>
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: <profile_name>
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    上記の設定により、ID 0000:00:14.3 のデバイスのイーサネット接続プロファイルが、以下の設定で定義されます。

    • 静的 IPv4 アドレス: 192.0.2.1 (サブネットマスクが /24)
    • 静的 IPv6 アドレス: 2001:db8:1::1 (サブネットマスクが /64)
    • IPv4 デフォルトゲートウェイ - 192.0.2.254
    • IPv6 デフォルトゲートウェイ - 2001:db8:1::fffe
    • IPv4 DNS サーバー - 192.0.2.200
    • IPv6 DNS サーバー - 2001:db8:1::ffbb
    • DNS 検索ドメイン - example.com
  2. 設定をシステムに適用します。

    # nmstatectl apply ~/create-ethernet-profile.yml
    Copy to Clipboard Toggle word wrap

検証

  1. 現在の状態を YAML 形式で表示します。

    # nmstatectl show <interface_name>
    Copy to Clipboard Toggle word wrap
  2. NIC の IP 設定を表示します。

    # ip address show <interface_name>
    2: :<interface_name> <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute <interface_name>
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  3. IPv4 デフォルトゲートウェイを表示します。

    # ip route show default
    default via 192.0.2.254 dev <interface_name> proto static metric 102
    Copy to Clipboard Toggle word wrap
  4. IPv6 デフォルトゲートウェイを表示します。

    # ip -6 route show default
    default via 2001:db8:1::fffe dev <interface_name> proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  5. DNS 設定を表示します。

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap
  6. ping ユーティリティーを使用して、このホストがパケットを他のホストに送信できることを確認します。

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

Red Hat Enterprise Linux ホストをイーサネットネットワークに接続するには、ネットワークデバイスの NetworkManager 接続プロファイルを作成します。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

network RHEL システムロールを使用すると、静的 IP アドレス、ゲートウェイ、および DNS 設定を使用してイーサネット接続を設定し、それらを指定のインターフェイス名に割り当てることができます。

通常、管理者は Playbook を再利用します。Ansible が静的 IP アドレスを割り当てるホストごとに、個別の Playbook を管理することはありません。そうすることにより、Playbook 内の変数を使用し、外部ファイルで設定を維持できます。その結果、複数のホストに個別の設定を動的に割り当てるために必要な Playbook が 1 つだけになります。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • サーバーの構成に物理または仮想イーサネットデバイスが存在する。
  • 管理対象ノードが NetworkManager を使用してネットワークを設定している。

手順

  1. ~/inventory ファイルを編集し、ホストエントリーにホスト固有の設定を追加します。

    managed-node-01.example.com interface=enp1s0 ip_v4=192.0.2.1/24 ip_v6=2001:db8:1::1/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe
    
    managed-node-02.example.com interface=enp1s0 ip_v4=192.0.2.2/24 ip_v6=2001:db8:1::2/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe
    Copy to Clipboard Toggle word wrap
  2. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com,managed-node-02.example.com
      tasks:
        - name: Ethernet connection profile with static IP address settings
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: "{{ interface }}"
                interface_name: "{{ interface }}"
                type: ethernet
                autoconnect: yes
                ip:
                  address:
                    - "{{ ip_v4 }}"
                    - "{{ ip_v6 }}"
                  gateway4: "{{ gateway_v4 }}"
                  gateway6: "{{ gateway_v6 }}"
                  dns:
                    - 192.0.2.200
                    - 2001:db8:1::ffbb
                  dns_search:
                    - example.com
                state: up
    Copy to Clipboard Toggle word wrap

    この Playbook は、インベントリーファイルから各ホストの特定の値を動的に読み取り、すべてのホストで同じ設定に対して Playbook 内の静的な値を使用します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  3. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  4. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • 管理対象ノードの Ansible fact をクエリーし、アクティブなネットワーク設定を確認します。

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...
    Copy to Clipboard Toggle word wrap

Red Hat Enterprise Linux ホストをイーサネットネットワークに接続するには、ネットワークデバイスの NetworkManager 接続プロファイルを作成します。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

network RHEL システムロールを使用すると、静的 IP アドレス、ゲートウェイ、および DNS 設定を使用してイーサネット接続を設定し、それらを名前ではなくパスに基づいてデバイスに割り当てることができます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • サーバーの構成に物理または仮想イーサネットデバイスが存在する。
  • 管理対象ノードが NetworkManager を使用してネットワークを設定している。
  • デバイスのパスがわかっている。udevadm info /sys/class/net/<device_name> | grep ID_PATH= コマンドを使用すると、デバイスパスを表示できます。

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with static IP address settings
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: example
                match:
                  path:
                    - pci-0000:00:0[1-3].0
                    - '&!pci-0000:00:02.0'
                type: ethernet
                autoconnect: yes
                ip:
                  address:
                    - 192.0.2.1/24
                    - 2001:db8:1::1/64
                  gateway4: 192.0.2.254
                  gateway6: 2001:db8:1::fffe
                  dns:
                    - 192.0.2.200
                    - 2001:db8:1::ffbb
                  dns_search:
                    - example.com
                state: up
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    match
    設定を適用するために満たす必要がある条件を定義します。この変数は path オプションでのみ使用できます。
    path
    デバイスの永続パスを定義します。固定パスまたは式の形式で設定できます。値には修飾子とワイルドカードを含めることができます。この例では、PCI ID 0000:00:0[1-3].0 に一致するデバイスには設定を適用しますが、0000:00:02.0 に一致するデバイスには適用しません。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • 管理対象ノードの Ansible fact をクエリーし、アクティブなネットワーク設定を確認します。

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...
    Copy to Clipboard Toggle word wrap

2.8. nmstatectl でインターフェイス名を指定して動的 IP アドレスによる Ethernet 接続を設定する

nmstatectl ユーティリティーを使用して、Nmstate API を介してイーサネット接続を設定します。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

Nmstate を使用すると、DHCP サーバーおよび IPv6 ステートレスアドレス自動設定 (SLAAC) から IP アドレス、ゲートウェイ、および DNS 設定を取得するイーサネット接続を設定できます。指定したインターフェイス名に接続プロファイルを割り当てることができます。

前提条件

  • サーバーの構成に物理または仮想イーサネットネットワークインターフェイスコントローラー (NIC) が存在する。
  • DHCP サーバーをネットワークで使用できる。
  • nmstate パッケージがインストールされている。

手順

  1. 以下の内容を含む YAML ファイル (例: ~/create-ethernet-profile.yml) を作成します。

    ---
    interfaces:
    - name: enp1s0
      type: ethernet
      state: up
      ipv4:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        dhcp: true
      ipv6:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        autoconf: true
        dhcp: true
    Copy to Clipboard Toggle word wrap

    これらの設定では、enp1s0 デバイスのイーサネット接続プロファイルを定義します。接続では、DHCP サーバーと IPv6 ステートレスアドレス自動設定 (SLAAC) から、IPv4 アドレス、IPv6 アドレス、デフォルトゲートウェイ、ルート、DNS サーバー、および検索ドメインを取得します。

  2. オプション: interfaces プロパティーで identifier: mac-address および mac-address: <mac_address> プロパティーを定義すると、ネットワークインターフェイスカードを名前ではなく MAC アドレスで識別できます。次に例を示します。

    ---
    interfaces:
    - name: <profile_name>
      type: ethernet
      identifier: mac-address
      mac-address: <mac_address>
      ...
    Copy to Clipboard Toggle word wrap
  3. 設定をシステムに適用します。

    # nmstatectl apply ~/create-ethernet-profile.yml
    Copy to Clipboard Toggle word wrap

検証

  1. 現在の状態を YAML 形式で表示します。

    # nmstatectl show enp1s0
    Copy to Clipboard Toggle word wrap
  2. NIC の IP 設定を表示します。

    # ip address show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  3. IPv4 デフォルトゲートウェイを表示します。

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  4. IPv6 デフォルトゲートウェイを表示します。

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  5. DNS 設定を表示します。

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    複数の接続プロファイルが同時にアクティブな場合、nameserver エントリーの順序は、これらのプロファイルの DNS 優先度の値と接続タイプによって異なります。

  6. ping ユーティリティーを使用して、このホストがパケットを他のホストに送信できることを確認します。

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

2.9. nmstatectl で PCI アドレスを指定して動的 IP アドレスによるイーサネット接続を設定する

nmstatectl ユーティリティーを使用して、Nmstate API を介してイーサネット接続を設定します。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

Nmstate を使用すると、DHCP サーバーおよび IPv6 ステートレスアドレス自動設定 (SLAAC) から IP アドレス、ゲートウェイ、および DNS 設定を取得するイーサネット接続を設定できます。インターフェイス名ではなく PCI アドレスに基づいてデバイスに接続プロファイルを割り当てることができます。

前提条件

  • サーバーの構成に物理イーサネットデバイスが存在する。
  • ネットワーク内で DHCP サーバーと SLAAC が利用できる。
  • 管理対象ホストは、NetworkManager を使用してネットワークを設定します。
  • デバイスの PCI アドレスがわかっている。PCI アドレスは、ethtool -i <interface_name> | grep bus-info コマンドを使用して確認できます。
  • nmstate パッケージがインストールされている。

手順

  1. 以下の内容を含む YAML ファイル (例: ~/create-ethernet-profile.yml) を作成します。

    ---
    interfaces:
    - name: <profile_name>
      type: ethernet
      state: up
      identifier: pci-address
      pci-address: 0000:00:14.3
      ipv4:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        dhcp: true
      ipv6:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        autoconf: true
        dhcp: true
    Copy to Clipboard Toggle word wrap

    上記の設定により、ID 0000:00:14.3 のデバイスのイーサネット接続プロファイルが定義されます。接続では、DHCP サーバーと IPv6 ステートレスアドレス自動設定 (SLAAC) から、IPv4 アドレス、IPv6 アドレス、デフォルトゲートウェイ、ルート、DNS サーバー、および検索ドメインを取得します。

  2. 設定をシステムに適用します。

    # nmstatectl apply ~/create-ethernet-profile.yml
    Copy to Clipboard Toggle word wrap

検証

  1. 現在の状態を YAML 形式で表示します。

    # nmstatectl show <interface_name>
    Copy to Clipboard Toggle word wrap
  2. NIC の IP 設定を表示します。

    # ip address show <interface_name>
    2: <interface_name>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute <interface_name>
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  3. IPv4 デフォルトゲートウェイを表示します。

    # ip route show default
    default via 192.0.2.254 dev <interface_name> proto static metric 102
    Copy to Clipboard Toggle word wrap
  4. IPv6 デフォルトゲートウェイを表示します。

    # ip -6 route show default
    default via 2001:db8:1::fffe dev <interface_name> proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  5. DNS 設定を表示します。

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap
  6. ping ユーティリティーを使用して、このホストがパケットを他のホストに送信できることを確認します。

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

Red Hat Enterprise Linux ホストをイーサネットネットワークに接続するには、ネットワークデバイスの NetworkManager 接続プロファイルを作成します。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

network RHEL システムロールを使用すると、DHCP サーバーおよび IPv6 ステートレスアドレス自動設定 (SLAAC) から IP アドレス、ゲートウェイ、および DNS 設定を取得するイーサネット接続を設定できます。このロールを使用すると、指定のインターフェイス名に接続プロファイルを割り当てることができます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • サーバーの構成に物理または仮想イーサネットデバイスが存在する。
  • ネットワーク内で DHCP サーバーと SLAAC が利用できる。
  • 管理対象ノードが NetworkManager サービスを使用してネットワークを設定している。

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with dynamic IP address settings
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: enp1s0
                interface_name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  dhcp4: yes
                  auto6: yes
                state: up
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    dhcp4: yes
    DHCP、PPP、または同様のサービスからの自動 IPv4 アドレス割り当てを有効にします。
    auto6: yes
    IPv6 自動設定を有効にします。デフォルトでは、NetworkManager はルーター広告を使用します。ルーターが managed フラグを通知すると、NetworkManager は DHCPv6 サーバーに IPv6 アドレスと接頭辞を要求します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • 管理対象ノードの Ansible fact をクエリーし、インターフェイスが IP アドレスと DNS 設定を受信したことを確認します。

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...
    Copy to Clipboard Toggle word wrap

Red Hat Enterprise Linux ホストをイーサネットネットワークに接続するには、ネットワークデバイスの NetworkManager 接続プロファイルを作成します。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

network RHEL システムロールを使用すると、DHCP サーバーおよび IPv6 ステートレスアドレス自動設定 (SLAAC) から IP アドレス、ゲートウェイ、および DNS 設定を取得するイーサネット接続を設定できます。このロールにより、インターフェイス名ではなくパスに基づいてデバイスに接続プロファイルを割り当てることができます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • サーバーの構成に物理または仮想イーサネットデバイスが存在する。
  • ネットワーク内で DHCP サーバーと SLAAC が利用できる。
  • 管理対象ホストは、NetworkManager を使用してネットワークを設定します。
  • デバイスのパスがわかっている。udevadm info /sys/class/net/<device_name> | grep ID_PATH= コマンドを使用すると、デバイスパスを表示できます。

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with dynamic IP address settings
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: example
                match:
                  path:
                    - pci-0000:00:0[1-3].0
                    - '&!pci-0000:00:02.0'
                type: ethernet
                autoconnect: yes
                ip:
                  dhcp4: yes
                  auto6: yes
                state: up
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    match: path
    設定を適用するために満たす必要がある条件を定義します。この変数は path オプションでのみ使用できます。
    path: <path_and_expressions>
    デバイスの永続パスを定義します。固定パスまたは式の形式で設定できます。値には修飾子とワイルドカードを含めることができます。この例では、PCI ID 0000:00:0[1-3].0 に一致するデバイスには設定を適用しますが、0000:00:02.0 に一致するデバイスには適用しません。
    dhcp4: yes
    DHCP、PPP、または同様のサービスからの自動 IPv4 アドレス割り当てを有効にします。
    auto6: yes
    IPv6 自動設定を有効にします。デフォルトでは、NetworkManager はルーター広告を使用します。ルーターが managed フラグを通知すると、NetworkManager は DHCPv6 サーバーに IPv6 アドレスと接頭辞を要求します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • 管理対象ノードの Ansible fact をクエリーし、インターフェイスが IP アドレスと DNS 設定を受信したことを確認します。

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...
    Copy to Clipboard Toggle word wrap

ほとんどの場合、1 つの接続プロファイルには 1 つのネットワークデバイスの設定が含まれています。ただし、接続プロファイルでインターフェイス名を設定する場合、NetworkManager はワイルドカードもサポートします。ホストが動的 IP アドレス割り当てを使用してイーサネットネットワーク間をローミングする場合、この機能を使用して、複数のイーサネットインターフェイスに使用できる単一の接続プロファイルを作成できます。

前提条件

  • サーバーの構成に物理または仮想イーサネットデバイスが複数存在する。
  • DHCP サーバーをネットワークで使用できる。
  • ホストに接続プロファイルが存在しません。

手順

  1. enp で始まるすべてのインターフェイス名に適用される接続プロファイルを追加します。

    # nmcli connection add con-name "Wired connection 1" connection.multi-connect multiple match.interface-name enp* type ethernet
    Copy to Clipboard Toggle word wrap

検証

  1. 単一接続プロファイルのすべての設定を表示します。

    # nmcli connection show "Wired connection 1"
    connection.id:                      Wired connection 1
    ...
    connection.multi-connect:           3 (multiple)
    match.interface-name:               enp*
    ...
    Copy to Clipboard Toggle word wrap

    3 は、インターフェイスが特定の瞬間に複数回アクティブになる可能性があることを示します。接続プロファイルは、match.interface-name パラメーターのパターンに一致するすべてのデバイスを使用するため、接続プロファイルには同じ Universally Unique Identifier (UUID) があります。

  2. 接続のステータスを表示します。

    # nmcli connection show
    NAME                UUID                                  TYPE      DEVICE
    ...
    Wired connection 1  6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1  ethernet  enp7s0
    Wired connection 1  6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1  ethernet  enp8s0
    Wired connection 1  6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1  ethernet  enp9s0
    Copy to Clipboard Toggle word wrap

2.13. PCI ID を使用した複数のイーサネットインターフェイスの単一接続プロファイルの設定

PCI ID は、システムに接続されているデバイスの一意の識別子です。接続プロファイルは、PCI ID のリストに基づいてインターフェイスを照合することにより、複数のデバイスを追加します。この手順を使用して、複数のデバイス PCI ID を単一の接続プロファイルに接続できます。

前提条件

  • サーバーの構成に物理または仮想イーサネットデバイスが複数存在する。
  • DHCP サーバーをネットワークで使用できる。
  • ホストに接続プロファイルが存在しません。

手順

  1. デバイスパスを特定します。たとえば、enp で始まるすべてのインターフェイスのデバイスパスを表示するには、次のように実行します。

    # udevadm info /sys/class/net/enp* | grep ID_PATH=
    ...
    E: ID_PATH=pci-0000:07:00.0
    E: ID_PATH=pci-0000:08:00.0
    Copy to Clipboard Toggle word wrap
  2. 0000:00:0[7-8].0 式に一致するすべての PCI ID に適用される接続プロファイルを追加します。

    # nmcli connection add type ethernet connection.multi-connect multiple match.path "pci-0000:07:00.0 pci-0000:08:00.0" con-name "Wired connection 1"
    Copy to Clipboard Toggle word wrap

検証

  1. 接続のステータスを表示します。

    # nmcli connection show
    NAME                 UUID                                  TYPE      DEVICE
    Wired connection 1   9cee0958-512f-4203-9d3d-b57af1d88466  ethernet  enp7s0
    Wired connection 1   9cee0958-512f-4203-9d3d-b57af1d88466  ethernet  enp8s0
    ...
    Copy to Clipboard Toggle word wrap
  2. 接続プロファイルのすべての設定を表示するには、次のコマンドを実行します。

    # nmcli connection show "Wired connection 1"
    connection.id:               Wired connection 1
    ...
    connection.multi-connect:    3 (multiple)
    match.path:                  pci-0000:07:00.0,pci-0000:08:00.0
    ...
    Copy to Clipboard Toggle word wrap

    この接続プロファイルは、match.path パラメーターのパターンに一致する PCI ID を持つすべてのデバイスを使用するため、接続プロファイルには同じ Universally Unique Identifier (UUID) があります。

第3章 ネットワークボンディングの設定

ネットワークボンディングは、物理ネットワークインターフェイスと仮想ネットワークインターフェイスを組み合わせるか集約して、より高いスループットまたは冗長性を備えた論理インターフェイスを提供する方法です。ボンディングでは、カーネルがすべての操作を排他的に処理します。イーサネットデバイスや VLAN など、さまざまなタイプのデバイスでネットワークボンディングを作成できます。

Red Hat Enterprise Linux は、ボンディングデバイスを設定するためのさまざまなオプションを管理者に提供します。以下に例を示します。

  • nmcli を使用し、コマンドラインを使用してボンディング接続を設定します。
  • RHEL Web コンソールを使用し、Web ブラウザーを使用してボンディング接続を設定します。
  • nmtui を使用して、テキストベースのユーザーインターフェイスでボンディング接続を設定します。
  • nmstatectl を使用して、Nmstate API を介してボンディング接続を設定します。
  • RHEL システムロールを使用して、1 つまたは複数のホストでボンディング設定を自動化します。

3.1. コントローラーおよびポートインターフェイスのデフォルト動作の理解

NetworkManager サービスを使用してボンディングポートインターフェイスを管理またはトラブルシューティングする場合は、以下のデフォルトの動作を考慮してください。

  • コントローラーインターフェイスを起動しても、ポートインターフェイスは自動的に起動しない。
  • ポートインターフェイスを起動すると、コントローラーインターフェイスは毎回、起動する。
  • コントローラーインターフェイスを停止すると、ポートインターフェイスも停止する。
  • ポートのないコントローラーは、静的 IP 接続を開始できる。
  • コントローラーにポートがない場合は、DHCP 接続の開始時にポートを待つ。
  • DHCP 接続でポートを待機中のコントローラーは、キャリアを伴うポートの追加時に完了する。
  • DHCP 接続でポートを待機中のコントローラーは、キャリアを伴わないポートを追加する時に待機を継続する。

3.2. ボンディングモードに応じたアップストリームのスイッチ設定

使用するボンディングモードに応じて、スイッチでポートを設定する必要があります。

Expand
ボンディングモードスイッチの設定

0 - balance-rr

Link Aggregation Control Protocol (LACP) ネゴシエーションによるものではなく、静的な EtherChannel を有効にする必要があります。

1 - active-backup

このスイッチで必要な設定は必要ありません。

2 - balance-xor

LACP ネゴシエーションによるものではなく、静的な EtherChannel を有効にする必要があります。

3 - broadcast

LACP ネゴシエーションによるものではなく、静的な EtherChannel を有効にする必要があります。

4 - 802.3ad

LACP ネゴシエーションにより設定された EtherChannel が有効になっている必要があります。

5 - balance-tlb

このスイッチで必要な設定は必要ありません。

6 - balance-alb

このスイッチで必要な設定は必要ありません。

balance-slb

このスイッチで必要な設定は必要ありません。

スイッチの設定方法の詳細は、スイッチのドキュメントを参照してください。

重要

特定のネットワークボンディング機能 (例: fail-over メカニズム) は、ネットワークスイッチなしでのダイレクトケーブル接続に対応していません。詳細は、Red Hat ナレッジベースのソリューション記事 Is bonding supported with direct connection using crossover cables を参照してください。

3.3. nmcli を使用したネットワークボンディングの設定

コマンドラインでネットワークボンディングを設定するには、nmcli ユーティリティーを使用します。

前提条件

  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。
  • イーサネットデバイスをボンディングのポートとして使用するために、物理または仮想イーサネットデバイスがサーバーにインストールされている。
  • ボンディングのポートにブリッジ、または VLAN デバイスを使用するには、ボンディングの作成時にこれらのデバイスを作成するか、次の説明に従って事前にデバイスを作成することができます。

手順

  1. ボンドインターフェイスを作成します。

    # nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup"
    Copy to Clipboard Toggle word wrap

    このコマンドは、active-backup モードを使用する bond0 という名前のボンディングを作成します。

    Media Independent Interface (MII) 監視間隔も設定する場合は、miimon=interval オプションを bond.options プロパティーに追加します。次に例を示します。

    # nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=1000"
    Copy to Clipboard Toggle word wrap
  2. ネットワークインターフェイスを表示して、ボンドに追加する予定のインターフェイス名を書き留めます。

    # nmcli device status
    DEVICE   TYPE      STATE         CONNECTION
    enp7s0   ethernet  disconnected  --
    enp8s0   ethernet  disconnected  --
    bridge0  bridge    connected     bridge0
    bridge1  bridge    connected     bridge1
    ...
    Copy to Clipboard Toggle word wrap

    この例では、以下のように設定されています。

    • enp7s0 および enp8s0 は設定されません。これらのデバイスをポートとして使用するには、次のステップに接続プロファイルを追加します。
    • bridge0 および bridge1 には既存の接続プロファイルがあります。これらのデバイスをポートとして使用するには、次の手順でプロファイルを変更します。
  3. インターフェイスをボンディングに割り当てます。

    1. ボンディングに割り当てるインターフェイスが設定されていない場合は、インターフェイス用に新しい接続プロファイルを作成します。

      # nmcli connection add type ethernet port-type bond con-name bond0-port1 ifname enp7s0 controller bond0
      # nmcli connection add type ethernet port-type bond con-name bond0-port2 ifname enp8s0 controller bond0
      Copy to Clipboard Toggle word wrap

      これらのコマンドは、enp7s0 および enp8s0 のプロファイルを作成し、bond0 接続に追加します。

    2. 既存の接続プロファイルをボンディングに割り当てるには、以下を実行します。

      1. これらの接続の controller パラメーターを bond0 に設定します。

        # nmcli connection modify bridge0 controller bond0
        # nmcli connection modify bridge1 controller bond0
        Copy to Clipboard Toggle word wrap

        これらのコマンドは、bridge0 および bridge1 という名前の既存の接続プロファイルを bond0 接続に割り当てます。

      2. 接続を再度アクティブにします。

        # nmcli connection up bridge0
        # nmcli connection up bridge1
        Copy to Clipboard Toggle word wrap
  4. IPv4 を設定します。

    • 静的 IPv4 アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーを bond0 接続に設定するには、次のように実行します。

      # nmcli connection modify bond0 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.dns-search 'example.com' ipv4.method manual
      Copy to Clipboard Toggle word wrap
    • DHCP を使用するために必要な操作はありません。
    • このボンディングデバイスを他のデバイスのポートとして使用する予定の場合は、何もする必要はありません。
  5. IPv6 設定を行います。

    • 静的 IPv6 アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーを bond0 接続に設定するには、次のように実行します。

      # nmcli connection modify bond0 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
      Copy to Clipboard Toggle word wrap
    • ステートレスアドレス自動設定 (SLAAC) を使用する場合、アクションは必要ありません。
    • このボンディングデバイスを他のデバイスのポートとして使用する予定の場合は、何もする必要はありません。
  6. オプション: ボンディングポートにパラメーターを設定する場合は、次のコマンドを使用します。

    # nmcli connection modify bond0-port1 bond-port.<parameter> <value>
    Copy to Clipboard Toggle word wrap
  7. 接続をアクティベートします。

    # nmcli connection up bond0
    Copy to Clipboard Toggle word wrap
  8. ポートが接続されており、CONNECTION コラムがポートの接続名を表示していることを確認します。

    # nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    enp7s0   ethernet  connected  bond0-port1
    enp8s0   ethernet  connected  bond0-port2
    Copy to Clipboard Toggle word wrap

    接続のいずれかのポートをアクティブにすると、NetworkManager はボンディングもアクティブにしますが、他のポートはアクティブにしません。ボンディングが有効な場合に、Red Hat Enterprise Linux がすべてのポートを自動的に有効にするように設定できます。

    1. ボンディングの接続の connection.autoconnect-ports パラメーターを有効にします。

      # nmcli connection modify bond0 connection.autoconnect-ports 1
      Copy to Clipboard Toggle word wrap
    2. ブリッジを再度アクティブにします。

      # nmcli connection up bond0
      Copy to Clipboard Toggle word wrap

検証

  1. ネットワークデバイスの 1 つからネットワークケーブルを一時的に取り外し、ボンディング内の他のデバイスがトラフィックを処理しているかどうかを確認します。

    ソフトウェアユーティリティーを使用して、リンク障害イベントを適切にテストする方法がないことに注意してください。nmcli などの接続を非アクティブにするツールでは、ポート設定の変更を処理するボンディングドライバーの機能のみが表示され、実際のリンク障害イベントは表示されません。

  2. ボンドのステータスを表示します。

    # cat /proc/net/bonding/bond0
    Copy to Clipboard Toggle word wrap

3.4. RHEL Web コンソールを使用したネットワークボンディングの設定

Web ブラウザーベースのインターフェイスを使用してネットワーク設定を管理する場合は、RHEL Web コンソールを使用してネットワークボンディングを設定します。

前提条件

  • RHEL Web コンソールにログインしています。
  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。
  • イーサネットデバイスをボンディングのメンバーとして使用するために、物理または仮想イーサネットデバイスをサーバーにインストールされている。
  • ブリッジまたは VLAN デバイスをボンディングのメンバーとして使用するには、次の説明に従って事前に作成します。

手順

  1. 画面左側のナビゲーションで Networking タブを選択します。
  2. Interfaces セクションで Add bond をクリックします。
  3. 作成するボンドデバイスの名前を入力します。
  4. 結合のメンバーにするインターフェイスを選択します。
  5. 結合のモードを選択します。

    Active backup を選択すると、Web コンソールに追加フィールド Primary が表示され、ここで優先するアクティブデバイスを選択できます。

  6. リンクモニタリング監視モードを設定します。たとえば、Adaptive load balancing モードを使用する場合は、ARP に設定します。
  7. オプション: モニター間隔、リンクアップ遅延、およびリンクダウン遅延の設定を調整します。通常、トラブルシューティングの目的でのみデフォルトを変更します。

  8. Apply をクリックします。
  9. デフォルトでは、ボンドは動的 IP アドレスを使用します。静的 IP アドレスを設定する場合:

    1. Interfaces セクションでボンドの名前をクリックします。
    2. 設定するプロトコルの横にある Edit をクリックします。
    3. Addresses の横にある Manual を選択し、IP アドレス、接頭辞、およびデフォルトゲートウェイを入力します。
    4. DNS セクションで + ボタンをクリックし、DNS サーバーの IP アドレスを入力します。複数の DNS サーバーを設定するには、この手順を繰り返します。
    5. DNS search domains セクションで、+ ボタンをクリックし、検索ドメインを入力します。
    6. インターフェイスにスタティックルートが必要な場合は、Routes セクションで設定します。

    7. Apply をクリックします。

検証

  1. 画面左側のナビゲーションで Networking タブを選択し、インターフェイスに着信および発信トラフィックがあるか確認します。

  2. ネットワークデバイスの 1 つからネットワークケーブルを一時的に取り外し、ボンディング内の他のデバイスがトラフィックを処理しているかどうかを確認します。

    ソフトウェアユーティリティーを使用して、リンク障害イベントを適切にテストする方法がないことに注意してください。Web コンソールなどの接続を非アクティブ化するツールは、実際のリンク障害イベントではなく、メンバー設定の変更を処理するボンディングドライバーの機能のみを示します。

  3. ボンドのステータスを表示します。

    # cat /proc/net/bonding/bond0
    Copy to Clipboard Toggle word wrap

3.5. nmtui を使用したネットワークボンディングの設定

nmtui アプリケーションは、NetworkManager 用のテキストベースのユーザーインターフェイスを提供します。nmtui を使用して、グラフィカルインターフェイスを使用せずにホスト上でネットワークボンドを設定できます。

注記

nmtui で以下を行います。

  • カーソルキーを使用してナビゲートします。
  • ボタンを選択して Enter を押します。
  • Space を使用してチェックボックスをオンまたはオフにします。
  • 前の画面に戻るには、ESC を使用します。

前提条件

  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。
  • イーサネットデバイスをボンディングのポートとして使用するために、物理または仮想イーサネットデバイスがサーバーにインストールされている。

手順

  1. ネットワークボンドを設定するネットワークデバイス名がわからない場合は、使用可能なデバイスを表示します。

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    enp7s0     ethernet  unavailable             --
    enp8s0     ethernet  unavailable             --
    ...
    Copy to Clipboard Toggle word wrap
  2. nmtui を開始します。

    # nmtui
    Copy to Clipboard Toggle word wrap
  3. Edit a connection を選択し、Enter を押します。
  4. Add を押します。
  5. ネットワークタイプのリストから Bond を選択し、Enter を押します。
  6. オプション: 作成する NetworkManager プロファイルの名前を入力します。

    ホストに複数のプロファイルがある場合は、わかりやすい名前を付けると、プロファイルの目的を識別しやすくなります。

  7. 作成するボンドデバイス名を Device フィールドに入力します。
  8. 作成するボンドにポートを追加します。

    1. Ports リストの横にある Add を押します。
    2. ボンドにポートとして追加するインターフェイスのタイプ (例: Ethernet) を選択します。
    3. オプション: このボンドポート用に作成する NetworkManager プロファイルの名前を入力します。
    4. ポートのデバイス名を Device フィールドに入力します。
    5. OK を押して、ボンディング設定のウィンドウに戻ります。

      図3.1 イーサネットデバイスをポートとしてボンドに追加する

    6. ボンドにさらにポートを追加するには、これらの手順を繰り返します。
  9. ボンディングモードを設定します。設定した値に応じて、nmtui は、選択したモードに関連する設定の追加フィールドを表示します。
  10. 環境に応じて、IPv4 configuration および IPv6 configuration 領域に IP アドレス設定を設定します。これを行うには、これらの領域の横にあるボタンを押して、次を選択します。

    • ボンドが IP アドレスを必要としない場合は Disabled にします。
    • DHCP サーバーまたはステートレスアドレス自動設定 (SLAAC) が IP アドレスをボンディングに動的に割り当てる場合は、Automatic にします。
    • ネットワークで静的 IP アドレス設定が必要な場合は、Manual にします。この場合、さらにフィールドに入力する必要があります。

      1. 設定するプロトコルの横にある Show を押して、追加のフィールドを表示します。
      2. Addresses の横にある Add を押して、IP アドレスとサブネットマスクを Classless Inter-Domain Routing (CIDR) 形式で入力します。

        サブネットマスクを指定しない場合、NetworkManager は IPv4 アドレスに /32 サブネットマスクを設定し、IPv6 アドレスに /64 サブネットマスクを設定します。

      3. デフォルトゲートウェイのアドレスを入力します。
      4. DNS servers の横にある Add を押して、DNS サーバーのアドレスを入力します。
      5. Search domains の横にある Add を押して、DNS 検索ドメインを入力します。

    図3.2 静的 IP アドレス設定によるボンド接続例

  11. OK を押すと、新しい接続が作成され、自動的にアクティブ化されます。
  12. Back を押してメインメニューに戻ります。
  13. Quit を選択し、Enter キーを押して nmtui アプリケーションを閉じます。

検証

  1. ネットワークデバイスの 1 つからネットワークケーブルを一時的に取り外し、ボンディング内の他のデバイスがトラフィックを処理しているかどうかを確認します。

    ソフトウェアユーティリティーを使用して、リンク障害イベントを適切にテストする方法がないことに注意してください。nmcli などの接続を非アクティブにするツールでは、ポート設定の変更を処理するボンディングドライバーの機能のみが表示され、実際のリンク障害イベントは表示されません。

  2. ボンドのステータスを表示します。

    # cat /proc/net/bonding/bond0
    Copy to Clipboard Toggle word wrap

3.6. nmstatectl を使用したネットワークボンディングの設定

nmstatectl ユーティリティーを使用して、Nmstate API を介してネットワークボンディングを設定します。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

環境に応じて、YAML ファイルを適宜調整します。たとえば、ボンディングでイーサネットアダプターとは異なるデバイスを使用するには、ボンディングで使用するポートの Base-iface 属性と type 属性を調整します。

前提条件

  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。
  • イーサネットデバイスをボンディングのポートとして使用するために、物理または仮想イーサネットデバイスがサーバーにインストールされている。
  • ブリッジまたは VLAN デバイスをボンディングのポートとして使用するために、port リストにインターフェイス名を設定し、対応するインターフェイスを定義する。
  • nmstate パッケージがインストールされている。

手順

  1. 以下の内容を含む YAML ファイルを作成します (例: ~/create-bond.yml)。

    ---
    interfaces:
    - name: bond0
      type: bond
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
      link-aggregation:
        mode: active-backup
        port:
        - enp1s0
        - enp7s0
    - name: enp1s0
      type: ethernet
      state: up
    - name: enp7s0
      type: ethernet
      state: up
    
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: bond0
        metric: 300
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: bond0
        metric: 300
    
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    これらの設定では、次の設定を使用してネットワークボンディングを定義します。

    • ボンドのネットワークインターフェイス: enp1s0 および enp7s0
    • モード: active-backup
    • 静的 IPv4 アドレス: サブネットマスクが /24192.0.2.1
    • 静的 IPv6 アドレス: 2001:db8:1::1 (/64 サブネットマスクあり)
    • IPv4 デフォルトゲートウェイ: 192.0.2.254
    • IPv6 デフォルトゲートウェイ: 2001:db8:1::fffe
    • IPv4 DNS サーバー: 192.0.2.200
    • IPv6 DNS サーバー: 2001:db8:1::ffbb
    • DNS 検索ドメイン: example.com
  2. 設定をシステムに適用します。

    # nmstatectl apply ~/create-bond.yml
    Copy to Clipboard Toggle word wrap

検証

  1. デバイスおよび接続の状態を表示します。

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    bond0       bond      connected  bond0
    Copy to Clipboard Toggle word wrap
  2. 接続プロファイルのすべての設定を表示します。

    # nmcli connection show bond0
    connection.id:              bond0
    connection.uuid:            79cbc3bd-302e-4b1f-ad89-f12533b818ee
    connection.stable-id:       --
    connection.type:            bond
    connection.interface-name:  bond0
    ...
    Copy to Clipboard Toggle word wrap
  3. 接続設定を YAML 形式で表示します。

    # nmstatectl show bond0
    Copy to Clipboard Toggle word wrap

3.7. network RHEL システムロールを使用したネットワークボンディングの設定

ネットワークインターフェイスをボンディングで組み合わせると、より高いスループットまたは冗長性を備えた論理インターフェイスを提供できます。ボンディングを設定するには、NetworkManager 接続プロファイルを作成します。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

network RHEL システムロールを使用してネットワークボンディングを設定できます。ボンディングの親デバイスの接続プロファイルが存在しない場合は、このロールによって作成することもできます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Bond connection profile with two Ethernet ports
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              # Bond profile
              - name: bond0
                type: bond
                interface_name: bond0
                ip:
                  dhcp4: yes
                  auto6: yes
                bond:
                  mode: active-backup
                state: up
    
              # Port profile for the 1st Ethernet device
              - name: bond0-port1
                interface_name: enp7s0
                type: ethernet
                controller: bond0
                state: up
    
              # Port profile for the 2nd Ethernet device
              - name: bond0-port2
                interface_name: enp8s0
                type: ethernet
                controller: bond0
                state: up
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    type: <profile_type>
    作成するプロファイルのタイプを設定します。このサンプル Playbook では、3 つの接続プロファイルを作成します。1 つはボンディング用、2 つはイーサネットデバイス用です。
    dhcp4: yes
    DHCP、PPP、または同様のサービスからの自動 IPv4 アドレス割り当てを有効にします。
    auto6: yes
    IPv6 自動設定を有効にします。デフォルトでは、NetworkManager はルーター広告を使用します。ルーターが managed フラグを通知すると、NetworkManager は DHCPv6 サーバーに IPv6 アドレスと接頭辞を要求します。
    mode: <bond_mode>

    ボンディングモードを設定します。可能な値は次のとおりです。

    • balance-rr (デフォルト)
    • active-backup
    • balance-xor
    • broadcast
    • 802.3ad
    • balance-tlb
    • balance-alb

    設定したモードに応じて、Playbook で追加の変数を設定する必要があります。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • ネットワークデバイスの 1 つからネットワークケーブルを一時的に取り外し、ボンディング内の他のデバイスがトラフィックを処理しているかどうかを確認します。

    ソフトウェアユーティリティーを使用して、リンク障害イベントを適切にテストする方法がないことに注意してください。nmcli などの接続を非アクティブにするツールでは、ポート設定の変更を処理するボンディングドライバーの機能のみが表示され、実際のリンク障害イベントは表示されません。

3.8. 異なるネットワークボンディングモード

Linux ボンディングドライバーは、リンクアグリゲーションを提供します。ボンディングは、複数のネットワークインターフェイスを並行して集約して、単一の論理結合インターフェイスを提供するプロセスです。ボンディングされたインターフェイスのアクションは、モードとも呼ばれるボンディングポリシーによって異なります。さまざまなモードが、ロードバランシングサービスまたはホットスタンバイサービスのいずれかを提供します。

Linux ボンディングドライバーは、次のモードをサポートしています。

Balance-rr (モード 0)

Balance-rr は、使用可能な最初のポートから最後のポートへとパケットを順次送信するラウンドロビンアルゴリズムを使用します。このモードは、ロードバランシングとフォールトトレランスを提供します。

このモードでは、EtherChannel または同様ポートのグループ化とも呼ばれるポートアグリゲーショングループのスイッチ設定が必要です。EtherChannel は、複数の物理イーサネットリンクを 1 つの論理イーサネットリンクにグループ化するポートリンクアグリゲーションテクノロジーです。

このモードの欠点は、負荷の高いワークロードや、TCP スループットと順序付けられたパケット配信が不可欠な場合には適していないことです。

Active-backup (Mode 1)

Active-backup は、結合内でアクティブなポートが 1 つだけであることを決定するポリシーを使用します。このモードはフォールトトレランスを提供し、スイッチ設定は必要ありません。

アクティブポートに障害が発生すると、代替ポートがアクティブになります。ボンディングは、Gratuitous Address Resolution Protocol (ARP) 応答をネットワークに送信します。Gratuitous ARP は、ARP フレームの受信者に転送テーブルの更新を強制します。Active-backup モードは、Gratuitous ARP を送信して、ホストの接続を維持するための新しいパスを通知します。

primary オプションは、ボンディングインターフェイスの優先ポートを定義します。

Balance-xor (Mode 2)

Balance-xor は、選択された送信ハッシュポリシーを使用してパケットを送信します。このモードは、ロードバランシングとフォールトトレランスを提供し、Etherchannel または同様のポートグループをセットアップするためのスイッチ設定を必要とします。

パケット送信を変更して送信のバランスを取るために、このモードでは xmit_hash_policy オプションを使用します。インターフェイス上のトラフィックの送信元または宛先に応じて、インターフェイスには追加の負荷分散設定が必要です。xmit_hash_policy bonding parameter の説明を参照してください。

Broadcast (Mode 3)

Broadcast は、すべてのインターフェイスですべてのパケットを送信するポリシーを使用します。このモードは、フォールトトレランスを提供し、EtherChannel または同様のポートグループをセットアップするためのスイッチ設定を必要とします。

このモードの欠点は、負荷の高いワークロードや、TCP スループットと順序付けられたパケット配信が不可欠な場合には適していないことです。

802.3ad (Mode 4)

802.3ad は、同じ名前の IEEE 標準の動的リンクアグリゲーションポリシーを使用します。このモードはフォールトトレランスを提供します。このモードでは、Link Aggregation Control Protocol (LACP) ポートグループを設定するためのスイッチ設定が必要です。

このモードは、同じ速度とデュプレックス設定を共有するアグリゲーショングループを作成し、アクティブなアグリゲーターのすべてのポートを利用します。インターフェイス上のトラフィックの送信元または宛先に応じて、モードには追加の負荷分散設定が必要です。

デフォルトでは、発信トラフィックのポート選択は送信ハッシュポリシーに依存します。送信ハッシュポリシーの xmit_hash_policy オプションを使用して、ポートの選択を変更し、送信を分散します。

802.3adBalance-xor の違いはコンプライアンスです。802.3ad ポリシーは、ポートアグリゲーショングループ間で LACP をネゴシエートします。xmit_hash_policy bonding parameter の説明を参照してください。

Balance-tlb (Mode 5)

Balance-tlb は、送信負荷分散ポリシーを使用します。このモードは、フォールトトレランスと負荷分散を提供し、スイッチサポートを必要としないチャネルボンディングを確立します。

アクティブポートは着信トラフィックを受信します。アクティブポートに障害が発生した場合、別のポートが障害ポートの MAC アドレスを引き継ぎます。発信トラフィックを処理するインターフェイスを決定するには、次のいずれかのモードを使用します。

  • 値が 0: ハッシュ分散ポリシーを使用して、負荷分散なしでトラフィックを配分します
  • 値が 1: 負荷分散を使用してトラフィックを各ポートに配分します

    ボンディングオプション tlb_dynamic_lb=0 を使用すると、このボンディングモードは xmit_hash_policy ボンディングオプションを使用して送信を分散します。primary オプションは、ボンディングインターフェイスの優先ポートを定義します。

xmit_hash_policy bonding parameter の説明を参照してください。

Balance-alb (Mode 6)

Balance-alb は、適応負荷分散ポリシーを使用します。このモードは、フォールトトレランスとロードバランシングを提供し、特別なスイッチサポートを必要としません。

このモードには、IPv4 および IPv6 トラフィックのバランス - 送信ロードバランシング (balance-tlb) と受信ロードバランシングが含まれます。ボンディングは、ローカルシステムから送信された ARP 応答を傍受し、ボンディング内のポートの 1 つの送信元ハードウェアアドレスを上書きします。ARP ネゴシエーションは、受信負荷分散を管理します。したがって、異なるポートは、サーバーに対して異なるハードウェアアドレスを使用します。

primary オプションは、ボンディングインターフェイスの優先ポートを定義します。ボンディングオプション tlb_dynamic_lb=0 を使用すると、このボンディングモードは xmit_hash_policy ボンディングオプションを使用して送信を分散します。xmit_hash_policy bonding parameter の説明を参照してください。

さらに、NetworkManager を使用して次のモードも設定できます。

Balance-slb

ソースロードバランシング (SLB) ボンディングモードは、トラフィックのソースアドレスと VLAN ハッシュに基づいて、送信データストリームを複数のネットワークインターフェイスに分散します。このモードではスイッチの設定は必要ありません。

NetworkManager は、nftables ルールと組み合わせて balance-xor モードを使用して SLB を提供します。このモードを設定する方法の詳細は、Red Hat ナレッジベースソリューション Configuring a network bond on RHEL with source load balancing を参照してください。

3.9. xmit_hash_policy ボンディングパラメーター

xmit_hash_policy 負荷分散パラメーターは、balance-xor802.3adbalance-alb、および balance-tlb モードでのノード選択の送信ハッシュポリシーを選択します。tlb_dynamic_lb parameter is 0 の場合、モード 5 および 6 にのみ適用されます。このパラメーターで使用できる値は、layer2layer2+3layer3+4encap2+3encap3+4、および vlan+srcmac です。

詳細は、次の表を参照してください。

Expand

ポリシー層またはネットワーク層

Layer2

Layer2+3

Layer3+4

encap2+3

encap3+4

VLAN+srcmac

用途

送信元および宛先の MAC アドレスとイーサネットプロトコルタイプの XOR

送信元および宛先の MAC アドレスと IP アドレスの XOR

送信元および宛先のポートと IP アドレスの XOR

サポートされているトンネル内の送信元と宛先の MAC アドレスと IP アドレスの XOR (仮想拡張 LAN (VXLAN) など)。このモードは、skb_flow_dissect() 関数に依存してヘッダーフィールドを取得します。

サポートされているトンネル内の送信元ポートと宛先ポートおよび IP アドレスの XOR (VXLAN など)。このモードは、skb_flow_dissect() 関数に依存してヘッダーフィールドを取得します。

VLAN ID、送信元 MAC ベンダー、送信元 MAC デバイスの XOR

トラフィックの配置

基盤となる同一ネットワークインターフェイス上にある特定のネットワークピアに向かうすべてのトラフィック

基盤となる同一ネットワークインターフェイス上の特定の IP アドレスに向かうすべてのトラフィック

基盤となる同一ネットワークインターフェイス上の特定の IP アドレスとポートに向かうすべてのトラフィック

   

プライマリーの選択

このシステムと、同じブロードキャストドメイン内の他の複数システムとの間でネットワークトラフィックが発生している場合

このシステムと他の複数システム間のネットワークトラフィックがデフォルトゲートウェイを通過する場合

このシステムと別のシステムの間のネットワークトラフィックが同じ IP アドレスを使用しているが、複数のポートを通過する場合

カプセル化されたトラフィックが、ソースシステムと、複数の IP アドレスを使用する他の複数システムとの間に発生している場合

カプセル化されたトラフィックが、ソースシステムと、複数のポート番号を使用する他のシステムとの間で発生している場合

ボンディングが、ブリッジネットワークなどの外部ネットワークに MAC アドレスを直接公開する複数のコンテナーまたは仮想マシン (VM) からのネットワークトラフィックを伝送しており、モード 2 またはモード 4 のためにスイッチを設定できない場合

セカンダリーの選択

ネットワークトラフィックの大部分が、このシステムとデフォルトゲートウェイの背後にある複数の他のシステムとの間で発生する場合

ネットワークトラフィックの大部分がこのシステムと別のシステムとの間で発生する場合

    

Compliant

802.3ad

802.3ad

802.3ad 以外

   

デフォルトポリシー

設定されていない場合、これがデフォルトポリシー

非 IP トラフィックの場合、式は layer2 送信ポリシーと同じ

非 IP トラフィックの場合、式は layer2 送信ポリシーと同じ

   

第4章 VLAN タグの設定

仮想ローカルエリアネットワーク (VLAN) は、物理ネットワーク内の論理ネットワークです。VLAN インターフェイスは、インターフェイスを通過する際に VLAN ID でパケットをタグ付けし、返信パケットのタグを削除します。VLAN インターフェイスは、イーサネット、ボンディング、ブリッジデバイスなど、別のインターフェイスの上に作成します。これらのインターフェイスは parent interface と呼ばれます。

Red Hat Enterprise Linux は、VLAN デバイスを設定するためのさまざまなオプションを管理者に提供します。以下に例を示します。

  • nmcli を使用し、コマンドラインを使用して VLAN のタグ付けを設定します。
  • RHEL Web コンソールを使用し、Web ブラウザーを使用して VLAN のタグ付けを設定します。
  • nmtui を使用し、テキストベースのユーザーインターフェイスで VLAN のタグ付けを設定します。
  • nmstatectl を使用して、Nmstate API を介して接続を設定します。
  • RHEL システムロールを使用して、1 つまたは複数のホストで VLAN 設定を自動化します。

4.1. nmcli を使用した VLAN タグ付けの設定

nmcli ユーティリティーを使用して、コマンドラインで仮想ローカルエリアネットワーク (VLAN) のタグ付けを設定できます。

前提条件

  • 仮想 VLAN インターフェイスに対する親として使用するインターフェイスが VLAN タグに対応している。
  • ボンドインターフェイスに VLAN を設定する場合は、以下のようになります。

    • ボンディングのポートが起動している。
    • ボンドが、fail_over_mac=follow オプションで設定されていない。VLAN 仮想デバイスは、親の新規 MAC アドレスに一致する MAC アドレスを変更できません。このような場合、トラフィックは間違ったソースの MAC アドレスで送信されます。
    • ボンドは通常、DHCP サーバーまたは IPv6 自動設定から IP アドレスを取得することは想定されていません。ボンディングの作成時に ipv4.method=disable および ipv6.method=disable オプションを設定してこれを確認します。そうしないと、DHCP または IPv6 の自動設定がしばらくして失敗した場合に、インターフェイスがダウンする可能性があります。
  • ホストが接続するスイッチは、VLAN タグに対応するように設定されています。詳細は、スイッチのドキュメントを参照してください。

手順

  1. ネットワークインターフェイスを表示します。

    # nmcli device status
    DEVICE   TYPE      STATE         CONNECTION
    enp1s0   ethernet  disconnected  enp1s0
    bridge0  bridge    connected     bridge0
    bond0    bond      connected     bond0
    ...
    Copy to Clipboard Toggle word wrap
  2. VLAN インターフェイスを作成します。たとえば、VLAN インターフェイス vlan10 を作成し、enp1s0 を親インターフェイスとして使用し、VLAN ID 10 のタグパケットを作成するには、次のコマンドを実行します。

    # nmcli connection add type vlan con-name vlan10 ifname vlan10 vlan.parent enp1s0 vlan.id 10
    Copy to Clipboard Toggle word wrap

    VLAN は、0 から 4094 の範囲内に存在する必要があります。

  3. デフォルトでは、VLAN 接続は、親インターフェイスから最大伝送単位 (MTU) を継承します。必要に応じて、別の MTU 値を設定します。

    # nmcli connection modify vlan10 ethernet.mtu 2000
    Copy to Clipboard Toggle word wrap
  4. IPv4 を設定します。

    • 静的 IPv4 アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーを vlan10 接続に設定するには、次のように実行します。

      # nmcli connection modify vlan10 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.method manual
      Copy to Clipboard Toggle word wrap
    • DHCP を使用するために必要な操作はありません。
    • この VLAN デバイスを他のデバイスのポートとして使用する予定の場合は、何もする必要はありません。
  5. IPv6 設定を行います。

    • 静的 IPv6 アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーを vlan10 接続に設定するには、次のように実行します。

      # nmcli connection modify vlan10 ipv6.addresses '2001:db8:1::1/32' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.method manual
      Copy to Clipboard Toggle word wrap
    • ステートレスアドレス自動設定 (SLAAC) を使用する場合、アクションは必要ありません。
    • この VLAN デバイスを他のデバイスのポートとして使用する予定の場合は、何もする必要はありません。
  6. 接続をアクティベートします。

    # nmcli connection up vlan10
    Copy to Clipboard Toggle word wrap

検証

  • 設定を確認します。

    # ip -d addr show vlan10
    4: vlan10@enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 52:54:00:72:2f:6e brd ff:ff:ff:ff:ff:ff promiscuity 0
        vlan protocol 802.1Q id 10 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute vlan10
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::8dd7:9030:6f8e:89e6/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

4.2. nmcli を使用したネストされた VLAN の設定

802.1ad は、仮想ローカルエリアネットワーク (VLAN) のタグ付けに使用されるプロトコルです。これは Q-in-Q タグ付けとしても知られています。この技術を使用して、1 つのイーサネットフレーム内に複数の VLAN タグを作成すると、以下の利点が得られます。

  • VLAN 内に複数の分離ネットワークセグメントを作成することで、ネットワークのスケーラビリティーが向上します。これにより、大規模なネットワークを、より小さく管理可能なユニットに分割して整理できます。
  • さまざまな種類のネットワークトラフィックを分離および制御することで、トラフィック管理が改善されました。これにより、ネットワークパフォーマンスが向上し、ネットワークの輻輳を減らすことができます。
  • より小規模で、よりターゲットを絞ったネットワークセグメントの作成を可能にすることで、リソースを効率的に利用します。
  • ネットワークトラフィックを分離し、機密データへの不正アクセスのリスクを軽減することで、セキュリティーを強化します。

前提条件

  • 仮想 VLAN インターフェイスに対する親として使用するインターフェイスが VLAN タグに対応している。
  • ボンドインターフェイスに VLAN を設定する場合は、以下のようになります。

    • ボンディングのポートが起動している。
    • ボンドが、fail_over_mac=follow オプションで設定されていない。VLAN 仮想デバイスは、親の新規 MAC アドレスに一致する MAC アドレスを変更できません。このような場合、トラフィックは間違ったソースの MAC アドレスで送信されます。
    • ボンドは通常、DHCP サーバーまたは IPv6 自動設定から IP アドレスを取得することは想定されていません。ボンディングの作成時に ipv4.method=disable および ipv6.method=disable オプションを設定してこれを確認します。そうしないと、DHCP または IPv6 の自動設定がしばらくして失敗した場合に、インターフェイスがダウンする可能性があります。
  • ホストが接続するスイッチは、VLAN タグに対応するように設定されています。詳細は、スイッチのドキュメントを参照してください。

手順

  1. 物理ネットワークデバイスを表示します。

    # nmcli device status
    DEVICE   TYPE      STATE         CONNECTION
    enp1s0  ethernet  connected      enp1s0
    ...
    Copy to Clipboard Toggle word wrap
  2. ベース VLAN インターフェイスを作成します。たとえば、enp1s0 を親インターフェイスとして使用し、パケットに VLAN ID 10 のタグを付ける vlan10 という名前のベース VLAN インターフェイスを作成するには、次のように実行します。

    # nmcli connection add type vlan con-name vlan10 dev enp1s0 vlan.id 10
    Copy to Clipboard Toggle word wrap

    VLAN は、0 から 4094 の範囲内に存在する必要があります。

  3. デフォルトでは、VLAN 接続は、親インターフェイスから最大伝送単位 (MTU) を継承します。必要に応じて、別の MTU 値を設定します。

    # nmcli connection modify vlan10 ethernet.mtu 2000
    Copy to Clipboard Toggle word wrap
  4. ベース VLAN インターフェイスの上にネストされた VLAN インターフェイスを作成します。

    # nmcli connection add type vlan con-name vlan10.20 dev enp1s0.10 id 20 vlan.protocol 802.1ad
    Copy to Clipboard Toggle word wrap

    このコマンドは、親 VLAN 接続 vlan10 で、名前が vlan10.20 で VLAN ID が 20 の新しい VLAN 接続を作成します。dev オプションは、親ネットワークデバイスを指定します。この場合、enp1s0.10 です。vlan.protocol オプションは、VLAN カプセル化プロトコルを指定します。この場合、802.1ad (Q-in-Q) です。

  5. ネストされた VLAN インターフェイスの IPv4 設定を設定します。

    • DHCP を使用するために必要な操作はありません。
    • 静的 IPv4 アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーを vlan10.20 接続に設定するには、次のように実行します。

      # nmcli connection modify vlan10.20 ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200
      Copy to Clipboard Toggle word wrap
  6. ネストされた VLAN インターフェイスの IPv6 設定を設定します。

    • ステートレスアドレス自動設定 (SLAAC) を使用する場合、アクションは必要ありません。
    • 静的 IPv6 アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーを vlan10 接続に設定するには、次のように実行します。

      # nmcli connection modify vlan10.20 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
      Copy to Clipboard Toggle word wrap
  7. プロファイルをアクティブ化します。

    # nmcli connection up vlan10.20
    Copy to Clipboard Toggle word wrap

検証

  1. ネストされた VLAN インターフェイスの設定を確認します。

    # ip -d addr show enp1s0.10.20
    10: enp1s0.10.20@enp1s0.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 52:54:00:d2:74:3e brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 0 maxmtu 65535
        vlan protocol 802.1ad id 20 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0.10.20
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::ce3b:84c5:9ef8:d0e6/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

4.3. RHEL Web コンソールを使用した VLAN タグ付けの設定

Web ブラウザーベースのインターフェイスを使用してネットワーク設定を管理する場合は、RHEL Web コンソールを使用して VLAN タグ付けを設定します。

前提条件

  • 仮想 VLAN インターフェイスに対する親として使用するインターフェイスが VLAN タグに対応している。
  • ボンドインターフェイスに VLAN を設定する場合は、以下のようになります。

    • ボンディングのポートが起動している。
    • ボンドが、fail_over_mac=follow オプションで設定されていない。VLAN 仮想デバイスは、親の新規 MAC アドレスに一致する MAC アドレスを変更できません。このような場合、トラフィックは間違ったソースの MAC アドレスで送信されます。
    • ボンドは通常、DHCP サーバーまたは IPv6 自動設定から IP アドレスを取得することは想定されていません。結合を作成する IPv4 および IPv6 プロトコルを無効にして、これを確認します。そうしないと、DHCP または IPv6 の自動設定がしばらくして失敗した場合に、インターフェイスがダウンする可能性があります。
  • ホストが接続するスイッチは、VLAN タグに対応するように設定されています。詳細は、スイッチのドキュメントを参照してください。

手順

  1. 画面左側のナビゲーションで Networking タブを選択します。
  2. Interfaces セクションで Add VLAN をクリックします。
  3. 親デバイスを選択します。
  4. VLAN ID を入力します。
  5. VLAN デバイスの名前を入力するか、自動生成された名前のままにします。

  6. Apply をクリックします。
  7. デフォルトでは、VLAN デバイスは動的 IP アドレスを使用します。静的 IP アドレスを設定する場合:

    1. Interfaces セクションで VLAN デバイスの名前をクリックします。
    2. 設定するプロトコルの横にある Edit をクリックします。
    3. Addresses の横にある Manual を選択し、IP アドレス、接頭辞、およびデフォルトゲートウェイを入力します。
    4. DNS セクションで + ボタンをクリックし、DNS サーバーの IP アドレスを入力します。複数の DNS サーバーを設定するには、この手順を繰り返します。
    5. DNS search domains セクションで、+ ボタンをクリックし、検索ドメインを入力します。
    6. インターフェイスにスタティックルートが必要な場合は、Routes セクションで設定します。

    7. Apply をクリックします。

検証

  • 画面左側のナビゲーションで Networking タブを選択し、インターフェイスに着信および発信トラフィックがあるか確認します。

4.4. nmtui を使用した VLAN タグ付けの設定

nmtui アプリケーションは、NetworkManager 用のテキストベースのユーザーインターフェイスを提供します。nmtui を使用して、グラフィカルインターフェイスを使用せずにホスト上で VLAN タグ付けを設定できます。

注記

nmtui で以下を行います。

  • カーソルキーを使用してナビゲートします。
  • ボタンを選択して Enter を押します。
  • Space を使用してチェックボックスをオンまたはオフにします。
  • 前の画面に戻るには、ESC を使用します。

前提条件

  • 仮想 VLAN インターフェイスに対する親として使用するインターフェイスが VLAN タグに対応している。
  • ボンドインターフェイスに VLAN を設定する場合は、以下のようになります。

    • ボンディングのポートが起動している。
    • ボンドが、fail_over_mac=follow オプションで設定されていない。VLAN 仮想デバイスは、親の新規 MAC アドレスに一致する MAC アドレスを変更できません。このような場合、トラフィックは間違ったソースの MAC アドレスで送信されます。
    • ボンドは通常、DHCP サーバーまたは IPv6 自動設定から IP アドレスを取得することは想定されていません。ボンディングの作成時に ipv4.method=disable および ipv6.method=disable オプションを設定してこれを確認します。そうしないと、DHCP または IPv6 の自動設定がしばらくして失敗した場合に、インターフェイスがダウンする可能性があります。
  • ホストが接続するスイッチは、VLAN タグに対応するように設定されています。詳細は、スイッチのドキュメントを参照してください。

手順

  1. VLAN タグ付けを設定するネットワークデバイス名がわからない場合は、使用可能なデバイスを表示します。

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    enp1s0     ethernet  unavailable             --
    ...
    Copy to Clipboard Toggle word wrap
  2. nmtui を開始します。

    # nmtui
    Copy to Clipboard Toggle word wrap
  3. Edit a connection を選択し、Enter を押します。
  4. Add を押します。
  5. ネットワークタイプのリストから VLAN を選択し、Enter を押します。
  6. オプション: 作成する NetworkManager プロファイルの名前を入力します。

    ホストに複数のプロファイルがある場合は、わかりやすい名前を付けると、プロファイルの目的を識別しやすくなります。

  7. 作成する VLAN デバイス名を Device フィールドに入力します。
  8. VLAN タグ付けを設定するデバイスの名前を Parent フィールドに入力します。
  9. VLAN ID を入力します。ID は 0 から 4094 の範囲内である必要があります。
  10. 環境に応じて、IPv4 configuration および IPv6 configuration 領域に IP アドレス設定を設定します。これを行うには、これらの領域の横にあるボタンを押して、次を選択します。

    • この VLAN デバイスが IP アドレスを必要としない場合、または他のデバイスのポートとして使用する場合は、Disabled にします。
    • DHCP サーバーまたはステートレスアドレス自動設定 (SLAAC) が IP アドレスを VLAN デバイスに動的に割り当てる場合は、Automatic にします。
    • ネットワークで静的 IP アドレス設定が必要な場合は、Manual にします。この場合、さらにフィールドに入力する必要があります。

      1. 設定するプロトコルの横にある Show を押して、追加のフィールドを表示します。
      2. Addresses の横にある Add を押して、IP アドレスとサブネットマスクを Classless Inter-Domain Routing (CIDR) 形式で入力します。

        サブネットマスクを指定しない場合、NetworkManager は IPv4 アドレスに /32 サブネットマスクを設定し、IPv6 アドレスに /64 サブネットマスクを設定します。

      3. デフォルトゲートウェイのアドレスを入力します。
      4. DNS servers の横にある Add を押して、DNS サーバーのアドレスを入力します。
      5. Search domains の横にある Add を押して、DNS 検索ドメインを入力します。

    図4.1 静的 IP アドレス設定による VLAN 接続例

  11. OK を押すと、新しい接続が作成され、自動的にアクティブ化されます。
  12. Back を押してメインメニューに戻ります。
  13. Quit を選択し、Enter キーを押して nmtui アプリケーションを閉じます。

検証

  • 設定を確認します。

    # ip -d addr show vlan10
    4: vlan10@enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 52:54:00:72:2f:6e brd ff:ff:ff:ff:ff:ff promiscuity 0
        vlan protocol 802.1Q id 10 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute vlan10
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::8dd7:9030:6f8e:89e6/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

4.5. nmstatectl を使用した VLAN タグ付けの設定

nmstatectl ユーティリティーを使用して、Nmstate API を介して仮想ローカルエリアネットワーク VLAN を設定します。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

環境に応じて、YAML ファイルを適宜調整します。たとえば、VLAN でイーサネットアダプターとは異なるデバイスを使用するには、VLAN で使用するポートの Base-iface 属性と type 属性を調整します。

前提条件

  • イーサネットデバイスを VLAN のポートとして使用するために、物理または仮想イーサネットデバイスがサーバーにインストールされている。
  • nmstate パッケージがインストールされている。

手順

  1. 以下の内容を含む YAML ファイル (例: ~/create-vlan.yml) を作成します。

    ---
    interfaces:
    - name: vlan10
      type: vlan
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
      vlan:
        base-iface: enp1s0
        id: 10
    - name: enp1s0
      type: ethernet
      state: up
    
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: vlan10
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: vlan10
    
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    これらの設定では、enp1s0 デバイスを使用する ID 10 の VLAN を定義します。子デバイスの VLAN 接続の設定は以下のようになります。

    • 静的 IPv4 アドレス: 192.0.2.1 (サブネットマスクが /24)
    • 静的 IPv6 アドレス: 2001:db8:1::1 (サブネットマスクが /64)
    • IPv4 デフォルトゲートウェイ - 192.0.2.254
    • IPv6 デフォルトゲートウェイ - 2001:db8:1::fffe
    • IPv4 DNS サーバー - 192.0.2.200
    • IPv6 DNS サーバー - 2001:db8:1::ffbb
    • DNS 検索ドメイン - example.com
  2. 設定をシステムに適用します。

    # nmstatectl apply ~/create-vlan.yml
    Copy to Clipboard Toggle word wrap

検証

  1. デバイスおよび接続の状態を表示します。

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    vlan10      vlan      connected  vlan10
    Copy to Clipboard Toggle word wrap
  2. 接続プロファイルのすべての設定を表示します。

    # nmcli connection show vlan10
    connection.id:              vlan10
    connection.uuid:            1722970f-788e-4f81-bd7d-a86bf21c9df5
    connection.stable-id:       --
    connection.type:            vlan
    connection.interface-name:  vlan10
    ...
    Copy to Clipboard Toggle word wrap
  3. 接続設定を YAML 形式で表示します。

    # nmstatectl show vlan10
    Copy to Clipboard Toggle word wrap

4.6. network RHEL システムロールを使用した VLAN タグ付けの設定

ネットワークで仮想ローカルエリアネットワーク (VLAN) を使用してネットワークトラフィックを論理ネットワークに分離する場合は、NetworkManager 接続プロファイルを作成して VLAN タグ付けを設定します。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

network RHEL システムロールを使用して VLAN タグ付けを設定できます。VLAN の親デバイスの接続プロファイルが存在しない場合は、このロールによって作成することもできます。

注記

VLAN デバイスに IP アドレス、デフォルトゲートウェイ、および DNS 設定が必要な場合は、親デバイスではなく VLAN デバイスで設定してください。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: VLAN connection profile with Ethernet port
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              # Ethernet profile
              - name: enp1s0
                type: ethernet
                interface_name: enp1s0
                autoconnect: yes
                state: up
                ip:
                  dhcp4: no
                  auto6: no
    
              # VLAN profile
              - name: enp1s0.10
                type: vlan
                vlan:
                  id: 10
                ip:
                  dhcp4: yes
                  auto6: yes
                parent: enp1s0
                state: up
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    type: <profile_type>
    作成するプロファイルのタイプを設定します。このサンプル Playbook では、2 つの接続プロファイルを作成します。1 つは親イーサネットデバイス用、もう 1 つは VLAN デバイス用です。
    dhcp4: <value>
    yes に設定すると、DHCP、PPP、または同様のサービスからの自動 IPv4 アドレス割り当てが有効になります。親デバイスの IP アドレス設定を無効にします。
    auto6: <value>
    yes に設定すると、IPv6 自動設定が有効になります。この場合、デフォルトで NetworkManager がルーター広告を使用します。ルーターが managed フラグを通知すると、NetworkManager は DHCPv6 サーバーから IPv6 アドレスと接頭辞を要求します。親デバイスの IP アドレス設定を無効にします。
    parent: <parent_device>
    VLAN 接続プロファイルの親デバイスを設定します。この例では、親はイーサネットインターフェイスです。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • VLAN 設定を確認します。

    # ansible managed-node-01.example.com -m command -a 'ip -d addr show enp1s0.10'
    managed-node-01.example.com | CHANGED | rc=0 >>
    4: vlan10@enp1s0.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 52:54:00:72:2f:6e brd ff:ff:ff:ff:ff:ff promiscuity 0
        vlan protocol 802.1Q id 10 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
        ...
    Copy to Clipboard Toggle word wrap

第5章 ネットワークブリッジの設定

ネットワークブリッジは、MAC アドレスのテーブルに基づいてネットワーク間のトラフィックを転送するリンク層デバイスです。ブリッジは、ネットワークトラフィックをリッスンし、どのホストが各ネットワークに接続しているかを把握して、MAC アドレステーブルを構築します。たとえば、Red Hat Enterprise Linux ホストのソフトウェアブリッジを使用して、ハードウェアブリッジまたは仮想環境をエミュレートし、仮想マシンをホストと同じネットワークに統合できます。

ブリッジには、ブリッジが接続する必要がある各ネットワークにネットワークデバイスが必要です。ブリッジを設定する場合、ブリッジは controller と呼ばれ、ブリッジが使用するデバイスは ports と呼ばれます。

以下のように、さまざまなタイプのデバイスにブリッジを作成できます。

  • 物理および仮想イーサネットデバイス
  • ネットワークボンド
  • VLAN デバイス

Wi-Fi で効率的に使用するために、Wi-Fi で 3-address フレームの使用を指定する IEEE 802.11 規格により、Ad-Hoc モードまたは Infrastructure モードで稼働している Wi-Fi ネットワークにはブリッジを設定できません。

Red Hat Enterprise Linux は、管理者にブリッジデバイスを設定するためのさまざまなオプションを提供します。以下に例を示します。

  • nmcli を使用し、コマンドラインを使用して VLAN のタグ付けを設定します。
  • RHEL Web コンソールを使用し、Web ブラウザーを使用して VLAN のタグ付けを設定します。
  • nmtui を使用し、テキストベースのユーザーインターフェイスで VLAN のタグ付けを設定します。
  • nmstatectl を使用して、Nmstate API を介して接続を設定します。
  • RHEL システムロールを使用して、1 つまたは複数のホストで VLAN 設定を自動化します。

5.1. nmcli を使用したネットワークブリッジの設定

コマンドラインでネットワークブリッジを設定するには、nmcli ユーティリティーを使用します。

前提条件

  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。
  • イーサネットデバイスをブリッジのポートとして使用するために、物理または仮想イーサネットデバイスがサーバーにインストールされている。
  • ブリッジのポートにボンディングまたは VLAN デバイスを使用するには、ブリッジの作成時にこれらのデバイスを作成するか、次の説明に従って事前にデバイスを作成することができます。

手順

  1. ブリッジインターフェイスを作成します。

    # nmcli connection add type bridge con-name bridge0 ifname bridge0
    Copy to Clipboard Toggle word wrap

    このコマンドにより bridge0 という名前のブリッジが作成されます。

  2. ネットワークインターフェイスを表示し、ブリッジに追加するインターフェイスの名前を書き留めます。

    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp7s0  ethernet  disconnected  --
    enp8s0  ethernet  disconnected  --
    bond0   bond      connected     bond0
    bond1   bond      connected     bond1
    ...
    Copy to Clipboard Toggle word wrap

    この例では、以下のように設定されています。

    • enp7s0 および enp8s0 は設定されません。これらのデバイスをポートとして使用するには、次のステップに接続プロファイルを追加します。
    • bond0 および bond1 には既存の接続プロファイルがあります。これらのデバイスをポートとして使用するには、次の手順でプロファイルを変更します。
  3. インターフェイスをブリッジに割り当てます。

    1. ブリッジに割り当てるインターフェイスが設定されていない場合は、それらのブリッジに新しい接続プロファイルを作成します。

      # nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp7s0 controller bridge0
      # nmcli connection add type ethernet port-type bridge con-name bridge0-port2 ifname enp8s0 controller bridge0
      Copy to Clipboard Toggle word wrap

      これらのコマンドにより、enp7s0 および enp8s0 のプロファイルが作成され、それらを bridge0 接続に追加します。

    2. 既存の接続プロファイルをブリッジに割り当てるには、以下を実行します。

      1. これらの接続の master パラメーターを bridge0 に設定します。

        # nmcli connection modify bond0 master bridge0
        # nmcli connection modify bond1 master bridge0
        Copy to Clipboard Toggle word wrap

        これらのコマンドは、bond0 および bond1 という名前の既存の接続プロファイルを bridge0 接続に割り当てます。

      2. 接続を再度アクティブにします。

        # nmcli connection up bond0
        # nmcli connection up bond1
        Copy to Clipboard Toggle word wrap
  4. IPv4 を設定します。

    • 静的 IPv4 アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーを bridge0 接続に設定するには、次のように実行します。

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.dns-search 'example.com' ipv4.method manual
      Copy to Clipboard Toggle word wrap
    • DHCP を使用するために必要な操作はありません。
    • このブリッジデバイスを他のデバイスのポートとして使用する予定の場合は、特に必要な操作はありません。
  5. IPv6 設定を行います。

    • 静的 IPv6 アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーを bridge0 接続に設定するには、次のように実行します。

      # nmcli connection modify bridge0 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
      Copy to Clipboard Toggle word wrap
    • ステートレスアドレス自動設定 (SLAAC) を使用する場合、アクションは必要ありません。
    • このブリッジデバイスを他のデバイスのポートとして使用する予定の場合は、特に必要な操作はありません。
  6. 必要に応じて、ブリッジのその他のプロパティーを設定します。たとえば、bridge0 の STP (Spanning Tree Protocol) の優先度を 16384 に設定するには、次のコマンドを実行します。

    # nmcli connection modify bridge0 bridge.priority '16384'
    Copy to Clipboard Toggle word wrap

    デフォルトでは STP が有効になっています。

  7. 接続をアクティベートします。

    # nmcli connection up bridge0
    Copy to Clipboard Toggle word wrap
  8. ポートが接続されており、CONNECTION コラムがポートの接続名を表示していることを確認します。

    # nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    enp7s0   ethernet  connected  bridge0-port1
    enp8s0   ethernet  connected  bridge0-port2
    Copy to Clipboard Toggle word wrap

    接続のいずれかのポートをアクティブにすると、NetworkManager はブリッジもアクティブにしますが、他のポートはアクティブにしません。ブリッジが有効な場合には、Red Hat Enterprise Linux がすべてのポートを自動的に有効にするように設定できます。

    1. ブリッジ接続の connection.autoconnect-ports パラメーターを有効にします。

      # nmcli connection modify bridge0 connection.autoconnect-ports 1
      Copy to Clipboard Toggle word wrap
    2. ブリッジを再度アクティブにします。

      # nmcli connection up bridge0
      Copy to Clipboard Toggle word wrap

検証

  • ip ユーティリティーを使用して、特定のブリッジのポートであるイーサネットデバイスのリンクステータスを表示します。

    # ip link show master bridge0
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:9e:f1:ce brd ff:ff:ff:ff:ff:ff
    Copy to Clipboard Toggle word wrap
  • bridge ユーティリティーを使用して、任意のブリッジデバイスのポートであるイーサネットデバイスの状態を表示します。

    # bridge link show
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100
    5: enp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge1 state forwarding priority 32 cost 100
    6: enp11s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge1 state blocking priority 32 cost 100
    ...
    Copy to Clipboard Toggle word wrap

    特定のイーサネットデバイスのステータスを表示するには、bridge link show dev <ethernet_device_name> コマンドを使用します。

5.2. RHEL Web コンソールを使用したネットワークブリッジの設定

Web ブラウザーベースのインターフェイスを使用してネットワーク設定を管理する場合は、RHEL Web コンソールを使用してネットワークブリッジを設定します。

前提条件

  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。
  • イーサネットデバイスをブリッジのポートとして使用するために、物理または仮想イーサネットデバイスがサーバーにインストールされている。
  • ブリッジのポートにボンディングまたは VLAN デバイスを使用するには、ブリッジの作成時にこれらのデバイスを作成するか、次の説明に従って事前にデバイスを作成することができます。

手順

  1. 画面左側のナビゲーションで Networking タブを選択します。
  2. Interfaces セクションで Add bridge をクリックします。
  3. 作成するブリッジデバイスの名前を入力します。
  4. ブリッジのポートにするインターフェイスを選択します。
  5. オプション: Spanning tree protocol (STP) 機能を有効にして、ブリッジループとブロードキャストの過剰拡散を回避します。

  6. Apply をクリックします。
  7. デフォルトでは、ブリッジは動的 IP アドレスを使用します。静的 IP アドレスを設定する場合:

    1. Interfaces セクションでブリッジの名前をクリックします。
    2. 設定するプロトコルの横にある Edit をクリックします。
    3. Addresses の横にある Manual を選択し、IP アドレス、接頭辞、およびデフォルトゲートウェイを入力します。
    4. DNS セクションで + ボタンをクリックし、DNS サーバーの IP アドレスを入力します。複数の DNS サーバーを設定するには、この手順を繰り返します。
    5. DNS search domains セクションで、+ ボタンをクリックし、検索ドメインを入力します。
    6. インターフェイスにスタティックルートが必要な場合は、Routes セクションで設定します。

    7. Apply をクリックします。

検証

  1. 画面左側のナビゲーションで Networking タブを選択し、インターフェイスに着信および発信トラフィックがあるか確認します。

5.3. nmtui を使用したネットワークブリッジの設定

nmtui アプリケーションは、NetworkManager 用のテキストベースのユーザーインターフェイスを提供します。nmtui を使用して、グラフィカルインターフェイスを使用せずにホスト上でネットワークブリッジを設定できます。

注記

nmtui で以下を行います。

  • カーソルキーを使用してナビゲートします。
  • ボタンを選択して Enter を押します。
  • Space を使用してチェックボックスをオンまたはオフにします。
  • 前の画面に戻るには、ESC を使用します。

前提条件

  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。
  • イーサネットデバイスをブリッジのポートとして使用するために、物理または仮想イーサネットデバイスがサーバーにインストールされている。

手順

  1. ネットワークブリッジを設定するネットワークデバイス名がわからない場合は、使用可能なデバイスを表示します。

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    enp7s0     ethernet  unavailable             --
    enp8s0     ethernet  unavailable             --
    ...
    Copy to Clipboard Toggle word wrap
  2. nmtui を開始します。

    # nmtui
    Copy to Clipboard Toggle word wrap
  3. Edit a connection を選択し、Enter を押します。
  4. Add を押します。
  5. ネットワークタイプのリストから Bridge を選択し、Enter を押します。
  6. オプション: 作成する NetworkManager プロファイルの名前を入力します。

    ホストに複数のプロファイルがある場合は、わかりやすい名前を付けると、プロファイルの目的を識別しやすくなります。

  7. 作成するブリッジデバイス名を Device フィールドに入力します。
  8. 作成するブリッジにポートを追加します。

    1. Ports リストの横にある Add を押します。
    2. ブリッジにポートとして追加するインターフェイスのタイプ (例: Ethernet) を選択します。
    3. オプション: このブリッジポート用に作成する NetworkManager プロファイルの名前を入力します。
    4. ポートのデバイス名を Device フィールドに入力します。
    5. OK を押して、ブリッジ設定のウィンドウに戻ります。

      図5.1 イーサネットデバイスをポートとしてブリッジに追加する

    6. ブリッジにさらにポートを追加するには、これらの手順を繰り返します。
  9. 環境に応じて、IPv4 configuration および IPv6 configuration 領域に IP アドレス設定を設定します。これを行うには、これらの領域の横にあるボタンを押して、次を選択します。

    • ブリッジが IP アドレスを必要としない場合は Disabled にします。
    • DHCP サーバーまたはステートレスアドレス自動設定 (SLAAC) が IP アドレスをブリッジに動的に割り当てる場合は、Automatic にします。
    • ネットワークで静的 IP アドレス設定が必要な場合は、Manual にします。この場合、さらにフィールドに入力する必要があります。

      1. 設定するプロトコルの横にある Show を押して、追加のフィールドを表示します。
      2. Addresses の横にある Add を押して、IP アドレスとサブネットマスクを Classless Inter-Domain Routing (CIDR) 形式で入力します。

        サブネットマスクを指定しない場合、NetworkManager は IPv4 アドレスに /32 サブネットマスクを設定し、IPv6 アドレスに /64 サブネットマスクを設定します。

      3. デフォルトゲートウェイのアドレスを入力します。
      4. DNS servers の横にある Add を押して、DNS サーバーのアドレスを入力します。
      5. Search domains の横にある Add を押して、DNS 検索ドメインを入力します。

    図5.2 IP アドレス設定なしのブリッジ接続例

  10. OK を押すと、新しい接続が作成され、自動的にアクティブ化されます。
  11. Back を押してメインメニューに戻ります。
  12. Quit を選択し、Enter キーを押して nmtui アプリケーションを閉じます。

検証

  1. ip ユーティリティーを使用して、特定のブリッジのポートであるイーサネットデバイスのリンクステータスを表示します。

    # ip link show master bridge0
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:9e:f1:ce brd ff:ff:ff:ff:ff:ff
    Copy to Clipboard Toggle word wrap
  2. bridge ユーティリティーを使用して、任意のブリッジデバイスのポートであるイーサネットデバイスの状態を表示します。

    # bridge link show
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100
    ...
    Copy to Clipboard Toggle word wrap

    特定のイーサネットデバイスのステータスを表示するには、bridge link show dev <ethernet_device_name> コマンドを使用します。

5.4. nmstatectl を使用したネットワークブリッジの設定

nmstatectl ユーティリティーを使用して、Nmstate API を介してネットワークブリッジを設定します。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

環境に応じて、YAML ファイルを適宜調整します。たとえば、ブリッジでイーサネットアダプターとは異なるデバイスを使用するには、ブリッジで使用するポートの Base-iface 属性と type 属性を調整します。

前提条件

  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。
  • イーサネットデバイスをブリッジのポートとして使用するために、物理または仮想イーサネットデバイスがサーバーにインストールされている。
  • ブリッジのポートとしてボンディングまたは VLAN デバイスを使用するために、port リストにインターフェイス名を設定し、対応するインターフェイスを定義する。
  • nmstate パッケージがインストールされている。

手順

  1. 以下の内容を含む YAML ファイル (例: ~/create-bridge.yml) を作成します。

    ---
    interfaces:
    - name: bridge0
      type: linux-bridge
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
      bridge:
        options:
          stp:
            enabled: true
        port:
          - name: enp1s0
          - name: enp7s0
    - name: enp1s0
      type: ethernet
      state: up
    - name: enp7s0
      type: ethernet
      state: up
    
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: bridge0
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: bridge0
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    これらの設定では、次の設定でネットワークブリッジを定義します。

    • ブリッジのネットワークインターフェイス: enp1s0 および enp7s0
    • スパニングツリープロトコル (STP): 有効化
    • 静的 IPv4 アドレス: 192.0.2.1 (サブネットマスクが /24)
    • 静的 IPv6 アドレス: 2001:db8:1::1 (サブネットマスクが /64)
    • IPv4 デフォルトゲートウェイ: 192.0.2.254
    • IPv6 デフォルトゲートウェイ: 2001:db8:1::fffe
    • IPv4 DNS サーバー: 192.0.2.200
    • IPv6 DNS サーバー: 2001:db8:1::ffbb
    • DNS 検索ドメイン: example.com
  2. 設定をシステムに適用します。

    # nmstatectl apply ~/create-bridge.yml
    Copy to Clipboard Toggle word wrap

検証

  1. デバイスおよび接続の状態を表示します。

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    bridge0     bridge    connected  bridge0
    Copy to Clipboard Toggle word wrap
  2. 接続プロファイルのすべての設定を表示します。

    # nmcli connection show bridge0
    connection.id:              bridge0_
    connection.uuid:            e2cc9206-75a2-4622-89cf-1252926060a9
    connection.stable-id:       --
    connection.type:            bridge
    connection.interface-name:  bridge0
    ...
    Copy to Clipboard Toggle word wrap
  3. 接続設定を YAML 形式で表示します。

    # nmstatectl show bridge0
    Copy to Clipboard Toggle word wrap

5.5. network RHEL システムロールを使用したネットワークブリッジの設定

ネットワークブリッジを作成することにより、Open Systems Interconnection (OSI) モデルのレイヤー 2 で複数のネットワークを接続できます。ブリッジを設定するには、NetworkManager で接続プロファイルを作成します。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

network RHEL システムロールを使用してブリッジを設定できます。ブリッジの親デバイスの接続プロファイルが存在しない場合は、このロールによって作成することもできます。

注記

IP アドレス、ゲートウェイ、DNS 設定をブリッジに割り当てる場合は、ポートではなくブリッジで設定してください。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Bridge connection profile with two Ethernet ports
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              # Bridge profile
              - name: bridge0
                type: bridge
                interface_name: bridge0
                ip:
                  dhcp4: yes
                  auto6: yes
                state: up
    
              # Port profile for the 1st Ethernet device
              - name: bridge0-port1
                interface_name: enp7s0
                type: ethernet
                controller: bridge0
                port_type: bridge
                state: up
    
              # Port profile for the 2nd Ethernet device
              - name: bridge0-port2
                interface_name: enp8s0
                type: ethernet
                controller: bridge0
                port_type: bridge
                state: up
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    type: <profile_type>
    作成するプロファイルのタイプを設定します。このサンプル Playbook では、3 つの接続プロファイルを作成します。1 つはブリッジ用、2 つはイーサネットデバイス用です。
    dhcp4: yes
    DHCP、PPP、または同様のサービスからの自動 IPv4 アドレス割り当てを有効にします。
    auto6: yes
    IPv6 自動設定を有効にします。デフォルトでは、NetworkManager はルーター広告を使用します。ルーターが managed フラグを通知すると、NetworkManager は DHCPv6 サーバーに IPv6 アドレスと接頭辞を要求します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  1. 特定のブリッジのポートであるイーサネットデバイスのリンクステータスを表示します。

    # ansible managed-node-01.example.com -m command -a 'ip link show master bridge0'
    managed-node-01.example.com | CHANGED | rc=0 >>
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:9e:f1:ce brd ff:ff:ff:ff:ff:ff
    Copy to Clipboard Toggle word wrap
  2. ブリッジデバイスのポートであるイーサネットデバイスのステータスを表示します。

    # ansible managed-node-01.example.com -m command -a 'bridge link show'
    managed-node-01.example.com | CHANGED | rc=0 >>
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100
    Copy to Clipboard Toggle word wrap

第6章 IPsec VPN のセットアップ

Libreswan は、Internet Protocol Security (IPsec) プロトコルスイートの実装です。Libreswan を使用すると、インターネットなどの信頼できないネットワーク上にセキュアで暗号化されたトンネルを確立する仮想プライベートネットワーク (VPN) を設定できます。このようなトンネルにより、転送中のデータの機密性と整合性が確保されます。一般的なユースケースとしては、支社を本社に接続したり、リモートユーザーに企業ネットワークへのセキュアなアクセスを提供したりすることが挙げられます。

RHEL では、次のようにさまざまな方法で Libreswan を設定できます。

  • Libreswan 設定ファイルを手動で編集して、高度なオプションを細かく制御する
  • vpn RHEL システムロールを使用して、Libreswan VPN 設定の作成プロセスを自動化する。
  • Nmstate を使用して、宣言型 API を通じて Libreswan 接続を設定する。

Libreswan では、"クライアント" や "サーバー" などの用語は使用しません。代わりに、IPsec ではエンドポイントを "left (左)" と "right (右)" で表します。Libreswan がどちらの役割を担うかを動的に決定するため、この設計により、多くの場合、両方のホストで同じ設定を使用できるようになります。慣例として、管理者は通常、ローカルホストの場合は "left"、リモートホストの場合は "right" を使用します。

注記

Libreswan は、RHEL でサポートされている唯一の VPN テクノロジーです。

IPsec は、Internet Key Exchange (IKE) などの標準化されたプロトコルを利用して、さまざまなシステム間の効率的な通信を実現します。ただし、実際には、ベンダーがこれらの標準を実装する方法がわずかに違うため、互換性の問題が発生する可能性があります。Libreswan をサードパーティーの IPsec ピアに接続する際に、このような相互運用性の問題が発生した場合は、Red Hat サポート にお問い合わせください。

6.1. IPsec VPN のコンポーネント

IPsec VPN のセットアップには、次の主なコンポーネントが関係します。

  • Internet Key Exchange (IKE): 2 つのエンドポイントが、このプロトコルを使用して相互に認証し、使用する暗号化アルゴリズムを含む接続のルールをネゴシエートします。Libreswan は、pluto と呼ばれるデーモンで IKE プロトコルを実装します。
  • IPsec: IKE ネゴシエーション中に合意されたポリシーに従って、実際にデータを暗号化して転送するプロトコルの部分。Linux カーネルは IPsec プロトコルスイートを実装しています。

6.2. Libreswan の認証方法

Libreswan は次の認証方法をサポートしています。

事前共有鍵
事前共有鍵 (PSK) 方式では、両方のエンドポイントが同じシークレットを使用して相互に認証します。PSK はシンプルさと幅広い互換性を備えているため、小規模なデプロイメントに適しています。ただし、鍵が再利用される場合や、頻繁にローテーションされない場合、PSK の管理は危険です。セキュリティー上、PSK は 64 文字を超えるランダムな文字で構成されている必要があり、ホストが FIPS モードで動作している場合は FIPS の強度要件を満たしている必要があります。
raw RSA 鍵
この方法では、相互識別のために各ピアで RSA 公開鍵と秘密鍵のペアを使用します。raw RSA 鍵は PSK よりも強力なセキュリティーを提供し、完全な証明書インフラストラクチャーが不要な環境に最適です。
X.509 証明書
この方法では、信頼済み認証局 (CA) によって発行された X.509 証明書が使用されます。各ピアが証明書と秘密鍵を使用して自身のアイデンティティーを証明し、相手がそれを信頼できる CA に対して検証します。この方法は、エンタープライズ向けの最高レベルのセキュリティーとスケーラビリティーを提供します。ただし、公開鍵基盤 (PKI) の導入と維持が必要となるため、より複雑です。
NULL 認証
この方法では、ピア間の認証を行わずに暗号化のみを行います。NULL 認証はリモートエンドポイントのアイデンティティーを検証しないため、セキュアではなく、中間者攻撃に対する保護を提供しません。
量子コンピューターに対する保護
Libreswan はスタンドアロンの認証方法ではありませんが、将来の量子コンピューターによる攻撃から最新の IKEv2 接続を保護するために、Post-quantum Pre-shared Keys (PPK) を提供します。この機能が必要なのは、古い IKEv1 プロトコルも標準 IKEv2 も、それ自体では量子攻撃に対する耐性がないためです。PPK は、主要な認証方法の上にもう 1 つのセキュリティーレイヤーを追加するものです。そのセキュリティーは、外部の通信チャネルを通じてセキュアに配布された暗号的に強力な鍵の使用に依存します。

6.3. raw RSA 鍵認証を使用した IPsec ホスト間 VPN の手動設定

ホスト間 VPN は、2 つのデバイス間に直接的でセキュアな暗号化された接続を確立し、アプリケーションがインターネットなどのセキュアでないネットワーク経由でセキュアに通信できるようにします。

認証に関しては、RSA 鍵は事前共有鍵 (PSK) よりもセキュアです。非対称暗号化によって秘密情報共有のリスクが排除されるためです。また、RSA 鍵を使用すると、強力なピアツーピア認証を提供しつつも、認証局 (CA) が不要になるため、デプロイが容易になります。

両方のホストで次の手順を実行してください。

手順

  1. Libreswan がまだインストールされていない場合は、次の手順を実行します。

    1. libreswan パッケージをインストールします。

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. ネットワークセキュリティーサービス (NSS) データベースを初期化します。

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      このコマンドにより、/var/lib/ipsec/nss/ ディレクトリーにデータベースが作成されます。

    3. ipsec サービスを有効にして起動します。

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. ファイアウォールで IPsec ポートとプロトコルを開きます。

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. RSA 鍵ペアを作成します。

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec ユーティリティーにより、鍵ペアが NSS データベースに保存されます。

  3. ピアを指定します。IPsec トンネルでは、一方のホストを left に、もう一方のホストを right に指定する必要があります。これは任意に選択できます。一般的には、ローカルホストを left、リモートホストを right と呼びます。
  4. left と right 両方のピアの Certificate Key Attribute ID (CKAID) を表示します。

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    以降のステップで、両方のピアの CKAID が必要になります。

  5. 公開鍵を表示します。

    1. left ピアで次のように入力します。

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
      	# rsakey AwEAAdKCx
      	leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. right ピアで次のように入力します。

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
      	# rsakey AwEAAcNWC
      	rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    これらのコマンドにより、設定ファイルで使用する必要がある対応するパラメーターとともに、公開鍵が表示されます。

  6. /etc/ipsec.d/ ディレクトリーに接続用の .conf ファイルを作成します。たとえば、次の設定で /etc/ipsec.d/host-to-host.conf ファイルを作成します。

    conn <connection_name>
        # General setup and authentication type
        auto=start
        authby=rsasig
    
        # Peer A
        left=<ip_address_or_fqdn_of_left_peer>
        leftid=@peer_a
        leftrsasigkey=<public_key_of_left_peer>
    
        # Peer B
        right=<ip_address_or_fqdn_of_right_peer>
        rightid=@peer_b
        rightrsasigkey=<public_key_of_right_peer>
    Copy to Clipboard Toggle word wrap
    注記

    両方のホストで同じ設定ファイルを使用できます。Libreswan は内部情報を使用して、自身が left ホストで動作しているか、right ホストで動作しているかを識別します。ただし、left* パラメーターのすべての値が一方のピアに属し、right* パラメーターの値がもう一方のピアに属することが重要です。

    この例で指定されている設定は次のとおりです。

    conn <connection_name>
    接続名を定義します。名前は任意であり、Libreswan はこれを使用して接続を識別します。この接続のパラメーターは、少なくとも 1 つのスペースまたはタブでインデントする必要があります。
    auto=<type>
    接続の開始方法を制御します。値を start に設定すると、Libreswan はサービスの起動時に自動的に接続をアクティブ化します。
    authby=rsasig
    この接続に対して RSA 署名認証を有効にします。
    left=<ip_address_or_fqdn_of_left_peer> および right=<ip_address_or_fqdn_of_right_peer>
    ピアの IP アドレスまたは DNS 名を定義します。
    leftid=<id> および rightid=<id>
    Internet Key Exchange (IKE) ネゴシエーションプロセス中に各ピアを識別する方法を定義します。これには、完全修飾ドメイン名 (FQDN)、IP アドレス、またはリテラル文字列を使用できます。後者の場合、文字列の前に @ 記号を付けます。
    leftrsasigkey=<public_key> および rightrsasigkey=<public_key>
    ピアの公開鍵を指定します。前のステップで ipsec showhostkey コマンドによって表示された値を使用します。
  7. ipsec サービスを再起動します。

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

    設定ファイルで auto=start を使用すると、接続が自動的にアクティブになります。他の方法の場合、接続をアクティブ化するために追加の手順が必要です。詳細は、システム上の ipsec.conf(5) man ページを参照してください。

検証

  • IPsec ステータスを表示します。

    # ipsec status
    Copy to Clipboard Toggle word wrap

    接続が正常に確立されていれば、出力に次の行が含まれています。

    • Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。

      000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
      Copy to Clipboard Toggle word wrap

      これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。

    • 子 SA が確立されています。

      000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      これは、データトラフィックが通過する実際のトンネルです。

次のステップ

6.4. raw RSA 鍵認証を使用した IPsec サイト間 VPN の手動設定

サイト間 VPN は、2 つの異なるネットワーク間にセキュアな暗号化トンネルを確立し、インターネットなどのセキュアでないパブリックネットワークを介してそれらをシームレスにリンクします。たとえば、これにより、支社のデバイスがすべて同じローカルネットワークの一部であるかのように、企業本社のリソースにアクセスできるようになります。

ゲートウェイデバイスの認証に関しては、RSA 鍵は事前共有鍵 (PSK) よりもセキュアです。非対称暗号化によって秘密情報共有のリスクが排除されるためです。また、RSA 鍵を使用すると、強力なピアツーピア認証を提供しつつも、認証局 (CA) が不要になるため、デプロイが容易になります。

両方のゲートウェイデバイスで次の手順を実行してください。

前提条件

  • 両方のネットワークのルートにより、リモートネットワークへのトラフィックがローカル VPN ゲートウェイデバイスを介して送信されるようになっている。

手順

  1. Libreswan がまだインストールされていない場合は、次の手順を実行します。

    1. libreswan パッケージをインストールします。

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. ネットワークセキュリティーサービス (NSS) データベースを初期化します。

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      このコマンドにより、/var/lib/ipsec/nss/ ディレクトリーにデータベースが作成されます。

    3. ipsec サービスを有効にして起動します。

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. ファイアウォールで IPsec ポートとプロトコルを開きます。

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. RSA 鍵ペアを作成します。

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec ユーティリティーにより、鍵ペアが NSS データベースに保存されます。

  3. ピアを指定します。IPsec トンネルでは、一方のホストを left に、もう一方のホストを right に指定する必要があります。これは任意に選択できます。一般的には、ローカルホストを left、リモートホストを right と呼びます。
  4. left と right 両方のピアの Certificate Key Attribute ID (CKAID) を表示します。

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    以降のステップで、両方のピアの CKAID が必要になります。

  5. 公開鍵を表示します。

    1. left ピアで次のように入力します。

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
      	# rsakey AwEAAdKCx
      	leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. right ピアで次のように入力します。

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
      	# rsakey AwEAAcNWC
      	rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    これらのコマンドにより、設定ファイルで使用する必要がある対応するパラメーターとともに、公開鍵が表示されます。

  6. /etc/ipsec.d/ ディレクトリーに接続用の .conf ファイルを作成します。たとえば、次の設定で /etc/ipsec.d/site-to-site.conf ファイルを作成します。

    conn <connection_name>
        # General setup and authentication type
        auto=start
        authby=rsasig
    
        # Site A
        left=<ip_address_or_fqdn_of_left_peer>
        leftid=@site_a
        leftrsasigkey=<public_key_of_left_peer>
        leftsubnet=192.0.2.0/24
    
        # Site B
        right=<ip_address_or_fqdn_of_right_peer>
        rightid=@site_b
        rightrsasigkey=<public_key_of_right_peer>
        rightsubnet={198.51.100.0/24, 203.0.113.0/24}
    Copy to Clipboard Toggle word wrap
    注記

    両方のゲートウェイデバイスで同じ設定ファイルを使用できます。Libreswan は内部情報を使用して、自身が left ホストで動作しているか、right ホストで動作しているかを識別します。ただし、left* パラメーターのすべての値が一方のピアに属し、right* パラメーターの値がもう一方のピアに属することが重要です。

    この例で指定されている設定は次のとおりです。

    conn <connection_name>
    接続名を定義します。名前は任意であり、Libreswan はこれを使用して接続を識別します。この接続のパラメーターは、少なくとも 1 つのスペースまたはタブでインデントする必要があります。
    auto=<type>
    接続の開始方法を制御します。値を start に設定すると、Libreswan はサービスの起動時に自動的に接続をアクティブ化します。
    authby=rsasig
    この接続に対して RSA 署名認証を有効にします。
    left=<ip_address_or_fqdn_of_left_peer> および right=<ip_address_or_fqdn_of_right_peer>
    ピアの IP アドレスまたは DNS 名を定義します。
    leftid=<id> および rightid=<id>
    Internet Key Exchange (IKE) ネゴシエーションプロセス中に各ピアを識別する方法を定義します。これには、完全修飾ドメイン名 (FQDN)、IP アドレス、またはリテラル文字列を使用できます。後者の場合、文字列の前に @ 記号を付けます。
    leftrsasigkey=<public_key> および rightrsasigkey=<public_key>
    ピアの公開鍵を指定します。前のステップで ipsec showhostkey コマンドによって表示された値を使用します。
    leftsubnet=<subnet> および rightsubnet=<subnet>
    トンネルを介して接続されるサブネットを Classless Inter-Domain Routing (CIDR) 形式で定義します。片側で複数のサブネットをトンネリングする場合は、それらを中括弧で囲み、コンマで区切って指定します。
  7. パケット転送を有効にします。

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    Copy to Clipboard Toggle word wrap
  8. ipsec サービスを再起動します。

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

    設定ファイルで auto=start を使用すると、接続が自動的にアクティブになります。他の方法の場合、接続をアクティブ化するために追加の手順が必要です。詳細は、システム上の ipsec.conf(5) man ページを参照してください。

検証

  1. IPsec ステータスを表示します。

    # ipsec status
    Copy to Clipboard Toggle word wrap

    接続が正常に確立されていれば、出力に次の行が含まれています。

    • Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。

      #2: "<connection_name>":500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 28523s; REPLACE in 28793s; newest; idle;
      Copy to Clipboard Toggle word wrap

      これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。

    • 子 SA が確立されています。

      #3: "<connection_name>":500 ESTABLISHED_CHILD_SA (established Child SA); REKEY in 28523s; REPLACE in 28793s; newest; eroute owner; IKE SA #2; idle;
      Copy to Clipboard Toggle word wrap

      これは、データトラフィックが通過する実際のトンネルです。

  2. ローカルサブネット内のクライアントから、リモートサブネット内のクライアントに ping を実行します。

次のステップ

6.5. 証明書ベースの認証を使用した IPsec ホスト/サイト間 VPN の手動設定

ホスト/サイト間 VPN は、個々のリモートコンピューターとプライベートネットワークの間にセキュアで暗号化された接続を確立し、インターネットなどのセキュアでないパブリックネットワークを介してそれらをシームレスにリンクできるようにします。これは、物理的にオフィスにいるかのように、自分のコンピューターから会社の内部ネットワーク上のリソースにアクセスする必要があるリモート従業員に最適です。

認証のために、認証局 (CA) によって管理されるデジタル証明書を使用すると、非常にセキュアでスケーラブルなソリューションが実現します。接続元ホストとゲートウェイが、それぞれ信頼できる CA によって署名された証明書を提示します。この方法により、強力で検証可能な認証が実現し、ユーザー管理が簡素化されます。アクセス権の付与または失効は、CA で一元的に行うことができます。Libreswan は、各証明書を証明書失効リスト (CRL) と照合し、証明書がリストに掲載されていればアクセスを拒否することで、付与や失効を強制します。

6.5.1. IPsec ゲートウェイの手動設定

セキュアなリモートアクセスを可能にするには、Libreswan IPsec ゲートウェイを適切に設定する必要があります。Libreswan は、ネットワークセキュリティーサービス (NSS) データベースからサーバー証明書、秘密鍵、および CA 証明書を読み取ります。

次の例では、認証されたクライアントが内部 192.0.2.0/24 サブネットにアクセスすることを許可し、仮想 IP プールから各クライアントに IP アドレスを動的に割り当てます。セキュリティーを維持するために、ゲートウェイはクライアント証明書が同じ信頼できる CA によって発行されていることを確認し、失効した証明書へのアクセスが拒否されるように、証明書失効リスト (CRL) を自動的に使用します。

前提条件

  • ゲートウェイに、次の内容を含む公開鍵暗号化標準 #12 (PKCS #12) ファイル ~/file.p12 が存在する。

    • サーバーの秘密鍵
    • サーバー証明書
    • CA 証明書
    • 中間証明書 (必要な場合)

    秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。

  • サーバー証明書には次のフィールドを含めます。

    • Extended Key Usage (EKU) を TLS Web Server Authentication に設定します。
    • コモンネーム (CN) またはサブジェクト代替名 (SAN) を、ゲートウェイの完全修飾ドメイン名 (FQDN) に設定します。
    • X509v3 CRL 配布ポイントに、証明書失効リスト (CRL) への URL を含めます。
  • VPN クライアントトラフィックの戻りのルートが、VPN ゲートウェイを指すように内部ネットワーク上に設定されている。

手順

  1. Libreswan がまだインストールされていない場合は、以下を実行します。

    1. libreswan パッケージをインストールします。

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. ネットワークセキュリティーサービス (NSS) データベースを初期化します。

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      このコマンドにより、/var/lib/ipsec/nss/ ディレクトリーにデータベースが作成されます。

    3. ipsec サービスを有効にして起動します。

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. ファイアウォールで IPsec ポートとプロトコルを開きます。

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. PKCS #12 ファイルを NSS データベースにインポートします。

    # ipsec import ~/file.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. サーバーと CA 証明書のニックネームを表示します。

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    vpn-gateway              u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    この情報は設定ファイルに必要です。

  4. /etc/ipsec.d/ ディレクトリーに接続用の .conf ファイルを作成します。たとえば、次の設定で /etc/ipsec.d/host-to-site.conf ファイルを作成します。

    1. CRL チェックを有効にするために、config setup セクションを追加します。

      config setup
          crl-strict=yes
          crlcheckinterval=1h
      Copy to Clipboard Toggle word wrap

      この例で指定されている設定は次のとおりです。

      crl-strict=yes
      CRL チェックを有効にします。NSS データベース内で CRL が利用できない場合、認証中のクライアントが拒否されます。
      crlcheckinterval=1h
      指定期間後に、サーバーの証明書に指定された URL から CRL を再取得します。
    2. ゲートウェイのセクションを追加します。

      conn <connection_name>
          # General setup and authentication type
          auto=start
          ikev2=insist
          authby=rsasig
      
          # VPN gateway settings
          left=%defaultroute
          leftid=%fromcert
          leftcert="<server_certificate_nickname>"
          leftrsasigkey=%cert
          leftsendcert=always
          leftsubnet=192.0.2.0/24
          rekey=no
          mobike=yes
          narrowing=yes
      
          # Client-related settings
          right=%any
          rightid=%fromcert
          rightrsasigkey=%cert
          rightaddresspool=198.51.100.129-198.51.100.254
          rightmodecfgclient=yes
          modecfgclient=yes
          modecfgdns=192.0.2.5
          modecfgdomains="example.com"
      
          # Dead Peer Detection
          dpddelay=30
          dpdtimeout=120
          dpdaction=clear
      Copy to Clipboard Toggle word wrap

      この例で指定されている設定は次のとおりです。

      ikev2=insist
      最新の IKEv2 プロトコルを、IKEv1 へのフォールバックなしで、唯一許可されるプロトコルとして定義します。
      left=%defaultroute
      ipsec サービスの起動時に、デフォルトルートインターフェイスの IP アドレスを動的に設定します。left パラメーターは、ホストの IP アドレスまたは FQDN に設定することもできます。
      leftid=%fromcert および rightid=%fromcert
      証明書の識別名 (DN) フィールドからアイデンティティーを取得するように Libreswan を設定します。
      leftcert="<server_certificate_nickname>"
      NSS データベースで使用されるサーバーの証明書のニックネームを設定します。
      leftrsasigkey=%cert および rightrsasigkey=%cert
      証明書に埋め込まれた RSA 公開鍵を使用するように Libreswan を設定します。
      leftsendcert=always
      クライアントが CA 証明書に照らして証明書を検証できるように、ゲートウェイに証明書を常に送信するように指示します。
      leftsubnet=<subnets>
      クライアントがトンネル経由でアクセスできるゲートウェイに接続されているサブネットを指定します。
      mobike=yes
      クライアントがネットワーク間をシームレスにローミングできるようにします。
      rightaddresspool=<ip_range>
      ゲートウェイがクライアントに IP アドレスを割り当てることができる範囲を指定します。
      modecfgclient=yes
      クライアントが modecfgdns パラメーターで設定された DNS サーバー IP と modecfgdomains で設定された DNS 検索ドメインを受信できるようにします。

    例で使用されているすべてのパラメーターの詳細は、システム上の ipsec.conf(5) man ページを参照してください。

  5. パケット転送を有効にします。

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    Copy to Clipboard Toggle word wrap
  6. ipsec サービスを再起動します。

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

    設定ファイルで auto=start を使用すると、接続が自動的にアクティブになります。他の方法の場合、接続をアクティブ化するために追加の手順が必要です。詳細は、システム上の ipsec.conf(5) man ページを参照してください。

検証

  1. クライアントを設定し、VPN ゲートウェイに接続します
  2. サービスが CRL をロードし、エントリーを NSS データベースに追加したかどうかを確認します。

    # ipsec listcrls
    
    List of CRLs:
    
    issuer: CN=Example-CA
    revoked certs: 1
    updates: this Tue Jul 15 10:22:36 2025
             next Sun Jan 11 10:22:36 2026
    
    List of CRL fetch requests:
    
    Jul 15 15:13:56 2025, trials: 1
           issuer:  'CN=Example-CA'
           distPts: 'https://ca.example.com/crl.pem'
    Copy to Clipboard Toggle word wrap

次のステップ:

6.5.2. GNOME Settings を使用してクライアントを IPsec VPN ゲートウェイに接続するように設定する

リモートのプライベートネットワーク上のリソースにアクセスするには、ユーザーはまず IPsec VPN 接続を設定する必要があります。GNOME Settings アプリケーションは、NetworkManager で IPsec VPN 接続プロファイルを作成し、トンネルを確立するためのグラフィカルなソリューションです。

前提条件

  • IPsec VPN ゲートウェイが設定されている
  • NetworkManager-libreswan-gnome パッケージがインストールされている。
  • クライアントに、次の内容を含む PKCS #12 ファイル ~/file.p12 が存在する。

    • ユーザーの秘密鍵
    • ユーザー証明書
    • CA 証明書
    • 中間証明書 (必要な場合)

    秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。

  • 証明書の Extended Key Usage (EKU) が TLS Web Client Authentication に設定されている。

手順

  1. ネットワークセキュリティーサービス (NSS) データベースを初期化します。

    # ipsec initnss
    Copy to Clipboard Toggle word wrap

    このコマンドにより、/var/lib/ipsec/nss/ ディレクトリーにデータベースが作成されます。

  2. PKCS #12 ファイルを NSS データベースにインポートします。

    # ipsec import ~/file.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. ユーザーのニックネームと CA 証明書を表示します。

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    user                     u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    この情報は設定ファイルに必要です。

  4. Super キーを押して Settings と入力し、Enter キーを押して GNOME Settings アプリケーションを開きます。
  5. VPN エントリーの横にある + ボタンをクリックします。
  6. リストから IPsec based VPN を選択します。
  7. Identity タブで、次のようにフィールドに入力します。

    Expand
    表6.1 Identity タブの設定
    フィールド名ipsec.conf の対応するパラメーター

    Name

    <networkmanager_profile_name>

    該当なし

    Gateway

    <ip_address_or_fqdn_of_the_gateway>

    right

    Type

    IKEv2 (certificate)

    authby

    Group name

    %fromcert

    leftid

    Certificate name

    <user_certificate_nickname>

    leftcert

    Remote ID

    %fromcert

    rightid

  8. Advanced をクリックします。
  9. Advanced properties ウィンドウで、Connectivity タブのフィールドに次のように入力します。

    Expand
    表6.2 Connectivity タブの設定
    フィールド名ipsec.conf の対応するパラメーター

    Remote Network

    192.0.2.0/24

    rightsubnet

    Narrowing

    選択済み

    narrowing

    Enable MOBIKE

    yes

    mobike

    Delay

    30

    dpddelay

    Timeout

    120

    dpdtimeout

    Action

    Clear

    dpdaction

  10. Apply をクリックして接続設定に戻ります。
  11. Apply をクリックして接続を保存します。
  12. Settings アプリケーションの Network タブで、VPN プロファイルの横にあるスイッチを切り替えて接続を有効にします。

検証

  • リモートネットワーク内のホストへの接続を確立するか、ping を実行します。

次のステップ

6.6. 証明書ベースの認証を使用した IPsec メッシュ VPN の手動設定

IPsec メッシュは、すべてのサーバーが他のすべてのサーバーとセキュアに直接通信できる、完全に相互接続されたネットワークを形成するものです。これは、複数のデータセンターやクラウドプロバイダーにまたがる分散データベースクラスターや高可用性環境に最適です。各サーバーペア間に暗号化されたトンネルを直接確立することで、通信の集中によるボトルネックを避けつつ、セキュアな通信を実現できます。

認証のために、認証局 (CA) によって管理されるデジタル証明書を使用すると、非常にセキュアでスケーラブルなソリューションが実現します。メッシュ内のホストが、それぞれ信頼できる CA によって署名された証明書を提示します。この方法により、強力で検証可能な認証が実現し、ユーザー管理が簡素化されます。アクセス権の付与または失効は、CA で一元的に行うことができます。Libreswan は、各証明書を証明書失効リスト (CRL) と照合し、証明書がリストに掲載されていればアクセスを拒否することで、付与や失効を強制します。

前提条件

  • メッシュ内の各ピアに、次の内容を含む公開鍵暗号化標準 #12 (PKCS #12) ファイルが存在する。

    • サーバーの秘密鍵
    • サーバー証明書
    • CA 証明書
    • 中間証明書 (必要な場合)

    秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。

  • サーバー証明書には次のフィールドを含めます。

    • Extended Key Usage (EKU) を TLS Web Server Authentication に設定します。
    • コモンネーム (CN) またはサブジェクト代替名 (SAN) を、ホストの完全修飾ドメイン名 (FQDN) に設定します。
    • X509v3 CRL 配布ポイントに、証明書失効リスト (CRL) への URL を含めます。

手順

  1. Libreswan がまだインストールされていない場合は、次の手順を実行します。

    1. libreswan パッケージをインストールします。

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. ネットワークセキュリティーサービス (NSS) データベースを初期化します。

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      このコマンドにより、/var/lib/ipsec/nss/ ディレクトリーにデータベースが作成されます。

    3. ipsec サービスを有効にして起動します。

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. ファイアウォールで IPsec ポートとプロトコルを開きます。

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. PKCS #12 ファイルを NSS データベースにインポートします。

    # ipsec import <file>.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. サーバーと CA 証明書のニックネームを表示します。

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    server1                  u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    この情報は設定ファイルに必要です。

  4. /etc/ipsec.d/ ディレクトリーに接続用の .conf ファイルを作成します。たとえば、次の設定で /etc/ipsec.d/mesh.conf ファイルを作成します。

    1. CRL チェックを有効にするために、config setup セクションを追加します。

      config setup
          crl-strict=yes
          crlcheckinterval=1h
      Copy to Clipboard Toggle word wrap

      この例で指定されている設定は次のとおりです。

      crl-strict=yes
      CRL チェックを有効にします。NSS データベース内で CRL が利用できない場合、認証中のピアが拒否されます。
      crlcheckinterval=1h
      指定期間後に、サーバーの証明書に指定された URL から CRL を再取得します。
    2. メッシュ内のメンバー間のトラフィックを強制的に制御するセクションを追加します。

      conn <connection_name>
          # General setup and authentication type
          auto=ondemand
          authby=rsasig
      
          # Local settings settings
          left=%defaultroute
          leftid=%fromcert
          leftcert="<server_certificate_nickname>"
          leftrsasigkey=%cert
          leftsendcert=always
          failureshunt=drop
          type=transport
      
          # Settings related to other peers in the mesh
          right=%opportunisticgroup
          rightid=%fromcert
      Copy to Clipboard Toggle word wrap

      この例で指定されている設定は次のとおりです。

      left=%defaultroute
      ipsec サービスの起動時に、デフォルトルートインターフェイスの IP アドレスを動的に設定します。left パラメーターは、ホストの IP アドレスまたは FQDN に設定することもできます。
      leftid=%fromcert および rightid=%fromcert
      証明書の識別名 (DN) フィールドからアイデンティティーを取得するように Libreswan を設定します。
      leftcert="<server_certificate_nickname>"
      NSS データベースで使用されるサーバーの証明書のニックネームを設定します。
      leftrsasigkey=%cert
      証明書に埋め込まれた RSA 公開鍵を使用するように Libreswan を設定します。
      leftsendcert=always
      ピアが CA 証明書に照らして証明書を検証できるように、ピアに証明書を常に送信するように指示します。
      failureshunt=drop
      暗号化を強制し、IPsec ネゴシエーションが失敗した場合はトラフィックを破棄します。これはメッシュのセキュリティーにとって重要です。
      right=%opportunisticgroup
      ポリシーファイルで定義されているリモートピアの動的グループに接続を適用することを指定します。これにより、Libreswan は、そのグループにリストされている各 IP またはサブネットに対して、必要に応じて IPsec トンネルをインスタンス化できるようになります。

    例で使用されているすべてのパラメーターの詳細は、システム上の ipsec.conf(5) man ページを参照してください。

  5. Classless Inter-Domain Routing (CIDR) 形式でピアまたはサブネットを指定する /etc/ipsec.d/policies/server-mesh ポリシーファイルを作成します。

    192.0.2.0/24
    198.51.100.0/24
    Copy to Clipboard Toggle word wrap

    これらの設定により、これらのサブネット内のホスト間トラフィックが ipsec サービスによって暗号化されます。ホストが IPsec メッシュのメンバーとして設定されていない場合、このホストとメッシュメンバー間の通信が失敗します。

  6. ipsec サービスを再起動します。

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap
  7. ポリシーファイルで指定したサブネット内のすべてのホストでこの手順を繰り返します。

検証

  1. メッシュ内のホストにトラフィックを送信してトンネルを確立します。たとえば、ホストに ping を実行します。

    # ping -c3 <peer_in_mesh>
    Copy to Clipboard Toggle word wrap
  2. IPsec ステータスを表示します。

    # ipsec status
    Copy to Clipboard Toggle word wrap

    接続が正常に確立されていれば、ピアに関する次の行が出力に含まれています。

    • Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。

      #1: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 12822s; REPLACE in 13875s; newest; idle;
      Copy to Clipboard Toggle word wrap

      これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。

    • 子 SA が確立されています。

      #2: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_CHILD_SA (established Child SA); REKEY in 13071s; REPLACE in 13875s; newest; eroute owner; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      これは、データトラフィックが通過する実際のトンネルです。

  3. サービスが CRL をロードし、エントリーを NSS データベースに追加したかどうかを確認します。

    # ipsec listcrls
    
    List of CRLs:
    
    issuer: CN=Example-CA
    revoked certs: 1
    updates: this Tue Jul 15 10:22:36 2025
             next Sun Jan 11 10:22:36 2026
    
    List of CRL fetch requests:
    
    Jul 15 15:13:56 2025, trials: 1
           issuer:  'CN=Example-CA'
           distPts: 'https://ca.example.com/crl.pem'
    Copy to Clipboard Toggle word wrap

次のステップ

6.7. パスワードによる IPsec NSS データベースの保護

デフォルトでは、/var/lib/ipsec/nss/ ディレクトリー内の IPsec ネットワークセキュリティーサービス (NSS) データベースにアクセスできるのは root ユーザーのみです。必要に応じこのデータベースをパスワードでさらに保護することもできます。たとえば、これは RHEL を Federal Information Processing Standards (FIPS) モードで実行する場合に必要です。

前提条件

  • /var/lib/ipsec/nss/ ディレクトリーに NSS データベースが含まれている。

手順

  1. Libreswan NSS データベースのパスワード保護を有効にします。

    # certutil -W -d /var/lib/ipsec/nss/
    Copy to Clipboard Toggle word wrap
  2. 現在のパスワードを入力します。

    Enter Password or Pin for "NSS Certificate DB": <password>
    Copy to Clipboard Toggle word wrap

    現在データベースがパスワードで保護されていない場合は、Enter を押します。

  3. 新しいパスワードを入力します。

    Enter new password: <new_password>
    Re-enter password: <new_password>
    Copy to Clipboard Toggle word wrap
  4. データベースのロックを解除するために、ipsec サービスに /etc/ipsec.d/nsspassword ファイルが必要です。次の内容のファイルを作成します。

    • ホストが FIPS モードで実行されていない場合:

      NSS Certificate DB:<password>
      Copy to Clipboard Toggle word wrap
    • ホストが FIPS モードで実行されている場合:

      NSS FIPS 140-2 Certificate DB:<password>
      Copy to Clipboard Toggle word wrap
  5. /etc/ipsec.d/nsspassword ファイルにセキュアな権限を設定します。

    # chmod 600 /etc/ipsec.d/nsspassword
    # chown root:root /etc/ipsec.d/nsspassword
    Copy to Clipboard Toggle word wrap
  6. ipsec サービスを再起動します。

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

検証

  1. ipsec サービスが実行されていることを確認します。

    # systemctl is-active ipsec
    Copy to Clipboard Toggle word wrap

    コマンドで active が返された場合、サービスはパスワードファイルを使用して NSS データベースのロックを正常に解除します。

  2. NSS データベースでパスワードを必要とするアクションを実行します。たとえば、秘密鍵を表示します。

    # certutil -K -d /var/lib/ipsec/nss/
    certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services"
    Enter Password or Pin for "NSS Certificate DB":
    Copy to Clipboard Toggle word wrap

    コマンドによってパスワードが要求されることを確認します。

6.8. FIPS モードが有効なシステムでの IPsec の使用

Federal Information Processing Standards (FIPS) モードの RHEL は、FIPS 140-2 または FIPS 140-3 で検証された暗号化モジュールのみを使用し、レガシーのプロトコルと暗号を自動的に無効にします。FIPS モードの有効化は、多くの場合、連邦政府のコンプライアンス要件として求められ、有効にすることでシステムのセキュリティーが強化されます。

RHEL が提供する Libreswan の IPsec 実装は、完全に FIPS に準拠しています。システムが FIPS モードの場合、Libreswan は追加の設定を必要とせずに、認定済みの暗号化モジュールを自動的に使用します。これは、新しい FIPS 対応システムに Libreswan をインストールする場合でも、既存の Libreswan VPN があるシステムで FIPS モードを有効にする場合でも同様です。

FIPS モードが有効な場合は、Libreswan が FIPS モードで実行されていることを確認できます。

# ipsec whack --fipsstatus
FIPS mode enabled
Copy to Clipboard Toggle word wrap

FIPS モードの Libreswan で許可されているアルゴリズムと暗号をリスト表示するには、次のように入力します。

# ipsec pluto --selftest 2>&1
...
FIPS Encryption algorithms:
  AES_CCM_16  {256,192,*128} IKEv1:  ESP  IKEv2:  ESP  FIPS   aes_ccm, aes_ccm_c
  AES_CCM_12  {256,192,*128} IKEv1:  ESP  IKEv2:  ESP  FIPS   aes_ccm_b
  AES_CCM_8   {256,192,*128} IKEv1:  ESP  IKEv2:  ESP  FIPS   aes_ccm_a
...
Copy to Clipboard Toggle word wrap

6.9. IPsec VPN 接続の TCP フォールバックの設定

標準の IPsec VPN は、UDP および Encapsulating Security Payload (ESP) プロトコルをブロックする制限付きネットワークでは、失敗する場合があります。このような環境での接続性を確保するために、Libreswan は RFC 8229 で説明されている方法を使用して、すべての VPN トラフィックを TCP 接続内にカプセル化できます。

重要

VPN パケットを TCP 内にカプセル化すると、スループットが低下し、レイテンシーが増加する可能性があります。このため、TCP カプセル化はフォールバックオプションとして使用するか、UDP ベースの接続が環境内で一貫してブロックされている場合にのみ使用してください。

前提条件

  • IPsec 接続が設定されている。

手順

  1. /etc/ipsec.conf ファイルを編集し、config setup セクションで次の変更を加えます。

    1. TCP ポートをリッスンするように Libreswan を設定します。

      listen-tcp=yes
      Copy to Clipboard Toggle word wrap
    2. デフォルトでは、Libreswan はポート 4500 をリッスンします。別のポートを使用する場合は、次のように入力します。

      tcp-remoteport=<port_number>
      Copy to Clipboard Toggle word wrap
    3. UDP が利用できない場合に TCP をフォールバックオプションとして使用するか、TCP を永続的に使用するかを決定します。

      • フォールバックオプションとして使用するには、次のように入力します。

        enable-tcp=fallback
        retransmit-timeout=5s
        Copy to Clipboard Toggle word wrap

        デフォルトでは、Libreswan は UDP を使用した接続の試行が失敗した後、TCP 経由の接続を再試行するまで 60 秒間待機します。retransmit-timeout 値を下げると遅延が短縮され、フォールバックプロトコルをより迅速に開始できるようになります。

      • UDP の代わりに永続的に使用するには、次のように入力します。

        enable-tcp=yes
        Copy to Clipboard Toggle word wrap
  2. ipsec サービスを再起動します。

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap
  3. デフォルトの 4500 以外の TCP ポートを設定した場合は、ファイアウォールでそのポートを開きます。

    # firewall-cmd --permanent --add-port=<tcp_port>/tcp
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
  4. このゲートウェイを使用する各ピアでこの手順を繰り返します。

6.10. Libreswan でのレガシー暗号およびアルゴリズムの有効化

RHEL はシステム全体の暗号化ポリシーを使用して、Libreswan を含むすべてのアプリケーションに対して一貫性のあるセキュアなベースラインを適用します。このポリシーにより、IPsec と Internet Key Exchange (IKE) で、強力で最新の暗号化暗号とアルゴリズムのみがデフォルトで使用されるようになります。しかし、場合によっては、他の IPsec ピアとの下位互換性を保つために、セキュリティーを意図的に下げる必要があります。

RHEL のシステム全体の暗号化ポリシーでは、%default と呼ばれる特別な接続が作成されます。この接続により、keyexchangeesp、および ike パラメーターのデフォルト値が設定されます。

前提条件

  • Libreswan がインストールされている。

手順

  1. RHEL システム全体の暗号化ポリシーによって設定されたデフォルトをオーバーライドするには、接続設定に keyexchangeesp、および ike パラメーターを追加し、必要な値に設定します。以下に例を示します。

    conn <connection_name>
        keyexchange=ikev1
        ike=aes-sha2,aes-sha1;modp2048
        esp=aes-sha2,aes-sha1
        ...
    Copy to Clipboard Toggle word wrap
  2. ipsec サービスを再起動します。

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

6.11. 接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる

DHCP サーバーとステートレスアドレス自動設定 (SLAAC) はどちらも、クライアントのルーティングテーブルにルートを追加できます。悪意のある DHCP サーバーがこの機能を使用すると、たとえば、VPN 接続を使用するホストに対して、VPN トンネルではなく物理インターフェイス経由でトラフィックをリダイレクトするように強制できます。この脆弱性は TunnelVision とも呼ばれ、CVE-2024-3661 の脆弱性に関する記事で説明されています。

この脆弱性を軽減するために、VPN 接続を専用のルーティングテーブルに割り当てることができます。これを行うと、DHCP 設定または SLAAC が、VPN トンネル宛のネットワークパケットに関するルーティング決定を操作できなくなります。

次の条件が 1 つ以上環境に当てはまる場合は、この手順を実行してください。

  • 少なくとも 1 つのネットワークインターフェイスが DHCP または SLAAC を使用している。
  • ネットワークで、不正な DHCP サーバーを防ぐ DHCP スヌーピングなどのメカニズムが使用されていない。
重要

トラフィック全体を VPN 経由でルーティングすると、ホストがローカルネットワークリソースにアクセスできなくなります。

手順

  1. 使用するルーティングテーブルを決定します。次の手順ではテーブル 75 を使用します。デフォルトでは、RHEL はテーブル 1 - 254 を使用しないため、それらのテーブルのうちどれでも使用できます。
  2. VPN ルートを専用のルーティングテーブルに割り当てるように VPN 接続プロファイルを設定します。

    # nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
    Copy to Clipboard Toggle word wrap
  3. 上記のコマンドで使用したテーブルに低い優先度値を設定します。

    # nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
    Copy to Clipboard Toggle word wrap

    優先度の値は 1 - 32766 の範囲で指定できます。値が低いほど、優先度が高くなります。

  4. VPN 接続を再接続します。

    # nmcli connection down <vpn_connection_profile>
    # nmcli connection up <vpn_connection_profile>
    Copy to Clipboard Toggle word wrap

検証

  1. テーブル 75 の IPv4 ルートを表示します。

    # ip route show table 75
    ...
    192.0.2.0/24 via 192.0.2.254 dev vpn_device proto static metric 50
    default dev vpn_device proto static scope link metric 50
    Copy to Clipboard Toggle word wrap

    この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 75 に割り当てられており、すべてのトラフィックがトンネルを介してルーティングされることを確認できます。VPN 接続プロファイルで ipv4.never-default true を設定すると、デフォルトルートが作成されず、この出力には表示されません。

  2. テーブル 75 の IPv6 ルートを表示します。

    # ip -6 route show table 75
    ...
    2001:db8:1::/64 dev vpn_device proto kernel metric 50 pref medium
    default dev vpn_device proto static metric 50 pref medium
    Copy to Clipboard Toggle word wrap

    この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 75 に割り当てられており、すべてのトラフィックがトンネルを介してルーティングされることを確認できます。VPN 接続プロファイルで ipv6.never-default true を設定すると、デフォルトルートが作成されず、この出力には表示されません。

6.12. RHEL システムロールを使用した IPsec VPN 接続の設定

仮想プライベートネットワーク (VPN) を使用すると、インターネットなどの信頼できないネットワーク上で、セキュアで暗号化されたトンネルを確立できます。このようなトンネルにより、転送中のデータの機密性と整合性が確保されます。一般的なユースケースとしては、支社と本社を接続することなどが挙げられます。

vpn RHEL システムロールを使用すると、Libreswan IPsec VPN 設定の作成プロセスを自動化できます。

注記

vpn RHEL システムロールで作成できるのは、事前共有鍵 (PSK) または証明書を使用してピアを相互に認証する VPN 設定だけです。

6.12.1. vpn RHEL システムロールを使用して PSK 認証による IPsec ホスト間 VPN を設定する

ホスト間 VPN は、2 つのデバイス間に直接的でセキュアな暗号化された接続を確立し、アプリケーションがインターネットなどのセキュアでないネットワーク経由でセキュアに通信できるようにします。

認証には、事前共有鍵 (PSK) というシンプルな方式が使用されます。この方式では、2 つのピア間のみで共有される 1 つの秘密情報を使用します。この方式は設定が簡単で、デプロイの容易さが優先される基本的なセットアップに最適です。ただし、この鍵は厳重に保管する必要があります。攻撃者が鍵にアクセスすると、接続が侵害されるおそれがあります。

vpn RHEL システムロールを使用すると、PSK 認証による IPsec ホスト間接続を作成するプロセスを自動化できます。デフォルトでは、このロールはトンネルベースの VPN を作成します。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - hosts:
                  managed-node-01.example.com:
                  managed-node-02.example.com:
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    hosts: <list>

    VPN を設定するピアを含む YAML ディクショナリーを定義します。エントリーが Ansible 管理対象ノードでない場合は、hostname パラメーターに完全修飾ドメイン名 (FQDN) または IP アドレスを指定する必要があります。次に例を示します。

              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1
    Copy to Clipboard Toggle word wrap

    このロールは、各管理対象ノード上の VPN 接続を設定します。接続の名前は <peer_A>-to-<peer_B> です (例: managed-node-01.example.com-to-managed-node-02.example.com)。このロールは外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなピアでは手動で設定を作成する必要があります。

    auth_method: psk
    ピア間の PSK 認証を有効にします。ロールはコントロールノードで openssl を使用して PSK を作成します。
    auto: <startup_method>
    接続の起動方法を指定します。有効な値は addondemandstart、および ignore です。詳細は、Libreswan がインストールされているシステム上の ipsec.conf(5) man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。
    vpn_manage_firewall: true
    ロールにより、管理対象ノード上の firewalld サービスで必要なポートを開くことを指定します。
    vpn_manage_selinux: true
    ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.vpn/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • 接続が正常に開始されたことを確認します。次に例を示します。

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
    ...
    006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'
    Copy to Clipboard Toggle word wrap

    このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の auto 変数を start 以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。

ホスト間 VPN は、2 つのデバイス間に直接的でセキュアな暗号化された接続を確立し、アプリケーションがインターネットなどのセキュアでないネットワーク経由でセキュアに通信できるようにします。

認証には、事前共有鍵 (PSK) というシンプルな方式が使用されます。この方式では、2 つのピア間のみで共有される 1 つの秘密情報を使用します。この方式は設定が簡単で、デプロイの容易さが優先される基本的なセットアップに最適です。ただし、この鍵は厳重に保管する必要があります。攻撃者が鍵にアクセスすると、接続が侵害されるおそれがあります。

たとえば、制御メッセージの傍受や妨害のリスクを最小限に抑えてセキュリティーを強化するために、データトラフィックと制御トラフィックの両方に個別の接続を設定できます。vpn RHEL システムロールを使用すると、個別のデータプレーンとコントロールプレーンおよび PSK 認証を使用して IPsec ホスト間接続を作成するプロセスを自動化できます。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - name: control_plane_vpn
                hosts:
                  managed-node-01.example.com:
                    hostname: 203.0.113.1  # IP address for the control plane
                  managed-node-02.example.com:
                    hostname: 198.51.100.2 # IP address for the control plane
                auth_method: psk
                auto: start
              - name: data_plane_vpn
                hosts:
                  managed-node-01.example.com:
                    hostname: 10.0.0.1   # IP address for the data plane
                  managed-node-02.example.com:
                    hostname: 172.16.0.2 # IP address for the data plane
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    hosts: <list>

    VPN を設定するホストを含む YAML ディクショナリーを定義します。接続の名前は <name>-<IP_address_A>-to-<IP_address_B> です (例: control_plane_vpn-203.0.113.1-to-198.51.100.2)。

    このロールは、各管理対象ノード上の VPN 接続を設定します。このロールは外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなホストでは手動で設定を作成する必要があります。

    auth_method: psk
    ホスト間の PSK 認証を有効にします。ロールはコントロールノードで openssl を使用して事前共有鍵を作成します。
    auto: <startup_method>
    接続の起動方法を指定します。有効な値は addondemandstart、および ignore です。詳細は、Libreswan がインストールされているシステム上の ipsec.conf(5) man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。
    vpn_manage_firewall: true
    ロールにより、管理対象ノード上の firewalld サービスで必要なポートを開くことを指定します。
    vpn_manage_selinux: true
    ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.vpn/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • 接続が正常に開始されたことを確認します。次に例を示します。

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
    ...
    006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'
    Copy to Clipboard Toggle word wrap

    このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の auto 変数を start 以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。

6.12.3. vpn RHEL システムロールを使用して PSK 認証による IPsec サイト間 VPN を設定する

サイト間 VPN は、2 つの異なるネットワーク間にセキュアな暗号化トンネルを確立し、インターネットなどのセキュアでないパブリックネットワークを介してそれらをシームレスにリンクします。たとえば、これにより、支社のデバイスがすべて同じローカルネットワークの一部であるかのように、企業本社のリソースにアクセスできるようになります。

認証には、事前共有鍵 (PSK) というシンプルな方式が使用されます。この方式では、2 つのピア間のみで共有される 1 つの秘密情報を使用します。この方式は設定が簡単で、デプロイの容易さが優先される基本的なセットアップに最適です。ただし、この鍵は厳重に保管する必要があります。攻撃者が鍵にアクセスすると、接続が侵害されるおそれがあります。

vpn RHEL システムロールを使用すると、PSK 認証による IPsec サイト間接続を作成するプロセスを自動化できます。デフォルトでは、このロールはトンネルベースの VPN を作成します。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - hosts:
                  managed-node-01.example.com:
                    subnets:
                      - 192.0.2.0/24
                  managed-node-02.example.com:
                    subnets:
                      - 198.51.100.0/24
                      - 203.0.113.0/24
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    hosts: <list>

    VPN を設定するゲートウェイを含む YAML ディクショナリーを定義します。エントリーが Ansible 管理対象ノードでない場合は、hostname パラメーターに完全修飾ドメイン名 (FQDN) または IP アドレスを指定する必要があります。次に例を示します。

              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1
    Copy to Clipboard Toggle word wrap

    このロールは、各管理対象ノード上の VPN 接続を設定します。接続の名前は <gateway_A>-to-<gateway_B> です (例: managed-node-01.example.com-to-managed-node-02.example.com)。このロールは外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなピアでは手動で設定を作成する必要があります。

    subnets: <yaml_list_of_subnets>
    トンネルを介して接続されるサブネットを Classless Inter-Domain Routing (CIDR) 形式で定義します。
    auth_method: psk
    ピア間の PSK 認証を有効にします。ロールはコントロールノードで openssl を使用して PSK を作成します。
    auto: <startup_method>
    接続の起動方法を指定します。有効な値は addondemandstart、および ignore です。詳細は、Libreswan がインストールされているシステム上の ipsec.conf(5) man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。
    vpn_manage_firewall: true
    ロールにより、管理対象ノード上の firewalld サービスで必要なポートを開くことを指定します。
    vpn_manage_selinux: true
    ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.vpn/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • 接続が正常に開始されたことを確認します。次に例を示します。

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
    ...
    006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'
    Copy to Clipboard Toggle word wrap

    このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の auto 変数を start 以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。

IPsec メッシュは、すべてのサーバーが他のすべてのサーバーとセキュアに直接通信できる、完全に相互接続されたネットワークを形成するものです。これは、複数のデータセンターやクラウドプロバイダーにまたがる分散データベースクラスターや高可用性環境に最適です。各サーバーペア間に暗号化されたトンネルを直接確立することで、通信の集中によるボトルネックを避けつつ、セキュアな通信を実現できます。

認証のために、認証局 (CA) によって管理されるデジタル証明書を使用すると、非常にセキュアでスケーラブルなソリューションが実現します。メッシュ内のホストが、それぞれ信頼できる CA によって署名された証明書を提示します。この方法により、強力で検証可能な認証が実現し、ユーザー管理が簡素化されます。アクセス権の付与または失効は、CA で一元的に行うことができます。Libreswan は、各証明書を証明書失効リスト (CRL) と照合し、証明書がリストに掲載されていればアクセスを拒否することで、付与や失効を強制します。

vpn RHEL システムロールを使用すると、証明書ベースの認証による管理対象ノード間の VPN メッシュの設定を自動化できます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • 各管理対象ノード用に PKCS #12 ファイルを用意した。

    • 各ファイルには次のものを含めます。

      • サーバーの秘密鍵
      • サーバー証明書
      • CA 証明書
      • 中間証明書 (必要な場合)
    • ファイル名は <managed_node_name_as_in_the_inventory>.p12 とします。
    • ファイルは Playbook と同じディレクトリーに保存します。
    • サーバー証明書には次のフィールドを含めます。

      • Extended Key Usage (EKU) を TLS Web Server Authentication に設定します。
      • コモンネーム (CN) またはサブジェクト代替名 (SAN) を、ホストの完全修飾ドメイン名 (FQDN) に設定します。
      • X509v3 CRL 配布ポイントに、証明書失効リスト (CRL) への URL を含めます。

手順

  1. ~/inventory ファイルを編集し、cert_name 変数を追加します。

    managed-node-01.example.com cert_name=managed-node-01.example.com
    managed-node-02.example.com cert_name=managed-node-02.example.com
    managed-node-03.example.com cert_name=managed-node-03.example.com
    Copy to Clipboard Toggle word wrap

    cert_name 変数は、各ホストの証明書で使用されるコモンネーム (CN) フィールドの値に設定します。通常、CN フィールドは完全修飾ドメイン名 (FQDN) に設定します。

  2. 機密性の高い変数を暗号化されたファイルに保存します。

    1. vault を作成します。

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create コマンドでエディターが開いたら、機密データを <key>: <value> 形式で入力します。

      pkcs12_pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
  3. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Install LibreSwan
          ansible.builtin.package:
            name: libreswan
            state: present
    
        - name: Identify the path to IPsec NSS database
          ansible.builtin.set_fact:
            nss_db_dir: "{{ '/etc/ipsec.d/' if
              ansible_distribution in ['CentOS', 'RedHat']
              and ansible_distribution_major_version is version('8', '=')
              else '/var/lib/ipsec/nss/' }}"
    
        - name: Locate IPsec NSS database files
          ansible.builtin.find:
            paths: "{{ nss_db_dir }}"
            patterns: "*.db"
          register: db_files
    
        - name: Initialize IPsec NSS database if not initialized
          ansible.builtin.command:
            cmd: ipsec initnss
          when: db_files.matched == 0
    
        - name: Copy PKCS #12 file to the managed node
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.p12"
            dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            mode: 0600
    
        - name: Import PKCS #12 file in IPsec NSS database
          ansible.builtin.shell:
            cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"'
    
        - name: Remove PKCS #12 file
          ansible.builtin.file:
            path: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            state: absent
    
        - name: Opportunistic mesh IPsec VPN with certificate-based authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - opportunistic: true
                auth_method: cert
                policies:
                  - policy: private
                    cidr: default
                  - policy: private
                    cidr: 192.0.2.0/24
                  - policy: clear
                    cidr: 192.0.2.1/32
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    opportunistic: true
    複数ホスト間のオポチュニスティックメッシュを有効にします。policies 変数は、どのサブネットとホストのトラフィックを暗号化する必要があるか、または暗号化できるか、またどのサブネットとホストでプレーンテキストでの接続の使用を継続するかを定義します。
    auth_method: cert
    証明書ベースの認証を有効にします。これを行うには、インベントリーで各管理対象ノードの証明書のニックネームを指定する必要があります。
    policies: <list_of_policies>

    Libreswan ポリシーを YAML リスト形式で定義します。

    デフォルトのポリシーは private-or-clear です。これを private に変更するには、上記の Playbook に、デフォルトの cidr エントリーに応じた適切なポリシーを含めます。

    Ansible コントロールノードが管理対象ノードと同じ IP サブネットにある場合は、Playbook の実行中に SSH 接続が失われるのを防ぐために、コントロールノードの IP アドレスに clear ポリシーを追加します。たとえば、メッシュを 192.0.2.0/24 サブネット用に設定する必要があり、コントロールノードが IP アドレス 192.0.2.1 を使用する場合、Playbook に示されているように、192.0.2.1/32clear ポリシーが必要です。

    ポリシーの詳細は、Libreswan がインストールされているシステム上の ipsec.conf(5) man ページを参照してください。

    vpn_manage_firewall: true
    ロールにより、管理対象ノード上の firewalld サービスで必要なポートを開くことを指定します。
    vpn_manage_selinux: true
    ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.vpn/README.md ファイルを参照してください。

  4. Playbook の構文を検証します。

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  5. Playbook を実行します。

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  1. メッシュ内のノードで、別のノードに ping を送信して接続をアクティブ化します。

    [root@managed-node-01]# ping managed-node-02.example.com
    Copy to Clipboard Toggle word wrap
  2. 接続がアクティブであることを確認します。

    [root@managed-node-01]# ipsec trafficstatus
    006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'
    Copy to Clipboard Toggle word wrap

6.13. nmstatectl を使用した IPsec VPN 接続の設定

仮想プライベートネットワーク (VPN) を使用すると、インターネットなどの信頼できないネットワーク上で、セキュアで暗号化されたトンネルを確立できます。このようなトンネルにより、転送中のデータの機密性と整合性が確保されます。一般的なユースケースとしては、支社と本社を接続することなどが挙げられます。

nmstatectl ユーティリティーを使用すると、Nmstate API を介して Libreswan IPsec VPN 接続を設定できます。nmstatectl ユーティリティーは、宣言型の Nmstate API を通じてホストネットワークを管理するためのコマンドラインツールです。ユーザーは複数の命令的なコマンドを実行してインターフェイスを設定するのではなく、YAML ファイルで目的の状態を定義します。Nmstate はこの定義を取得してシステムに適用します。このアプローチの主な利点は、アトミックな結果です。Nmstate は、最終的な設定を YAML 定義と正確に一致させます。設定の一部が適用に失敗した場合、すべての変更が自動的にロールバックされるため、システムで不適切なネットワーク状態や壊れたネットワーク状態が発生しません。

注記

NetworkManager-libreswan プラグインの設計上、nmstatectl は一方のピアでのみ使用できます。他方のピアでは Libreswan を手動で設定する必要があります。

6.13.1. nmstatectl を使用して raw RSA 鍵認証による IPsec ホスト間 VPN を設定する

ホスト間 VPN は、2 つのデバイス間に直接的でセキュアな暗号化された接続を確立し、アプリケーションがインターネットなどのセキュアでないネットワーク経由でセキュアに通信できるようにします。

認証に関しては、RSA 鍵は事前共有鍵 (PSK) よりもセキュアです。非対称暗号化によって秘密情報共有のリスクが排除されるためです。また、RSA 鍵を使用すると、強力なピアツーピア認証を提供しつつも、認証局 (CA) が不要になるため、デプロイが容易になります。

Nmstate API を使用すると、既存の Libreswan IPsec ホストとの接続を設定できます。この場合、Nmstate が最終的な設定を YAML ファイルの定義と一致させます。一致させられない場合は、システムが不適切な状態になるのを避けるために、変更を自動的にロールバックします。Nmstate は状態のみを検証し、有効だが不適切な設定から保護するものではないことに注意してください。

注記

一般に、どちらのホストを left または right と呼ぶかは任意です。ただし、NetworkManager では、ローカルホストには常に left という用語を使用し、リモートホストには常に right という用語を使用します。

前提条件

  • リモートピアで Libreswan IPsec が動作しており、ホスト間 接続の準備が整っている。

    NetworkManager-libreswan プラグインの設計上、Nmstate は、同じ接続にこのプラグインを使用する他のピアと通信することはできません。

手順

  1. Libreswan がまだインストールされていない場合は、次の手順を実行します。

    1. 必要なパッケージをインストールします。

      # dnf install nmstate libreswan NetworkManager-libreswan
      Copy to Clipboard Toggle word wrap
    2. NetworkManager サービスを再起動します。

      # systemctl restart NetworkManager
      Copy to Clipboard Toggle word wrap
    3. ネットワークセキュリティーサービス (NSS) データベースを初期化します。

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      このコマンドにより、/var/lib/ipsec/nss/ ディレクトリーにデータベースが作成されます。

    4. ファイアウォールで IPsec ポートとプロトコルを開きます。

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. RSA 鍵ペアを作成します。

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec ユーティリティーにより、鍵ペアが NSS データベースに保存されます。

  3. left と right 両方のピアの Certificate Key Attribute ID (CKAID) を表示します。

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    以降のステップで、両方のピアの CKAID が必要になります。

  4. 公開鍵を表示します。

    1. left ピアで次のように入力します。

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
              # rsakey AwEAAdKCx
              leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. right ピアで次のように入力します。

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
              # rsakey AwEAAcNWC
              rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    これらのコマンドにより、設定ファイルで使用する必要がある対応するパラメーターとともに、公開鍵が表示されます。

  5. 次の内容を含む YAML ファイル (例: ~/ipsec-host-to-host-rsa-auth.yml) を作成します。

    ---
    interfaces:
    - name: '<connection_name>'
      type: ipsec
      libreswan:
        ikev2: insist
    
        left: <ip_address_or_fqdn_of_left_peer>
        leftid: peer_b
        leftrsasigkey: <public_key_of_left_peer>
        leftmodecfgclient: false
    
        right: <ip_address_or_fqdn_of_right_peer>
        rightid: peer_a
        rightrsasigkey: <public_key_of_right_peer>
        rightsubnet: <ip_address_of_right_peer>/32
    Copy to Clipboard Toggle word wrap

    この例で指定されている設定は次のとおりです。

    ikev2: insist
    最新の IKEv2 プロトコルを、IKEv1 へのフォールバックなしで、唯一許可されるプロトコルとして定義します。この設定は、Nmstate を使用したホスト間設定では必須です。
    left=<ip_address_or_fqdn_of_left_peer> および right=<ip_address_or_fqdn_of_right_peer>
    ピアの IP アドレスまたは DNS 名を定義します。
    leftid=<id> および rightid=<id>
    Internet Key Exchange (IKE) ネゴシエーションプロセス中に各ピアを識別する方法を定義します。これには IP アドレスまたはリテラル文字列を指定できます。NetworkManager は、IP アドレス以外のすべての値をリテラル文字列として解釈し、内部的に先頭に @ 記号を追加することに注意してください。そのため、Libreswan ピアも ID としてリテラル文字列を使用する必要があります。そうしないと、認証が失敗します。
    leftrsasigkey=<public_key> および rightrsasigkey=<public_key>
    ピアの公開鍵を指定します。前のステップで ipsec showhostkey コマンドによって表示された値を使用します。
    leftmodecfgclient: false
    このホストで動的設定を無効にします。この設定は、Nmstate を使用したホスト間設定では必須です。
    rightsubnet: <ip_address_of_right_peer>/32
    ホストがこのピアにのみアクセスできるように定義します。この設定は、Nmstate を使用したホスト間設定では必須です。
  6. 設定をシステムに適用します。

    # nmstatectl apply ~/ipsec-host-to-host-rsa-auth.yml
    Copy to Clipboard Toggle word wrap

検証

  • IPsec ステータスを表示します。

    # ipsec status
    Copy to Clipboard Toggle word wrap

    接続が正常に確立されていれば、出力に次の行が含まれています。

    • Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。

      000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
      Copy to Clipboard Toggle word wrap

      これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。

    • 子 SA が確立されています。

      000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      これは、データトラフィックが通過する実際のトンネルです。

トラブルシューティング

  • NetworkManager が Libreswan に渡す実際の設定を表示するには、次のように入力します。

    # nmcli connection export <connection_name>
    Copy to Clipboard Toggle word wrap

    この出力は、リモートホスト上の Libreswan 設定と比較する際に、ID や鍵などの設定の違いを特定するのに役立ちます。

次のステップ

6.13.2. nmstatectl を使用して raw RSA 鍵認証による IPsec サイト間 VPN を設定する

サイト間 VPN は、2 つの異なるネットワーク間にセキュアな暗号化トンネルを確立し、インターネットなどのセキュアでないパブリックネットワークを介してそれらをシームレスにリンクします。たとえば、これにより、支社のデバイスがすべて同じローカルネットワークの一部であるかのように、企業本社のリソースにアクセスできるようになります。

ゲートウェイデバイスの認証に関しては、RSA 鍵は事前共有鍵 (PSK) よりもセキュアです。非対称暗号化によって秘密情報共有のリスクが排除されるためです。また、RSA 鍵を使用すると、強力なピアツーピア認証を提供しつつも、認証局 (CA) が不要になるため、デプロイが容易になります。

Nmstate API を使用すると、既存の Libreswan IPsec ゲートウェイとの接続を設定できます。この場合、Nmstate が最終的な設定を YAML ファイルの定義と一致させます。一致させられない場合は、システムが不適切な状態になるのを避けるために、変更を自動的にロールバックします。Nmstate は状態のみを検証し、有効だが不適切な設定から保護するものではないことに注意してください。

注記

一般に、どちらのホストを left または right と呼ぶかは任意です。ただし、NetworkManager では、ローカルホストには常に left という用語を使用し、リモートホストには常に right という用語を使用します。

前提条件

  • リモートゲートウェイで Libreswan IPsec が動作しており、サイト間 接続の準備が整っている。

    NetworkManager-libreswan プラグインの設計上、Nmstate は、同じ接続にこのプラグインを使用する他のピアと通信することはできません。

手順

  1. Libreswan がまだインストールされていない場合は、次の手順を実行します。

    1. 必要なパッケージをインストールします。

      # dnf install nmstate libreswan NetworkManager-libreswan
      Copy to Clipboard Toggle word wrap
    2. NetworkManager サービスを再起動します。

      # systemctl restart NetworkManager
      Copy to Clipboard Toggle word wrap
    3. ネットワークセキュリティーサービス (NSS) データベースを初期化します。

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      このコマンドにより、/var/lib/ipsec/nss/ ディレクトリーにデータベースが作成されます。

    4. ファイアウォールで IPsec ポートとプロトコルを開きます。

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. RSA 鍵ペアを作成します。

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec ユーティリティーにより、鍵ペアが NSS データベースに保存されます。

  3. left と right 両方のピアの Certificate Key Attribute ID (CKAID) を表示します。

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    以降のステップで、両方のピアの CKAID が必要になります。

  4. 公開鍵を表示します。

    1. left ピアで次のように入力します。

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
              # rsakey AwEAAdKCx
              leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. right ピアで次のように入力します。

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
              # rsakey AwEAAcNWC
              rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    これらのコマンドにより、設定ファイルで使用する必要がある対応するパラメーターとともに、公開鍵が表示されます。

  5. 次の内容を含む YAML ファイル (例: ~/ipsec-site-to-site-rsa-auth.yml) を作成します。

    ---
    interfaces:
    - name: '<connection_name>'
      type: ipsec
      libreswan:
        ikev2: insist
    
        left: <ip_address_or_fqdn_of_left_peer>
        leftid: peer_b
        leftrsasigkey: <public_key_of_left_peer>
        leftmodecfgclient: false
        leftsubnet: 198.51.100.0/24
    
        right: <ip_address_or_fqdn_of_right_peer>
        rightid: peer_a
        rightrsasigkey: <public_key_of_right_peer>
        rightsubnet: 192.0.2.0/24
    Copy to Clipboard Toggle word wrap

    この例で指定されている設定は次のとおりです。

    ikev2: insist
    最新の IKEv2 プロトコルを、IKEv1 へのフォールバックなしで、唯一許可されるプロトコルとして定義します。この設定は、Nmstate を使用したサイト間設定では必須です。
    left=<ip_address_or_fqdn_of_left_peer> および right=<ip_address_or_fqdn_of_right_peer>
    ピアの IP アドレスまたは DNS 名を定義します。
    leftid=<id> および rightid=<id>
    Internet Key Exchange (IKE) ネゴシエーションプロセス中に各ピアを識別する方法を定義します。これには IP アドレスまたはリテラル文字列を指定できます。NetworkManager は、IP アドレス以外のすべての値をリテラル文字列として解釈し、内部的に先頭に @ 記号を追加することに注意してください。そのため、Libreswan ピアも ID としてリテラル文字列を使用する必要があります。そうしないと、認証が失敗します。
    leftrsasigkey=<public_key> および rightrsasigkey=<public_key>
    ピアの公開鍵を指定します。前のステップで ipsec showhostkey コマンドによって表示された値を使用します。
    leftmodecfgclient: false
    このホストで動的設定を無効にします。この設定は、Nmstate を使用したサイト間設定では必須です。
    leftsubnet=<subnet> および rightsubnet=<subnet>
    トンネルを介して接続されるサブネットを Classless Inter-Domain Routing (CIDR) 形式で定義します。
  6. パケット転送を有効にします。

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    Copy to Clipboard Toggle word wrap
  7. 設定をシステムに適用します。

    # nmstatectl apply ~/ipsec-site-to-site-rsa-auth.yml
    Copy to Clipboard Toggle word wrap

検証

  1. IPsec ステータスを表示します。

    # ipsec status
    Copy to Clipboard Toggle word wrap

    接続が正常に確立されていれば、出力に次の行が含まれています。

    • Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。

      000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
      Copy to Clipboard Toggle word wrap

      これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。

    • 子 SA が確立されています。

      000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      これは、データトラフィックが通過する実際のトンネルです。

  2. ローカルサブネット内のクライアントから、リモートサブネット内のクライアントに ping を実行します。

トラブルシューティング

  • NetworkManager が Libreswan に渡す実際の設定を表示するには、次のように入力します。

    # nmcli connection export <connection_name>
    Copy to Clipboard Toggle word wrap

    この出力は、リモートホスト上の Libreswan 設定と比較する際に、ID や鍵などの設定の違いを特定するのに役立ちます。

次のステップ

6.13.3. nmstatectl を使用してクライアントを IPsec VPN ゲートウェイに接続するように設定する

リモートのプライベートネットワーク上のリソースにアクセスするには、ユーザーはまず IPsec VPN 接続を設定する必要があります。Nmstate API を使用すると、既存の Libreswan IPsec ゲートウェイとの接続を設定できます。この場合、Nmstate が最終的な設定を YAML ファイルの定義と一致させます。一致させられない場合は、システムが不適切な状態になるのを避けるために、変更を自動的にロールバックします。Nmstate は状態のみを検証し、有効だが不適切な設定から保護するものではないことに注意してください。

注記

一般に、どちらのホストを left または right と呼ぶかは任意です。ただし、NetworkManager では、ローカルホストには常に left という用語を使用し、リモートホストには常に right という用語を使用します。

前提条件

  • リモートゲートウェイで Libreswan IPsec が動作しており、証明書ベースの認証による ホスト/サイト間 接続の準備が整っている。

    NetworkManager-libreswan プラグインの設計上、Nmstate は、同じ接続にこのプラグインを使用する他のピアと通信することはできません。

  • クライアントに、次の内容を含む PKCS#12 ファイル ~/file.p12 が存在する。

    • ユーザーの秘密鍵
    • ユーザー証明書
    • CA 証明書
    • 中間証明書 (必要な場合)

    秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。

  • 証明書の Extended Key Usage (EKU) が TLS Web Client Authentication に設定されている。

手順

  1. Libreswan がまだインストールされていない場合は、以下を実行します。

    1. 必要なパッケージをインストールします。

      # dnf install nmstate libreswan NetworkManager-libreswan
      Copy to Clipboard Toggle word wrap
    2. NetworkManager サービスを再起動します。

      # systemctl restart NetworkManager
      Copy to Clipboard Toggle word wrap
    3. ネットワークセキュリティーサービス (NSS) データベースを初期化します。

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      このコマンドにより、/var/lib/ipsec/nss/ ディレクトリーにデータベースが作成されます。

    4. ファイアウォールで IPsec ポートとプロトコルを開きます。

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. PKCS #12 ファイルを NSS データベースにインポートします。

    # ipsec import ~/file.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. ユーザーのニックネームと CA 証明書を表示します。

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    user                     u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    この情報は Nmstate の YAML ファイルに必要です。

  4. 次の内容を含む YAML ファイル (例: ~/ipsec-host-to-site-cert-auth.yml) を作成します。

    ---
    interfaces:
    - name: '<connection_name>'
      type: ipsec
      libreswan:
        ikev2: insist
    
        left: <ip_address_or_fqdn_of_left_peer>
        leftid: '%fromcert'
        leftcert: <user_certificate_nickname>
    
        right: <ip_address_or_fqdn_of_right_peer>
        rightid: '%fromcert'
        rightsubnet: 192.0.2.0/24
    Copy to Clipboard Toggle word wrap

    この例で指定されている設定は次のとおりです。

    ikev2: insist
    最新の IKEv2 プロトコルを、IKEv1 へのフォールバックなしで、唯一許可されるプロトコルとして定義します。この設定は、Nmstate を使用したホスト/サイト設定では必須です。
    left=<ip_address_or_fqdn_of_left_peer> および right=<ip_address_or_fqdn_of_right_peer>
    ピアの IP アドレスまたは DNS 名を定義します。
    leftid=%fromcert および rightid=%fromcert
    証明書の識別名 (DN) フィールドからアイデンティティーを取得するように Libreswan を設定します。
    leftcert="<server_certificate_nickname>"
    NSS データベースで使用されるサーバーの証明書のニックネームを設定します。
    rightsubnet: <subnet>
    ゲートウェイに接続されているサブネットを Classless Inter-Domain Routing (CIDR) 形式で定義します。
  5. 設定をシステムに適用します。

    # nmstatectl apply ~/ipsec-host-to-site-cert-auth.yml
    Copy to Clipboard Toggle word wrap

検証

  • リモートネットワーク内のホストへの接続を確立するか、ping を実行します。

トラブルシューティング

  • NetworkManager が Libreswan に渡す実際の設定を表示するには、次のように入力します。

    # nmcli connection export <connection_name>
    Copy to Clipboard Toggle word wrap

    この出力は、リモートホスト上の Libreswan 設定と比較する際に、ID や鍵などの設定の違いを特定するのに役立ちます。

次のステップ

6.14. IPsec 設定のトラブルシューティング

IPsec 設定の失敗の診断は困難な場合があります。設定の不一致、ファイアウォールルール、カーネルレベルのエラーによって問題が発生することがあるためです。以下では、IPsec VPN 接続に関する一般的な問題を解決するための体系的な方法を説明します。

6.14.1. 基本的な接続の問題

VPN 接続の問題は、エンドポイント間の設定の不一致が原因で発生することがよくあります。

IPsec 接続が確立されていることを確認するには、次のように入力します。

# ipsec trafficstatus
006 #8: "vpn.example.com"[1] 192.0.2.1, type=ESP, add_time=1595296930, inBytes=5999, outBytes=3231, id='@vpn.example.com', lease=198.51.100.1/32
Copy to Clipboard Toggle word wrap

接続が正常な場合、このコマンドで、接続の名前と詳細を含むエントリーが表示されます。出力が空の場合、トンネルが確立されていません。

6.14.3. 設定の不一致

各エンドポイントが、同じ Internet Key Exchange (IKE) バージョン、アルゴリズム、IP アドレス範囲、または事前共有鍵 (PSK) で設定されていない場合、VPN 接続は失敗します。不一致が見つかった場合は、両方のエンドポイントの設定を調整して問題を解決する必要があります。

リモートピアが IKE/IPsec を実行していない

接続が拒否された場合、次の ICMP エラーが表示されます。

# ipsec up vpn.example.com
...
000 "vpn.example.com"[1] 192.0.2.2 #16: ERROR: asynchronous network error report on wlp2s0 (192.0.2.2:500), complainant 198.51.100.1: Connection refused [errno 111, origin ICMP type 3 code 3 (not authenticated)]
Copy to Clipboard Toggle word wrap
IKE アルゴリズムの不一致

初期セットアップ中に NO_PROPOSAL_CHOSEN 通知が表示され、接続が失敗します。

# ipsec up vpn.example.com
...
003 "vpn.example.com"[1] 193.110.157.148 #3: dropping unexpected IKE_SA_INIT message containing NO_PROPOSAL_CHOSEN notification; message payloads: N; missing payloads: SA,KE,Ni
Copy to Clipboard Toggle word wrap
IPsec アルゴリズムの不一致

最初の交換後、NO_PROPOSAL_CHOSEN エラーで接続が失敗します。

# ipsec up vpn.example.com
...
182 "vpn.example.com"[1] 193.110.157.148 #5: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_256 group=MODP2048}
002 "vpn.example.com"[1] 193.110.157.148 #6: IKE_AUTH response contained the error notification NO_PROPOSAL_CHOSEN
Copy to Clipboard Toggle word wrap
IP アドレス範囲の不一致 (IKEv2)

リモートピアが TS_UNACCEPTABLE エラーで応答します。

# ipsec up vpn.example.com
...
1v2 "vpn.example.com" #1: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_512 group=MODP2048}
002 "vpn.example.com" #2: IKE_AUTH response contained the error notification TS_UNACCEPTABLE
Copy to Clipboard Toggle word wrap
IP アドレス範囲の不一致 (IKEv1)

クイックモード中に接続がタイムアウトし、ピアがプロポーザルを受け入れなかったことを示すメッセージが表示されます。

# ipsec up vpn.example.com
...
031 "vpn.example.com" #2: STATE_QUICK_I1: 60 second timeout exceeded after 0 retransmits.  No acceptable response to our first Quick Mode message: perhaps peer likes no proposal
Copy to Clipboard Toggle word wrap
PSK の不一致 (IKEv2)

ピアが接続を拒否し、AUTHENTICATION_FAILED エラーが発生します。

# ipsec up vpn.example.com
...
003 "vpn.example.com" #1: received Hash Payload does not match computed value
223 "vpn.example.com" #1: sending notification INVALID_HASH_INFORMATION to 192.0.2.23:500
Copy to Clipboard Toggle word wrap
PSK の不一致 (IKEv1)

ハッシュペイロードが一致しないため、IKE メッセージが読み取り不能になり、INVALID_HASH_INFORMATION エラーが発生します。

# ipsec up vpn.example.com
...
002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
Copy to Clipboard Toggle word wrap

6.14.4. MTU の問題

パケットのサイズは、暗号化およびカプセル化のプロセスにより増加します。パケットがネットワークの最大転送単位 (MTU) (通常は 1500 バイト) を超えると、パケットは断片化されます。これにより、断続的な接続障害が発生し、断片が失われ、元のパケットを再構成できなくなることがあります。一般的な症状としては、ping などの小さなパケットでは正常に動作するが、SSH セッションなどの大きなパケットではログイン後にフリーズすることなどが挙げられます。

この問題を解決するには、設定ファイルに mtu=1400 オプションを追加して、トンネルの MTU を下げます。

6.14.5. NAT の競合

IPsec ホストが NAT ルーターとしても機能する場合、IPsec トンネル宛のパケットに誤って NAT が適用されることがあります。たとえば、IPsec 暗号化が適用される前に、パケットの送信元 IP アドレスがマスカレードルールによって変換されると、そのパケットの送信元が IPsec ポリシーと一致しなくなり、Libreswan がそのパケットを暗号化せずにネットワーク経由で送信してしまいます。

この問題を解決するには、IPsec サブネット間のトラフィックを NAT から除外するファイアウォールルールを追加します。このルールは、一般的な NAT ルールの前に処理されるように、POSTROUTING チェーンの先頭に挿入する必要があります。

例6.1 nftables フレームワークを使用した解決策

次の例では、nftables を使用して、192.0.2.0/24 サブネットと 198.51.100.0/24 サブネット間のトラフィックをアドレス変換から除外する基本的な NAT 環境を設定します。

# nft add table ip nat
# nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
# nft add rule ip nat postrouting ip saddr 192.0.2.0/24 ip daddr 198.51.100.0/24 return
Copy to Clipboard Toggle word wrap

6.14.6. カーネルレベルの IPsec の問題

よくある問題として、VPN トンネルが正常に確立されたように見えても、トラフィックが通過しないことがあります。このような場合は、カーネルの IPsec の状態を調べて、トンネルポリシーと暗号鍵が正しくインストールされているかどうかを確認できます。

このプロセスでは、次の 2 つのコンポーネントをチェックします。

  • Security Policy Database (SPD): 暗号化するトラフィックをカーネルに指示するルール。
  • Security Association Database (SAD): そのトラフィックを暗号化する方法をカーネルに指示する鍵。

まず、SPD に正しいポリシーが存在するかどうかを確認します。

# ip xfrm policy
src 192.0.2.1/32 dst 10.0.0.0/8
	dir out priority 666 ptype main
	tmpl src 198.51.100.13 dst 203.0.113.22
		proto esp reqid 16417 mode tunnel
Copy to Clipboard Toggle word wrap

出力に、leftsubnet および rightsubnet パラメーターに一致するポリシーが、in 方向と out 方向の両方で含まれているはずです。トラフィックのポリシーが表示されない場合は、Libreswan がカーネルルールの作成に失敗しており、トラフィックは暗号化されていません。

ポリシーが存在する場合は、SAD 内に対応する鍵セットがあるかどうかを確認します。

# ip xfrm state
src 203.0.113.22 dst 198.51.100.13
	proto esp spi 0xa78b3fdb reqid 16417 mode tunnel
	auth-trunc hmac(sha1) 0x3763cd3b... 96
	enc cbc(aes) 0xd9dba399...
Copy to Clipboard Toggle word wrap
警告

このコマンドにより、秘密の暗号鍵が表示されます。この出力を共有しないでください。攻撃者がこの出力を使用して VPN トラフィックを復号するおそれがあります。

ポリシーが存在するにもかかわらず、同じ reqid を持つ対応する状態が表示されない場合は、通常、Internet Key Exchange (IKE) ネゴシエーションが失敗しています。2 つの VPN エンドポイントが、鍵セットについて合意できなかったということです。

より詳細な診断を行うには、いずれかのコマンドで -s オプションを使用します。このオプションはトラフィックカウンターを追加します。これは、カーネルが特定のルールに従ってパケットを処理しているかどうかを確認するのに役立ちます。

6.14.7. カーネル IPsec サブシステムのバグ

まれに、カーネルの IPsec サブシステムの不具合により、Internet Key Exchange (IKE) ユーザー空間デーモンとの同期が失われる場合があります。この同期のずれにより、ネゴシエートされたセキュリティーアソシエーションと、カーネル内における IPsec ポリシーの実際の適用との間にずれが生じ、セキュアなネットワーク通信が中断される場合があります。カーネルレベルのエラーを確認するには、変換 (XFRM) の統計情報を表示します。

# cat /proc/net/xfrm_stat
Copy to Clipboard Toggle word wrap

出力内のいずれかのカウンター (XfrmInError など) がゼロ以外の値を示している場合、カーネルサブシステムに問題があります。このような場合は、サポートケース を作成し、コマンドの出力と対応する IKE ログを添付してください。

6.14.8. Libreswan ログの表示

Libreswan はイベントをジャーナルに記録します。ipsec サービスのジャーナルを表示するには、次のように入力します。

# journalctl -xeu ipsec
Copy to Clipboard Toggle word wrap

デフォルトのロギングレベルでは十分な詳細情報が得られない場合は、/etc/ipsec.conf ファイルの config setup セクションに次の設定を追加して、包括的なデバッグロギングを有効にします。

plutodebug=all
logfile=/var/log/pluto.log
Copy to Clipboard Toggle word wrap

デバッグロギングでは多数のエントリーが生成されることがあります。そのため、メッセージを専用のログファイルにリダイレクトすると、journald および systemd サービスによるメッセージのレート制限を防ぐことができます。

第7章 WireGuard VPN の設定

WireGuard は、Linux カーネルで実行する高パフォーマンスの VPN ソリューションです。最新の暗号を使用し、他の多くの VPN ソリューションよりも簡単に設定できます。さらに、WireGuard のコードベースが小さくなり、攻撃の影響が減るため、セキュリティーが向上します。認証および暗号化には、WireGuard が SSH と同様の鍵を使用します。

重要

WireGuard はテクノロジープレビューとしてのみ提供されます。テクノロジープレビュー機能は、Red Hat 製品サポートのサービスレベルアグリーメント (SLA) ではサポートされておらず、機能的に完全ではない可能性があるため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビュー機能では、最新の製品機能をいち早く提供します。これにより、お客様は開発段階で機能をテストし、フィードバックを提供できます。

テクノロジープレビュー機能のサポート範囲は、Red Hat カスタマーポータルの テクノロジープレビュー機能のサポート範囲 を参照してください。

WireGuard VPN に参加するすべてのホストがピアであることに注意してください。このドキュメントでは、接続を確立するホストを説明する client という用語と、クライアントが接続する固定ホスト名または IP アドレスを使用してホストを説明する server という用語を使用し、必要に応じてすべてのトラフィックをこのサーバーにルーティングします。

WireGuard VPN を設定するには、次の手順を完了する必要があります。

  1. サーバーを設定します。
  2. ローカルファイアウォールの WireGuard ポートを開きます。
  3. クライアントを設定します。

WireGuard は、ネットワーク層 (レイヤー 3) で動作します。そのため、DHCP を使用できず、静的 IP アドレスまたは IPv6 グローバルアドレスを、サーバーとクライアントの両方のトンネルデバイスに割り当てる必要があります。

重要

WireGuard は、RHEL の FIPS (Federal Information Processing Standard) モードが無効になっている場合にのみ使用できます。

7.1. WireGuard が使用するプロトコルおよびプリミティブ

WireGuard は、次のプロトコルおよびプリミティブを使用します。

  • RFC7539 で説明されているように Authenticated Encryption with Associated Data (AEAD) 構造を使用して、Poly1305 で認証された対称暗号化用の ChaCha20
  • Elliptic-curve Diffie-Hellman (ECDH) 鍵交換用の Curve25519
  • RFC7693 で説明されているように、ハッシュ用および鍵付きのハッシュ用の BLAKE2
  • ハッシュテーブルキーの SipHash24
  • RFC5869 で説明されているように、鍵の派生に使用される HKDF

WireGuard がピアにネットワークパケットを送信する場合は、次のコマンドを実行します。

  1. WireGuard は、パケットから宛先 IP を読み込み、ローカル設定で許可されている IP アドレスのリストと比較します。ピアが見つからない場合、WireGuard はパケットを破棄します。
  2. ピアが有効な場合、WireGuard は、ピアの公開鍵を使用してパケットを暗号化します。
  3. 送信側ホストは、ホストの最新のインターネット IP アドレスを検索し、暗号化したパケットを送信します。

WireGuard がパケットを受信すると、以下が行われます。

  1. WireGuard は、リモートホストの秘密鍵を使用してパケットを復号します。
  2. WireGuard は、パケットから内部ソースアドレスを読み込み、ローカルホストのピア設定で許可されている IP アドレスのリストに IP が設定されているかどうかを調べます。ソース IP が許可リストにある場合、WireGuard はパケットを受け入れます。IP アドレスがリストにない場合は、WireGuard がパケットを破棄します。

公開鍵と許可された IP アドレスの関連付けは、Cryptokey Routing Table と呼ばれます。つまり、IP アドレスのリストは、パケットの送信時にはルーティングテーブルと同様に動作し、パケットの受信時にはアクセス制御リストのように動作します。

7.3. NAT およびファイアウォールの背後で WireGuard クライアントを使用する

WireGuard は UDP プロトコルを使用し、ピアがパケットを送信する場合にのみデータを送信します。ルーターのステートフルファイアウォールとネットワークアドレス変換 (NAT) は、接続を追跡して、NAT の背後のピアまたはファイアウォールがパケットを受信できるようにします。

コネクションをアクティブな状態に保つために、WireGuard は persistent keepalives をサポートしています。つまり、WireGuard がキープアライブパケットを送信する間隔を設定できます。デフォルトでは、ネットワークトラフィックを削減するために、永続的なキープアライブ機能は無効になっています。NAT を使用したネットワークでクライアントを使用する場合、またはしばらく非アクティブにした後にファイアウォールが接続を閉じる場合は、クライアントでこの機能を有効にします。

注記

RHEL Web コンソールを使用して WireGuard 接続のキープアライブパケットを設定することはできないことに注意してください。この機能を設定するには、nmcli ユーティリティーを使用して接続プロファイルを編集してください。

7.4. WireGuard 接続で使用される秘密鍵および公開鍵の作成

WireGuard は、base64 でエンコードされた秘密鍵と公開鍵を使用して、ホストを相互に認証します。そのため、WireGuard VPN に参加する各ホストで鍵を作成する必要があります。

重要

セキュアな接続には、ホストごとに異なる鍵を作成し、公開鍵のみをリモートの WireGuard ホストと共有するようにしてください。このドキュメントで使用しているサンプルキーは使用しないでください。

RHEL Web コンソールを使用して WireGuard VPN 接続を作成する場合は、代わりに Web コンソールで公開鍵と秘密鍵のペアを生成することもできます。

手順

  1. wireguard-tools パッケージをインストールします。

    # dnf install wireguard-tools
    Copy to Clipboard Toggle word wrap
  2. ホストの秘密鍵と、対応する公開鍵を作成します。

    # wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key
    Copy to Clipboard Toggle word wrap

    キーファイルの内容は必要ですが、ファイル自体は必要ありません。ただし、Red Hat では、将来的に鍵を覚えておく必要がある場合に備え、ファイルを保持することを推奨しています。

  3. キーファイルにセキュアなパーミッションを設定します。

    # chmod 600 /etc/wireguard/$HOSTNAME.private.key /etc/wireguard/$HOSTNAME.public.key
    Copy to Clipboard Toggle word wrap
  4. 秘密鍵を表示します。

    # cat /etc/wireguard/$HOSTNAME.private.key
    YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
    Copy to Clipboard Toggle word wrap

    ローカルホストで WireGuard 接続を設定するには、秘密鍵が必要です。秘密鍵を共有しないでください。

  5. 公開鍵を表示します。

    # cat /etc/wireguard/$HOSTNAME.public.key
    UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    Copy to Clipboard Toggle word wrap

    リモートホストで WireGuard 接続を設定するには、公開鍵が必要です。

7.5. nmcli を使用した WireGuard サーバーの設定

NetworkManager で接続プロファイルを作成することで、WireGuard サーバーを設定できます。この方法を使用して、NetworkManager に WireGuard 接続を管理させます。

この手順では、次の設定を前提としています。

  • サーバー

    • 秘密鍵: YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
    • トンネル IPv4 アドレス: 192.0.2.1/24
    • トンネル IPv6 アドレス: 2001:db8:1::1/32
  • クライアント:

    • Public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
    • トンネル IPv4 アドレス: 192.0.2.2/24
    • トンネル IPv6 アドレス: 2001:db8:1::2/32

前提条件

  • サーバーとクライアントの両方に公開鍵と秘密鍵を生成している。
  • 以下の情報を把握している。

    • サーバーの秘密鍵
    • クライアントの静的トンネルの IP アドレスとサブネットマスク
    • クライアントの公開鍵
    • サーバーの静的トンネル IP アドレスおよびサブネットマスク

手順

  1. NetworkManager WireGuard 接続プロファイルを追加します。

    # nmcli connection add type wireguard con-name server-wg0 ifname wg0 autoconnect no
    Copy to Clipboard Toggle word wrap

    このコマンドは、server-wg0 という名前のプロファイルを作成し、それに仮想インターフェイス wg0 を割り当てます。設定を確定せずに接続を追加した後、接続が自動的に開始しないようにするには、autoconnect パラメーターを無効にします。

  2. サーバーのトンネル IPv4 アドレスおよびサブネットマスクを設定します。

    # nmcli connection modify server-wg0 ipv4.method manual ipv4.addresses 192.0.2.1/24
    Copy to Clipboard Toggle word wrap
  3. サーバーのトンネル IPv6 アドレスおよびサブネットマスクを設定します。

    # nmcli connection modify server-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::1/32
    Copy to Clipboard Toggle word wrap
  4. サーバーの秘密鍵を接続プロファイルに追加します。

    # nmcli connection modify server-wg0 wireguard.private-key "YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg="
    Copy to Clipboard Toggle word wrap
  5. 着信 WireGuard 接続のポートを設定します。

    # nmcli connection modify server-wg0 wireguard.listen-port 51820
    Copy to Clipboard Toggle word wrap

    着信 WireGuard 接続を受信するホストでは、常に固定ポート番号を設定してください。ポートを設定しないと、WireGuard は wg0 インターフェイスをアクティブにするたびにランダムに空きポートを使用します。

  6. このサーバーとの通信を許可する各クライアントに、ピア設定を追加します。これらの設定は手動で追加する必要があります。nmcli ユーティリティーでは、対応する接続プロパティーの設定をサポートしていないためです。

    1. /etc/NetworkManager/system-connections/server-wg0.nmconnection ファイルを編集し、以下を追加します。

      [wireguard-peer.bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=]
      allowed-ips=192.0.2.2;2001:db8:1::2;
      Copy to Clipboard Toggle word wrap
      • [wireguard-peer.<public_key_of_the_client>] エントリーは、クライアントのピアセクションを定義し、セクション名にはクライアントの公開鍵が含まれます。
      • allowed-ips パラメーターは、このサーバーへのデータ送信が許可されているクライアントのトンネル IP アドレスを設定します。

        各クライアントにセクションを追加します。

    2. server-wg0 接続プロファイルをリロードします。

      # nmcli connection load /etc/NetworkManager/system-connections/server-wg0.nmconnection
      Copy to Clipboard Toggle word wrap
  7. 必要に応じて、自動的に起動するように接続を設定し、次のコマンドを実行します。

    # nmcli connection modify server-wg0 autoconnect yes
    Copy to Clipboard Toggle word wrap
  8. server-wg0 接続を再アクティブ化します。

    # nmcli connection up server-wg0
    Copy to Clipboard Toggle word wrap
  9. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. wg0 デバイスのインターフェイス設定を表示します。

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128
    Copy to Clipboard Toggle word wrap

    出力に秘密鍵を表示するには、WG_HIDE_KEYS=never wg show wg0 コマンドを使用します。

  2. wg0 デバイスの IP 設定を表示します。

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

7.6. nmtui を使用した WireGuard サーバーの設定

NetworkManager で接続プロファイルを作成することで、WireGuard サーバーを設定できます。この方法を使用して、NetworkManager に WireGuard 接続を管理させます。

この手順では、次の設定を前提としています。

  • サーバー

    • 秘密鍵: YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
    • トンネル IPv4 アドレス: 192.0.2.1/24
    • トンネル IPv6 アドレス: 2001:db8:1::1/32
  • クライアント:

    • Public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
    • トンネル IPv4 アドレス: 192.0.2.2/24
    • トンネル IPv6 アドレス: 2001:db8:1::2/32

前提条件

  • サーバーとクライアントの両方に公開鍵と秘密鍵を生成している。
  • 以下の情報を把握している。

    • サーバーの秘密鍵
    • クライアントの静的トンネルの IP アドレスとサブネットマスク
    • クライアントの公開鍵
    • サーバーの静的トンネル IP アドレスおよびサブネットマスク
  • NetworkManager-tui パッケージをインストールしました。

手順

  1. nmtui アプリケーションを開始します。

    # nmtui
    Copy to Clipboard Toggle word wrap
  2. Edit a connection を選択し、Enter を押します。
  3. Add を選択し、Enter を押します。
  4. リストから WireGuard 接続タイプを選択し、Enter を押します。
  5. Edit connection ウィンドウで:

    1. NetworkManager が接続に割り当てる仮想インターフェイス (wg0 など) の接続名を入力します。
    2. サーバーの秘密鍵を入力します。
    3. 着信 WireGuard 接続のリッスンポート番号 (51820 など) を設定します。

      着信 WireGuard 接続を受信するホストでは、常に固定ポート番号を設定してください。ポートを設定しないと、WireGuard はインターフェイスをアクティブにするたびにランダムな空きポートを使用します。

    4. Peers ペインの横にある Add をクリックします。

      1. クライアントの公開鍵を入力します。
      2. Allowed IPs フィールドを、このサーバーへのデータ送信が許可されているクライアントのトンネル IP アドレスに設定します。
      3. OK を選択し、Enter を押します。

    5. IPv4 Configuration の横にある Show を選択し、Enter キーを押します。

      1. IPv4 設定方法 Manual を選択します。
      2. トンネルの IPv4 アドレスとサブネットマスクを入力します。Gateway フィールドは空のままにします。
    6. IPv6 Configuration の横にある Show を選択し、Enter を押します。

      1. IPv6 設定方法 Manual を選択します。
      2. トンネルの IPv6 アドレスとサブネットマスクを入力します。Gateway フィールドは空のままにします。
    7. OK を選択し、Enter を押します

  6. 接続のリストが表示されたウィンドウで、Back を選択し、Enter を押します。
  7. NetworkManager TUI のメインウィンドウで、Quit を選択し、Enter を押します。
  8. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. wg0 デバイスのインターフェイス設定を表示します。

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128
    Copy to Clipboard Toggle word wrap

    出力に秘密鍵を表示するには、WG_HIDE_KEYS=never wg show wg0 コマンドを使用します。

  2. wg0 デバイスの IP 設定を表示します。

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 _2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

7.7. RHEL Web コンソールを使用した WireGuard サーバーの設定

ブラウザーベースの RHEL Web コンソールを使用して WireGuard サーバーを設定できます。この方法を使用して、NetworkManager に WireGuard 接続を管理させます。

前提条件

  • RHEL Web コンソールにログインしています。
  • 以下の情報を把握している。

    • サーバーとクライアントの両方の静的トンネル IP アドレスとサブネットマスク
    • クライアントの公開鍵

手順

  1. 画面左側のナビゲーションで Networking タブを選択します。
  2. Interfaces セクションで Add VPN をクリックします。
  3. wireguard-tools および systemd-resolved パッケージがまだインストールされていない場合は、Web コンソールにその旨の通知が表示されます。これらのパッケージをインストールするには、Install をクリックします。
  4. 作成する WireGuard デバイスの名前を入力します。
  5. このホストの鍵ペアを設定します。

    • Web コンソールによって作成された鍵を使用する場合は、次の手順を実行します。

      1. Private key エリアで、事前に選択済みの Generated オプションをそのままにします。
      2. Public key の値をメモします。クライアントを設定するときにこの情報が必要になります。
    • 既存の秘密鍵を使用する場合は、次の手順を実行します。

      1. Private key エリアで Paste existing key を選択します。
      2. 秘密鍵をテキストフィールドに貼り付けます。Web コンソールにより対応する公開鍵が自動的に計算されます。
  6. 着信 WireGuard 接続のリッスンポート番号 (51820 など) を設定します。

    着信 WireGuard 接続を受信するホストでは、常に固定ポート番号を設定してください。ポートを設定しないと、WireGuard はインターフェイスをアクティブにするたびにランダムな空きポートを使用します。

  7. サーバーのトンネル IPv4 アドレスおよびサブネットマスクを設定します。

    IPv6 アドレスも設定するには、接続を作成した後に編集する必要があります。

  8. このサーバーとの通信を許可する各クライアントのピア設定を追加します。

    1. Add peer をクリックします。
    2. クライアントの公開鍵を入力します。
    3. Endpoint フィールドは空のままにします。
    4. Allowed IPs フィールドに、このサーバーへのデータ送信を許可するクライアントのトンネル IP アドレスを設定します。
  9. Add をクリックして WireGuard 接続を作成します。
  10. トンネル IPv6 アドレスも設定する場合は、次の手順を実行します。

    1. Interfaces セクションで WireGuard 接続の名前をクリックします。
    2. IPv6 の横にある edit をクリックします。
    3. Addresses フィールドを Manual に設定し、サーバーのトンネル IPv6 アドレスと接頭辞を入力します。
    4. Save をクリックします。
  11. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. wg0 デバイスのインターフェイス設定を表示します。

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128
    Copy to Clipboard Toggle word wrap

    出力に秘密鍵を表示するには、WG_HIDE_KEYS=never wg show wg0 コマンドを使用します。

  2. wg0 デバイスの IP 設定を表示します。

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWERUP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

7.8. コマンドラインを使用した WireGuard サーバーでの firewalld の設定

クライアントからの着信接続を許可するには、WireGuard サーバーで firewalld サービスを設定する必要があります。また、クライアントが WireGuard サーバーをデフォルトゲートウェイとして使用し、すべてのトラフィックをトンネル経由でルーティングできるようにするには、マスカレードを有効にする必要があります。

手順

  1. firewalld サービスで着信接続用の WireGuard ポートを開きます。

    # firewall-cmd --permanent --add-port=51820/udp --zone=public
    Copy to Clipboard Toggle word wrap
  2. クライアントがすべてのトラフィックをトンネル経由でルーティングし、WireGuard サーバーをデフォルトゲートウェイとして使用する場合は、public ゾーンのマスカレードを有効にします。

    # firewall-cmd --permanent --zone=public --add-masquerade
    Copy to Clipboard Toggle word wrap
  3. firewalld ルールをリロードします。

    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

検証

  • public ゾーンの設定を表示します。

    # firewall-cmd --list-all
    public (active)
      ...
      ports: 51820/udp
      masquerade: yes
      ...
    Copy to Clipboard Toggle word wrap

7.9. RHEL Web コンソールを使用した WireGuard サーバーでの firewalld の設定

クライアントからの着信接続を許可するには、WireGuard サーバーで firewalld サービスを設定する必要があります。また、クライアントが WireGuard サーバーをデフォルトゲートウェイとして使用し、すべてのトラフィックをトンネル経由でルーティングできるようにするには、マスカレードを有効にする必要があります。

前提条件

  • RHEL Web コンソールにログインしています。

手順

  1. 画面左側のナビゲーションで Networking タブを選択します。
  2. Firewall セクションで Edit rules and zones をクリックします。
  3. Add services をクリックします。
  4. Filter services フィールドに wireguard と入力します。
  5. リストから wireguard エントリーを選択します。

  6. Add services をクリックします。
  7. クライアントがすべてのトラフィックをトンネル経由でルーティングし、WireGuard サーバーをデフォルトゲートウェイとして使用する場合は、public ゾーンのマスカレードを有効にします。

    # firewall-cmd --permanent --zone=public --add-masquerade
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

    Web コンソールでは Firewalld ゾーンのマスカレードを有効にすることはできないことに注意してください。

検証

  1. 画面左側のナビゲーションで Networking タブを選択します。
  2. Firewall セクションで Edit rules and zones をクリックします。
  3. リストに wireguard サービスのエントリーが含まれており、WireGuard 接続プロファイルで設定した UDP ポートが表示されます。
  4. firewalldpublic ゾーンでマスカレードが有効になっていることを確認するために、次のように入力します。

    # firewall-cmd --list-all --zone=public
    public (active)
      ...
      services: ... wireguard
      ports:
      forward: yes
      masquerade: yes
      ...
    Copy to Clipboard Toggle word wrap

7.10. nmcli を使用した WireGuard クライアントの設定

NetworkManager で接続プロファイルを作成することで、WireGuard クライアントを設定できます。この方法を使用して、NetworkManager に WireGuard 接続を管理させます。

この手順では、次の設定を前提としています。

  • クライアント:

    • 秘密鍵: aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
    • トンネル IPv4 アドレス: 192.0.2.2/24
    • トンネル IPv6 アドレス: 2001:db8:1::2/32
  • サーバー

    • 公開鍵: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    • トンネル IPv4 アドレス: 192.0.2.1/24
    • トンネル IPv6 アドレス: 2001:db8:1::1/32

前提条件

  • サーバーとクライアントの両方に公開鍵と秘密鍵を生成している。
  • 以下の情報を把握している。

    • クライアントの秘密鍵
    • クライアントの静的トンネルの IP アドレスとサブネットマスク
    • サーバーの公開鍵
    • サーバーの静的トンネル IP アドレスおよびサブネットマスク

手順

  1. NetworkManager WireGuard 接続プロファイルを追加します。

    # nmcli connection add type wireguard con-name client-wg0 ifname wg0
    Copy to Clipboard Toggle word wrap

    client-wg0 という名前のプロファイルを作成し、そのプロファイルに仮想インターフェイス wg0 を割り当てます。

  2. オプション: NetworkManager が client-wg 接続を自動的に起動しないように設定します。

    # nmcli connection modify client-wg0 autoconnect no
    Copy to Clipboard Toggle word wrap
  3. クライアントのトンネル IPv4 アドレスとサブネットマスクを設定します。

    # nmcli connection modify client-wg0 ipv4.method manual ipv4.addresses 192.0.2.2/24
    Copy to Clipboard Toggle word wrap
  4. クライアントのトンネル IPv6 アドレスとサブネットマスクを設定します。

    # nmcli connection modify client-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::2/32
    Copy to Clipboard Toggle word wrap
  5. すべてのトラフィックをトンネル経由でルーティングする場合は、サーバーのトンネル IP アドレスをデフォルトゲートウェイとして設定します。

    # nmcli connection modify client-wg0 ipv4.gateway 192.0.2.1 ipv6.gateway 2001:db8:1::1
    Copy to Clipboard Toggle word wrap

    すべてのトラフィックをトンネル経由でルーティングするには、後の手順で、このクライアントの allowed-ips0.0.0.0/0;::/0 に設定する必要があります。

    すべてのトラフィックをトンネル経由でルーティングすると、サーバーのルーティングとファイアウォールの設定によっては他のホストへの接続に影響が及ぶ可能性があることに注意してください。

  6. クライアントの秘密鍵を接続プロファイルに追加します。

    # nmcli connection modify client-wg0 wireguard.private-key "aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A="
    Copy to Clipboard Toggle word wrap
  7. このクライアントとの通信を許可するサーバーごとにピア設定を追加します。これらの設定は手動で追加する必要があります。nmcli ユーティリティーでは、対応する接続プロパティーの設定をサポートしていないためです。

    1. /etc/NetworkManager/system-connections/client-wg0.nmconnection ファイルを編集し、以下を追加します。

      [wireguard-peer.UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=]
      endpoint=server.example.com:51820
      allowed-ips=192.0.2.1;2001:db8:1::1;
      persistent-keepalive=20
      Copy to Clipboard Toggle word wrap
      • [wireguard-peer.<public_key_of_the_server>] エントリーは、サーバーのピアセクションを定義します。セクション名には、サーバーの公開鍵が含まれます。
      • endpoint パラメーターは、サーバーのホスト名または IP アドレスとポートを設定します。クライアントはこの情報を使用して接続を確立します。
      • allowed-ips パラメーターは、このクライアントにデータを送信できる IP アドレスのリストを設定します。たとえば、このパラメーターを次のように設定します。

        • サーバーのトンネル IP アドレスに設定すると、そのサーバーのみがこのクライアントと通信できるようになります。上記の例の値を使用すると、そのように設定されます。
        • 0.0.0.0/0;::/0; に設定すると、リモートの IPv4 アドレスおよび IPv6 アドレスがこのクライアントと通信できるようになります。この設定を使用して、すべてのトラフィックをトンネル経由でルーティングし、WireGuard サーバーをデフォルトゲートウェイとして使用します。
      • オプションの persistent-keepalive パラメーターは、WireGuard がサーバーにキープアライブパケットを送信する間隔を秒単位で定義します。ネットワークアドレス変換 (NAT) を使用するネットワークでクライアントを使用する場合、またはしばらく非アクティブにした後にファイアウォールが UDP 接続を閉じる場合は、このパラメーターを設定します。
    2. client-wg0 接続プロファイルをリロードします。

      # nmcli connection load /etc/NetworkManager/system-connections/client-wg0.nmconnection
      Copy to Clipboard Toggle word wrap
  8. client-wg0 接続を再アクティブ化します。

    # nmcli connection up client-wg0
    Copy to Clipboard Toggle word wrap
  9. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. サーバーの IP アドレスの ping を実行します。

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
    Copy to Clipboard Toggle word wrap
  2. wg0 デバイスのインターフェイス設定を表示します。

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds
    Copy to Clipboard Toggle word wrap

    出力に秘密鍵を表示するには、WG_HIDE_KEYS=never wg show wg0 コマンドを使用します。

    VPN トンネルを介してトラフィックを送信している場合は、latest handshake エントリーと transfer エントリーのみが含まれることに注意してください。

  3. wg0 デバイスの IP 設定を表示します。

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

7.11. nmtui を使用した WireGuard クライアントの設定

NetworkManager で接続プロファイルを作成することで、WireGuard クライアントを設定できます。この方法を使用して、NetworkManager に WireGuard 接続を管理させます。

この手順では、次の設定を前提としています。

  • クライアント:

    • 秘密鍵: aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
    • トンネル IPv4 アドレス: 192.0.2.2/24
    • トンネル IPv6 アドレス: 2001:db8:1::2/32
  • サーバー

    • 公開鍵: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    • トンネル IPv4 アドレス: 192.0.2.1/24
    • トンネル IPv6 アドレス: 2001:db8:1::1/32

前提条件

  • サーバーとクライアントの両方に公開鍵と秘密鍵を生成している。
  • 以下の情報を把握している。

    • クライアントの秘密鍵
    • クライアントの静的トンネルの IP アドレスとサブネットマスク
    • サーバーの公開鍵
    • サーバーの静的トンネル IP アドレスおよびサブネットマスク
  • NetworkManager-tui パッケージをインストールしました

手順

  1. nmtui アプリケーションを開始します。

    # nmtui
    Copy to Clipboard Toggle word wrap
  2. Edit a connection を選択し、Enter を押します。
  3. Add を選択し、Enter を押します。
  4. リストから WireGuard 接続タイプを選択し、Enter を押します。
  5. Edit connection ウィンドウで:

    1. NetworkManager が接続に割り当てる仮想インターフェイス (wg0 など) の接続名を入力します。
    2. クライアントの秘密鍵を入力します。

    3. Peers ペインの横にある Add をクリックします。

      1. サーバーの公開鍵を入力します。
      2. Allowed IPs フィールドを設定します。たとえば、次のように設定します。

        • サーバーのトンネル IP アドレスに設定すると、そのサーバーのみがこのクライアントと通信できるようになります。
        • リモートの IPv4 アドレスおよび IPv6 アドレスが、このクライアントと通信できるように許可する 0.0.0.0/0,::/0この設定を使用して、すべてのトラフィックをトンネル経由でルーティングし、WireGuard サーバーをデフォルトゲートウェイとして使用します。
      3. Endpoint フィールドに、WireGuard サーバーのホスト名または IP アドレスとポートを入力します。<hostname_or_IP>:<port_number> という形式を使用します。
      4. オプション: ネットワークアドレス変換 (NAT) を使用するネットワークでクライアントを使用するか、またはしばらく非アクティブにした後にファイアウォールが UDP 接続を閉じる場合は、永続的なキープアライブの間隔を秒単位で設定します。この間隔で、クライアントは、キープアライブパケットをサーバーに送信します。
      5. OK を選択し、Enter を押します。

    4. IPv4 Configuration の横にある Show を選択し、Enter を押します。

      1. IPv4 設定方法 Manual を選択します。
      2. トンネルの IPv4 アドレスとサブネットマスクを入力します。Gateway フィールドは空のままにします。
    5. IPv6 Configuration の横にある Show を選択し、Enter を押します。

      1. IPv6 設定方法 Manual を選択します。
      2. トンネルの IPv6 アドレスとサブネットマスクを入力します。Gateway フィールドは空のままにします。
    6. オプション: Automatically connect を選択します。
    7. OK を選択し、Enter を押します

  6. 接続のリストが表示されたウィンドウで、Back を選択し、Enter を押します。
  7. NetworkManager TUI のメインウィンドウで、Quit を選択し、Enter を押します。
  8. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. サーバーの IP アドレスの ping を実行します。

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
    Copy to Clipboard Toggle word wrap
  2. wg0 デバイスのインターフェイス設定を表示します。

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820_
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds
    Copy to Clipboard Toggle word wrap

    出力に秘密鍵を表示するには、WG_HIDE_KEYS=never wg show wg0 コマンドを使用します。

    VPN トンネルを介してトラフィックをすでに送信している場合は、latest handshake エントリーと transfer エントリーのみが出力に含まれることに注意してください。

  3. wg0 デバイスの IP 設定を表示します。

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

7.12. RHEL Web コンソールを使用した WireGuard クライアントの設定

ブラウザーベースの RHEL Web コンソールを使用して、WireGuard クライアントを設定できます。この方法を使用して、NetworkManager に WireGuard 接続を管理させます。

前提条件

  • RHEL Web コンソールにログインしています。
  • 以下の情報を把握している。

    • サーバーとクライアントの両方の静的トンネル IP アドレスとサブネットマスク
    • サーバーの公開鍵

手順

  1. 画面左側のナビゲーションで Networking タブを選択します。
  2. Interfaces セクションで Add VPN をクリックします。
  3. wireguard-tools および systemd-resolved パッケージがまだインストールされていない場合は、Web コンソールにその旨の通知が表示されます。これらのパッケージをインストールするには、Install をクリックします。
  4. 作成する WireGuard デバイスの名前を入力します。
  5. このホストの鍵ペアを設定します。

    • Web コンソールによって作成された鍵を使用する場合は、次の手順を実行します。

      1. Private key エリアで、事前に選択済みの Generated オプションをそのままにします。
      2. Public key の値をメモします。クライアントを設定するときにこの情報が必要になります。
    • 既存の秘密鍵を使用する場合は、次の手順を実行します。

      1. Private key エリアで Paste existing key を選択します。
      2. 秘密鍵をテキストフィールドに貼り付けます。Web コンソールにより対応する公開鍵が自動的に計算されます。
  6. Listen port フィールドの 0 値をそのまま使用します。
  7. クライアントのトンネル IPv4 アドレスとサブネットマスクを設定します。

    IPv6 アドレスも設定するには、接続を作成した後に編集する必要があります。

  8. このクライアントとの通信を許可するサーバーのピア設定を追加します。

    1. Add peer をクリックします。
    2. サーバーの公開鍵を入力します。
    3. Endpoint フィールドにサーバーのホスト名または IP アドレスとポートを設定します (例: server.example.com:51820)。クライアントはこの情報を使用して接続を確立します。
    4. Allowed IPs フィールドに、このサーバーへのデータ送信を許可するクライアントのトンネル IP アドレスを設定します。たとえば、フィールドを次のいずれかに設定します。

      • サーバーのトンネル IP アドレスに設定すると、そのサーバーのみがこのクライアントと通信できるようになります。以下のスクリーンキャプチャーの値を使用すると、そのように設定されます。
      • 0.0.0.0/0 に設定すると、リモートの IPv4 アドレスがこのクライアントと通信できるようになります。この設定を使用して、すべてのトラフィックをトンネル経由でルーティングし、WireGuard サーバーをデフォルトゲートウェイとして使用します。
  9. Add をクリックして WireGuard 接続を作成します。
  10. トンネル IPv6 アドレスも設定する場合は、次の手順を実行します。

    1. Interfaces セクションで WireGuard 接続の名前をクリックします。
    2. IPv6 の横にある edit をクリックします。
    3. Addresses フィールドを Manual に設定し、クライアントのトンネル IPv6 アドレスと接頭辞を入力します。
    4. Save をクリックします。
  11. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. サーバーの IP アドレスの ping を実行します。

    # ping 192.0.2.1
    Copy to Clipboard Toggle word wrap

    トンネル経由でトラフィックを送信しようとすると、WireGuard が接続を確立します。

  2. wg0 デバイスのインターフェイス設定を表示します。

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 45513
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds
    Copy to Clipboard Toggle word wrap

    出力に秘密鍵を表示するには、WG_HIDE_KEYS=never wg show wg0 コマンドを使用します。

    VPN トンネルを介してトラフィックを送信している場合は、latest handshake エントリーと transfer エントリーのみが含まれることに注意してください。

  3. wg0 デバイスの IP 設定を表示します。

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWERUP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

7.13. 接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる

DHCP サーバーとステートレスアドレス自動設定 (SLAAC) はどちらも、クライアントのルーティングテーブルにルートを追加できます。悪意のある DHCP サーバーがこの機能を使用すると、たとえば、VPN 接続を使用するホストに対して、VPN トンネルではなく物理インターフェイス経由でトラフィックをリダイレクトするように強制できます。この脆弱性は TunnelVision とも呼ばれ、CVE-2024-3661 の脆弱性に関する記事で説明されています。

この脆弱性を軽減するために、VPN 接続を専用のルーティングテーブルに割り当てることができます。これを行うと、DHCP 設定または SLAAC が、VPN トンネル宛のネットワークパケットに関するルーティング決定を操作できなくなります。

次の条件が 1 つ以上環境に当てはまる場合は、この手順を実行してください。

  • 少なくとも 1 つのネットワークインターフェイスが DHCP または SLAAC を使用している。
  • ネットワークで、不正な DHCP サーバーを防ぐ DHCP スヌーピングなどのメカニズムが使用されていない。
重要

トラフィック全体を VPN 経由でルーティングすると、ホストがローカルネットワークリソースにアクセスできなくなります。

手順

  1. 使用するルーティングテーブルを決定します。次の手順ではテーブル 75 を使用します。デフォルトでは、RHEL はテーブル 1 - 254 を使用しないため、それらのテーブルのうちどれでも使用できます。
  2. VPN ルートを専用のルーティングテーブルに割り当てるように VPN 接続プロファイルを設定します。

    # nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
    Copy to Clipboard Toggle word wrap
  3. 上記のコマンドで使用したテーブルに低い優先度値を設定します。

    # nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
    Copy to Clipboard Toggle word wrap

    優先度の値は 1 - 32766 の範囲で指定できます。値が低いほど、優先度が高くなります。

  4. VPN 接続を再接続します。

    # nmcli connection down <vpn_connection_profile>
    # nmcli connection up <vpn_connection_profile>
    Copy to Clipboard Toggle word wrap

検証

  1. テーブル 75 の IPv4 ルートを表示します。

    # ip route show table 75
    ...
    192.0.2.0/24 via 192.0.2.254 dev vpn_device proto static metric 50
    default dev vpn_device proto static scope link metric 50
    Copy to Clipboard Toggle word wrap

    この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 75 に割り当てられており、すべてのトラフィックがトンネルを介してルーティングされることを確認できます。VPN 接続プロファイルで ipv4.never-default true を設定すると、デフォルトルートが作成されず、この出力には表示されません。

  2. テーブル 75 の IPv6 ルートを表示します。

    # ip -6 route show table 75
    ...
    2001:db8:1::/64 dev vpn_device proto kernel metric 50 pref medium
    default dev vpn_device proto static metric 50 pref medium
    Copy to Clipboard Toggle word wrap

    この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 75 に割り当てられており、すべてのトラフィックがトンネルを介してルーティングされることを確認できます。VPN 接続プロファイルで ipv6.never-default true を設定すると、デフォルトルートが作成されず、この出力には表示されません。

第8章 IP トンネルの設定

VPN と同様に、IP トンネルは、インターネットなどの 3 番目のネットワークを介して 2 つのネットワークを直接接続します。ただし、すべてのトンネルプロトコルが暗号化に対応しているわけではありません。

トンネルを確立する両方のネットワークのルーターには、最低でも 2 つのインターフェイスが必要です。

  • ローカルネットワークに接続されているインターフェイス 1 つ
  • トンネルが確立されたネットワークに接続されたインターフェイス 1 つ。

トンネルを確立するには、リモートサブネットから IP アドレスを使用して、両方のルーターに仮想インターフェイスを作成します。

NetworkManager は、以下の IP トンネルに対応します。

  • GRE (Generic Routing Encapsulation)
  • IP6GRE (Generic Routing Encapsulation over IPv6)
  • GRETAP (Generic Routing Encapsulation Terminal Access Point)
  • IP6GRETAP (Generic Routing Encapsulation Terminal Access Point over IPv6)
  • IPIP (IPv4 over IPv4)
  • IPIP6 (IPv4 over IPv6)
  • IP6IP6 (IPv6 over IPv6)
  • SIT (Simple Internet Transition)

このトンネルは、タイプに応じて、OSI (Open Systems Interconnection) モデルのレイヤー 2 または 3 で動作します。

8.1. IPv4 トラフィックを IPv4 パケットにカプセル化するための IPIP トンネルの設定

IP over IP (IPIP) トンネルは、RFC 2003 で説明されているように、OSI レイヤー 3 で動作し、IPv4 トラフィックを IPv4 パケットにカプセル化します。

重要

IPIP トンネルを介して送信されるデータは暗号化されません。セキュリティー上の理由から、すでに暗号化されたデータにはトンネルを使用してください (HTTPS などの他のプロトコル)。

IPIP トンネルはユニキャストパケットのみをサポートすることに注意してください。マルチキャストをサポートする IPv4 トンネルが必要な場合は、nmcli を使用した GRE トンネルを設定して IPv4 パケット内のレイヤー 3 トラフィックをカプセル化 を参照します。

たとえば、以下の図に示すように、2 つの RHEL ルーター間で IPIP トンネルを作成し、インターネット経由で 2 つの内部サブネットに接続できます。

前提条件

  • 各 RHEL ルーターには、ローカルサブネットに接続されているネットワークインターフェイスがあります。
  • 各 RHEL ルーターには、インターネットに接続しているネットワークインターフェイスがあります。
  • トンネル経由で送信するトラフィックは IPv4 ユニキャストです。

手順

  1. ネットワーク A の RHEL ルーターで、次のコマンドを実行します。

    1. tun0 という名前の IPIP トンネルインターフェイスを作成します。

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 198.51.100.5 local 203.0.113.10
      Copy to Clipboard Toggle word wrap

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

    2. IPv4 アドレスを tun0 デバイスに設定します。

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'
      Copy to Clipboard Toggle word wrap

      トンネルには、2 つの使用可能な IP アドレスを持つ /30 サブネットで十分であることに注意してください。

    3. IPv4 設定を使用するように手動で tun0 接続を設定します。

      # nmcli connection modify tun0 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    4. トラフィックを 172.16.0.0/24 ネットワークにルーティングする静的ルートをルーター B のトンネル IP に追加します。

      # nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
      Copy to Clipboard Toggle word wrap
    5. tun0 接続を有効にします。

      # nmcli connection up tun0
      Copy to Clipboard Toggle word wrap
    6. パケット転送を有効にします。

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
      Copy to Clipboard Toggle word wrap
  2. ネットワーク B の RHEL ルーターで、次のコマンドを実行します。

    1. tun0 という名前の IPIP トンネルインターフェイスを作成します。

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 203.0.113.10 local 198.51.100.5
      Copy to Clipboard Toggle word wrap

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

    2. IPv4 アドレスを tun0 デバイスに設定します。

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
      Copy to Clipboard Toggle word wrap
    3. IPv4 設定を使用するように手動で tun0 接続を設定します。

      # nmcli connection modify tun0 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    4. トラフィックを 192.0.2.0/24 ネットワークにルーティングする静的ルートをルーター A のトンネル IP に追加します。

      # nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
      Copy to Clipboard Toggle word wrap
    5. tun0 接続を有効にします。

      # nmcli connection up tun0
      Copy to Clipboard Toggle word wrap
    6. パケット転送を有効にします。

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
      Copy to Clipboard Toggle word wrap

検証

  • 各 RHEL ルーターから、他のルーターの内部インターフェイスの IP アドレスに ping します。

    1. ルーター A で 172.16.0.1 に ping します。

      # ping 172.16.0.1
      Copy to Clipboard Toggle word wrap
    2. ルーター B で 192.0.2.1 に ping します。

      # ping 192.0.2.1
      Copy to Clipboard Toggle word wrap

8.2. レイヤー 3 トラフィックを IPv4 パケットにカプセル化するための GRE トンネルの設定

Generic Routing Encapsulation (GRE) トンネルは、RFC 2784 で説明されているように、レイヤー 3 トラフィックを IPv4 パケットにカプセル化します。GRE トンネルは、有効なイーサネットタイプで任意のレイヤー 3 プロトコルをカプセル化できます。

重要

GRE トンネルを介して送信されるデータは暗号化されません。セキュリティー上の理由から、すでに暗号化されたデータにはトンネルを使用してください (HTTPS などの他のプロトコル)。

たとえば、以下の図に示すように、2 つの RHEL ルーター間で GRE トンネルを作成し、インターネット経由で 2 つの内部サブネットに接続できます。

前提条件

  • 各 RHEL ルーターには、ローカルサブネットに接続されているネットワークインターフェイスがあります。
  • 各 RHEL ルーターには、インターネットに接続しているネットワークインターフェイスがあります。

手順

  1. ネットワーク A の RHEL ルーターで、次のコマンドを実行します。

    1. gre1 という名前の GRE トンネルインターフェイスを作成します。

      # nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 198.51.100.5 local 203.0.113.10
      Copy to Clipboard Toggle word wrap

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

      重要

      gre0 デバイス名は予約されています。デバイスに gre1 または別の名前を使用します。

    2. IPv4 アドレスを gre1 デバイスに設定します。

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'
      Copy to Clipboard Toggle word wrap

      トンネルには、2 つの使用可能な IP アドレスを持つ /30 サブネットで十分であることに注意してください。

    3. 手動の IPv4 設定を使用するように gre1 接続を設定します。

      # nmcli connection modify gre1 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    4. トラフィックを 172.16.0.0/24 ネットワークにルーティングする静的ルートをルーター B のトンネル IP に追加します。

      # nmcli connection modify gre1 +ipv4.routes "172.16.0.0/24 10.0.1.2"
      Copy to Clipboard Toggle word wrap
    5. gre1 コネクションを有効にします。

      # nmcli connection up gre1
      Copy to Clipboard Toggle word wrap
    6. パケット転送を有効にします。

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
      Copy to Clipboard Toggle word wrap
  2. ネットワーク B の RHEL ルーターで、次のコマンドを実行します。

    1. gre1 という名前の GRE トンネルインターフェイスを作成します。

      # nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 203.0.113.10 local 198.51.100.5
      Copy to Clipboard Toggle word wrap

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

    2. IPv4 アドレスを gre1 デバイスに設定します。

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
      Copy to Clipboard Toggle word wrap
    3. 手動の IPv4 設定を使用するように gre1 接続を設定します。

      # nmcli connection modify gre1 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    4. トラフィックを 192.0.2.0/24 ネットワークにルーティングする静的ルートをルーター A のトンネル IP に追加します。

      # nmcli connection modify gre1 +ipv4.routes "192.0.2.0/24 10.0.1.1"
      Copy to Clipboard Toggle word wrap
    5. gre1 コネクションを有効にします。

      # nmcli connection up gre1
      Copy to Clipboard Toggle word wrap
    6. パケット転送を有効にします。

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
      Copy to Clipboard Toggle word wrap

検証

  1. 各 RHEL ルーターから、他のルーターの内部インターフェイスの IP アドレスに ping します。

    1. ルーター A で 172.16.0.1 に ping します。

      # ping 172.16.0.1
      Copy to Clipboard Toggle word wrap
    2. ルーター B で 192.0.2.1 に ping します。

      # ping 192.0.2.1
      Copy to Clipboard Toggle word wrap

8.3. IPv4 でイーサネットフレームを転送するための GRETAP トンネルの設定

GRETAP (Generic Routing Encapsulation Terminal Access Point) トンネルは OSI レベル 2 で動作し、RFC 2784 で説明されているように IPv4 パケットのイーサネットトラフィックをカプセル化します。

重要

GRETAP トンネルを介して送信されるデータは暗号化されません。セキュリティー上の理由から、VPN または別の暗号化された接続にトンネルを確立します。

たとえば、以下の図に示すように、2 つの RHEL ルーター間で GRETAP トンネルを作成し、ブリッジを使用して 2 つのネットワークに接続します。

前提条件

  • 各 RHEL ルーターには、ローカルネットワークに接続されたネットワークインターフェイスがあり、IP 設定は割り当てられません。
  • 各 RHEL ルーターには、インターネットに接続しているネットワークインターフェイスがあります。

手順

  1. ネットワーク A の RHEL ルーターで、次のコマンドを実行します。

    1. bridge0 という名前のブリッジインターフェイスを作成します。

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
      Copy to Clipboard Toggle word wrap
    2. ブリッジの IP 設定を設定します。

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bridge0 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    3. ローカルネットワークに接続されたインターフェイス用の新しい接続プロファイルをブリッジに追加します。

      # nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
      Copy to Clipboard Toggle word wrap
    4. GRETAP トンネルインターフェイスの新しい接続プロファイルをブリッジに追加します。

      # nmcli connection add type ip-tunnel ip-tunnel.mode gretap port-type bridge con-name bridge0-port2 ifname gretap1 remote 198.51.100.5 local 203.0.113.10 controller bridge0
      Copy to Clipboard Toggle word wrap

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

      重要

      gretap0 デバイス名が予約されています。デバイスに gretap1 または別の名前を使用します。

    5. 必要に応じて、STP (Spanning Tree Protocol) を無効にする必要がない場合は、これを無効にします。

      # nmcli connection modify bridge0 bridge.stp no
      Copy to Clipboard Toggle word wrap

      デフォルトでは、STP は有効になり、接続を使用する前に遅延が生じます。

    6. bridge0 接続がアクティベートするように、ブリッジのポートが自動的にアクティブになるようにします。

      # nmcli connection modify bridge0 connection.autoconnect-ports 1
      Copy to Clipboard Toggle word wrap
    7. bridge0 接続をアクティブにします。

      # nmcli connection up bridge0
      Copy to Clipboard Toggle word wrap
  2. ネットワーク B の RHEL ルーターで、次のコマンドを実行します。

    1. bridge0 という名前のブリッジインターフェイスを作成します。

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
      Copy to Clipboard Toggle word wrap
    2. ブリッジの IP 設定を設定します。

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24'
      # nmcli connection modify bridge0 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    3. ローカルネットワークに接続されたインターフェイス用の新しい接続プロファイルをブリッジに追加します。

      # nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
      Copy to Clipboard Toggle word wrap
    4. GRETAP トンネルインターフェイスの新しい接続プロファイルをブリッジに追加します。

      # nmcli connection add type ip-tunnel ip-tunnel.mode gretap port-type bridge con-name bridge0-port2 ifname gretap1 remote 203.0.113.10 local 198.51.100.5 controller bridge0
      Copy to Clipboard Toggle word wrap

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

    5. 必要に応じて、STP (Spanning Tree Protocol) を無効にする必要がない場合は、これを無効にします。

      # nmcli connection modify bridge0 bridge.stp no
      Copy to Clipboard Toggle word wrap
    6. bridge0 接続がアクティベートするように、ブリッジのポートが自動的にアクティブになるようにします。

      # nmcli connection modify bridge0 connection.autoconnect-ports 1
      Copy to Clipboard Toggle word wrap
    7. bridge0 接続をアクティブにします。

      # nmcli connection up bridge0
      Copy to Clipboard Toggle word wrap

検証

  1. 両方のルーターで、enp1s0 接続および gretap1 接続が接続され、CONNECTION 列にポートの接続名が表示されていることを確認します。

    # nmcli device
    nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    bridge0  bridge    connected  bridge0
    enp1s0   ethernet  connected  bridge0-port1
    gretap1  iptunnel  connected  bridge0-port2
    Copy to Clipboard Toggle word wrap
  2. 各 RHEL ルーターから、他のルーターの内部インターフェイスの IP アドレスに ping します。

    1. ルーター A で 192.0.2.2 に ping します。

      # ping 192.0.2.2
      Copy to Clipboard Toggle word wrap
    2. ルーター B で 192.0.2.1 に ping します。

      # ping 192.0.2.1
      Copy to Clipboard Toggle word wrap

第9章 Wi-Fi 接続の管理

RHEL には、Wi-Fi ネットワークを設定して接続するための複数のユーティリティーとアプリケーションが用意されています。次に例を示します。

  • nmcli ユーティリティーを使用して、コマンドラインで接続を設定する。
  • nmtui アプリケーションを使用して、テキストベースのユーザーインターフェイスで接続を設定する。
  • GNOME Settings アプリケーションを使用して、GNOME アプリケーションで接続を設定する。
  • network RHEL システムロールを使用して、1 つまたは複数のホストでの接続の設定を自動化する。

9.1. サポートされている Wi-Fi セキュリティータイプ

Wi-Fi ネットワークがサポートするセキュリティータイプにより、データ送信の安全度は異なります。

警告

暗号化を使用しない、または安全でない WPA 標準のみをサポートする Wi-Fi ネットワークには接続しないでください。

Red Hat Enterprise Linux は、以下の Wi-Fi セキュリティータイプをサポートします。

  • None: 暗号化は無効になり、ネットワーク経由でプレーンテキスト形式でデータが転送されます。
  • Enhanced Open: opportunistic wireless encryption (OWE) を使用すると、デバイスは一意のペアワイズマスターキー (PMK) をネゴシエートして、認証なしでワイヤレスネットワークの接続を暗号化します。
  • LEAP: Cisco が開発した Lightweight Extensible Authentication Protocol は、拡張認証プロトコル (EAP) の独自バージョンです。
  • WPA & WPA2 Personal: パーソナルモードでは、Wi-Fi Protected Access (WPA) および Wi-Fi Protected Access 2 (WPA2) 認証方法で事前共有キーが使用されます。
  • WPA & WPA2 Enterprise: エンタープライズモードでは、WPA と WPA2 は EAP フレームワークを使用し、Remote Authentication Dial-In User Service (RADIUS) サーバーに対してユーザーを認証します。
  • WPA3 Personal: Wi-Fi Protected Access 3 (WPA3) Personal は、辞書攻撃を防ぐために pre-shared keys (PSK) の代わりに simultaneous authentication of equals (SAE) を使用します。WPA3 では、Perfect Forward Secrecy (PFS) が使用されます。

9.2. nmcli を使用した Wi-Fi ネットワークへの接続

nmcli ユーティリティーを使用して、Wi-Fi ネットワークに接続できます。初めてネットワークに接続しようとすると、ユーティリティーは NetworkManager 接続プロファイルを自動的に作成します。ネットワークに静的 IP アドレスなどの追加設定が必要な場合は、プロファイルが自動的に作成された後にプロファイルを変更できます。

前提条件

  • ホストに Wi-Fi デバイスがインストールされている。
  • Wi-Fi デバイスが有効になっている。確認するには、nmcli radio コマンドを使用します。

手順

  1. NetworkManager で Wi-Fi 無線が無効になっている場合は、この機能を有効にします。

    # nmcli radio wifi on
    Copy to Clipboard Toggle word wrap
  2. オプション: 利用可能な Wi-Fi ネットワークを表示します。

    # nmcli device wifi list
    IN-USE  BSSID              SSID          MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
            00:53:00:2F:3B:08  Office        Infra  44    270 Mbit/s  57      ▂▄▆_  WPA2 WPA3
            00:53:00:15:03:BF  --            Infra  1     130 Mbit/s  48      ▂▄__  WPA2 WPA3
    Copy to Clipboard Toggle word wrap

    サービスセット識別子 (SSID) 列には、ネットワークの名前が含まれています。列に -- が表示されている場合、このネットワークのアクセスポイントは SSID をブロードキャストしていません。

  3. Wi-Fi ネットワークに接続します。

    # nmcli device wifi connect Office --ask
    Password: wifi-password
    Copy to Clipboard Toggle word wrap

    対話的に入力するのではなく、コマンドでパスワードを設定する場合は、コマンドで --ask の代わりに password <wifi_password> オプションを使用します。

    # nmcli device wifi connect Office password <wifi_password>
    Copy to Clipboard Toggle word wrap

    ネットワークが静的 IP アドレスを必要とする場合、NetworkManager はこの時点で接続のアクティブ化に失敗することに注意してください。後の手順で IP アドレスを設定できます。

  4. ネットワークに静的 IP アドレスが必要な場合:

    1. IPv4 アドレス設定を設定します。次に例を示します。

      # nmcli connection modify Office ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
      Copy to Clipboard Toggle word wrap
    2. IPv6 アドレス設定を設定します。次に例を示します。

      # nmcli connection modify Office ipv6.method manual ipv6.addresses 2001:db8:1::1/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
      Copy to Clipboard Toggle word wrap
  5. 接続を再度有効にします。

    # nmcli connection up Office
    Copy to Clipboard Toggle word wrap

検証

  1. アクティブな接続を表示します。

    # nmcli connection show --active
    NAME    ID                                    TYPE  DEVICE
    Office  2501eb7e-7b16-4dc6-97ef-7cc460139a58  wifi  wlp0s20f3
    Copy to Clipboard Toggle word wrap

    作成した Wi-Fi 接続が出力にリストされている場合、その接続はアクティブです。

  2. ホスト名または IP アドレスに ping を実行します。

    # ping -c 3 example.com
    Copy to Clipboard Toggle word wrap

9.3. GNOME Settings を使用した Wi-Fi ネットワークへの接続

GNOME Settings アプリケーション (gnome-control-center とも呼ばれます) を使用して、Wi-Fi ネットワークに接続し、接続を設定できます。初めてネットワークに接続するとき、GNOME は NetworkManager 接続プロファイルを作成します。

GNOME Settings では、RHEL がサポートするすべての Wi-Fi ネットワークセキュリティータイプの Wi-Fi 接続を設定できます。

前提条件

  • ホストに Wi-Fi デバイスがインストールされている。
  • Wi-Fi デバイスが有効になっている。確認するには、nmcli radio コマンドを使用します。

手順

  1. Super キーを押し、Wi-Fi と入力して Enter を押します。
  2. 接続したい Wi-Fi ネットワークの名前をクリックします。
  3. ネットワークのパスワードを入力し、Connect をクリックします。
  4. 静的 IP アドレスや WPA2 パーソナル以外のセキュリティータイプなど、ネットワークに追加の設定が必要な場合:

    1. ネットワーク名の横にある歯車のアイコンをクリックします。
    2. オプション: Details タブでネットワークプロファイルを設定して、自動的に接続しないようにします。

      この機能を無効にした場合は、GNOME Settings や GNOME システムメニューなどを使用して、常に手動でネットワークに接続する必要があります。

    3. IPv4 タブで IPv4 設定を設定し、IPv6 タブで IPv6 設定を設定します。
    4. Security タブで、ネットワークの認証 (WPA3 Personal など) を選択し、パスワードを入力します。

      選択したセキュリティーに応じて、アプリケーションは追加のフィールドを表示します。それに応じてそれらを埋めます。詳細は、Wi-Fi ネットワークの管理者におたずねください。

    5. Apply をクリックします。

検証

  1. トップバーの右側にあるシステムメニューを開き、Wi-Fi ネットワークが接続されていることを確認します。

    ネットワークがリストに表示されていれば、接続されています。

  2. ホスト名または IP アドレスに ping を実行します。

    # ping -c 3 example.com
    Copy to Clipboard Toggle word wrap

9.4. nmtui を使用した Wi-Fi 接続の設定

nmtui アプリケーションは、NetworkManager 用のテキストベースのユーザーインターフェイスを提供します。nmtui を使用して Wi-Fi ネットワークに接続できます。

注記

nmtui で以下を行います。

  • カーソルキーを使用してナビゲートします。
  • ボタンを選択して Enter を押します。
  • Space を使用してチェックボックスをオンまたはオフにします。
  • 前の画面に戻るには、ESC を使用します。

手順

  1. nmtui を開始します。

    # nmtui
    Copy to Clipboard Toggle word wrap
  2. Edit a connection を選択し、Enter を押します。
  3. Add ボタンを押します。
  4. ネットワークタイプのリストから Wi-Fi を選択し、Enter を押します。
  5. オプション: 作成する NetworkManager プロファイルの名前を入力します。

    ホストに複数のプロファイルがある場合は、わかりやすい名前を付けると、プロファイルの目的を識別しやすくなります。

  6. Wi-Fi ネットワークの名前である Service Set Identifier (SSID) を SSID フィールドに入力します。
  7. Mode フィールドはデフォルトの Client のままにします。
  8. Security フィールドを選択して Enter を押し、リストからネットワークの認証タイプを設定します。

    選択した認証タイプに応じて、nmtui は異なるフィールドを表示します。

  9. 認証タイプ関連のフィールドに入力します。
  10. Wi-Fi ネットワークに静的 IP アドレスが必要な場合:

    1. プロトコルの横にある Automatic ボタンを押し、表示されたリストから Manual を選択します。
    2. 設定するプロトコルの横にある Show ボタンを押して、追加のフィールドを表示し、それらに入力します。
  11. OK ボタンを押して、新しい接続を作成し、自動的にアクティブにします。

  12. Back ボタンを押してメインメニューに戻ります。
  13. Quit を選択し、Enter キーを押して nmtui アプリケーションを閉じます。

検証

  1. nmtui を開きます。

    # nmcli connection show --active
    NAME    ID                                    TYPE  DEVICE
    Office  2501eb7e-7b16-4dc6-97ef-7cc460139a58  wifi  wlp0s20f3
    Copy to Clipboard Toggle word wrap

    作成した Wi-Fi 接続が出力にリストされている場合、その接続はアクティブです。

  2. ホスト名または IP アドレスに ping を実行します。

    # ping -c 3 example.com
    Copy to Clipboard Toggle word wrap

9.5. nmcli を使用した既存のプロファイルでの 802.1X ネットワーク認証による Wi-Fi 接続の設定

nmcli ユーティリティーを使用して、クライアントがネットワークに対して自己認証するように設定できます。たとえば、wlp1s0 という名前の既存の NetworkManager Wi-Fi 接続プロファイルで、MSCHAPv2 (Microsoft Challenge-Handshake Authentication Protocol version 2) を使用する PEAP (Protected Extensible Authentication Protocol) 認証を設定します。

前提条件

  • ネットワークには 802.1X ネットワーク認証が必要です。
  • Wi-Fi 接続プロファイルが NetworkManager に存在し、有効な IP 設定があります。
  • クライアントがオーセンティケーターの証明書を検証する必要がある場合は、認証局 (CA) 証明書を /etc/pki/ca-trust/source/anchors/ ディレクトリーに保存する必要があります。
  • wpa_supplicant パッケージがインストールされている。

手順

  1. Wi-Fi セキュリティーモードを wpa-eap に設定し、Extensible Authentication Protocol (EAP) を peap に設定し、内部認証プロトコルを mschapv2 に設定し、ユーザー名を設定します。

    # nmcli connection modify wlp1s0 wireless-security.key-mgmt wpa-eap 802-1x.eap peap 802-1x.phase2-auth mschapv2 802-1x.identity <user_name>
    Copy to Clipboard Toggle word wrap

    1 つのコマンドで wireless-security.key-mgmt パラメーター、802-1x.eap パラメーター、802-1x.phase2-auth パラメーター、および 802-1x.identity パラメーターを設定する必要があります。

  2. オプション: 設定にパスワードを保存します。

    # nmcli connection modify wlp1s0 802-1x.password <password>
    Copy to Clipboard Toggle word wrap
    重要

    デフォルトでは、NetworkManager はパスワードをプレーンテキストで /etc/sysconfig/network-scripts/keys-connection_name ファイルに保存します。このファイルは root ユーザーのみが読み取ることができます。ただし、設定ファイル内のプレーンテキストのパスワードは、セキュリティーリスクになる可能性があります。

    セキュリティーを強化するには、802-1x.password-flags パラメーターを agent-owned に設定します。この設定では、GNOME デスクトップ環境または nm-applet が実行中のサーバーで、NetworkManager は最初にキーリングのロックを解除してから、これらのサービスからパスワードを取得します。その他の場合は、NetworkManager によりパスワードの入力が求められます。

  3. クライアントがオーセンティケーターの証明書を検証する必要がある場合は、接続プロファイルの 802-1x.ca-cert パラメーターを CA 証明書のパスに設定します。

    # nmcli connection modify wlp1s0 802-1x.ca-cert /etc/pki/ca-trust/source/anchors/ca.crt
    Copy to Clipboard Toggle word wrap
    注記

    セキュリティー上の理由から、クライアントでオーセンティケーターの証明書を検証することを推奨します。

  4. 接続プロファイルをアクティベートします。

    # nmcli connection up wlp1s0
    Copy to Clipboard Toggle word wrap

検証

  • ネットワーク認証が必要なネットワーク上のリソースにアクセスします。

9.6. network RHEL システムロールを使用した 802.1X ネットワーク認証による Wi-Fi 接続の設定

ネットワークアクセス制御 (NAC) は、不正なクライアントからネットワークを保護します。クライアントがネットワークにアクセスできるようにするために、認証に必要な詳細を NetworkManager 接続プロファイルで指定できます。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

Ansible Playbook を使用して秘密鍵、証明書、および CA 証明書をクライアントにコピーしてから、network RHEL システムロールを使用して 802.1X ネットワーク認証による接続プロファイルを設定できます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • ネットワークは 802.1X ネットワーク認証をサポートしている。
  • マネージドノードに wpa_supplicant パッケージをインストールしました。
  • DHCP は、管理対象ノードのネットワークで使用できる。
  • TLS 認証に必要な以下のファイルがコントロールノードにある。

    • クライアントキーが /srv/data/client.key ファイルに保存されている。
    • クライアント証明書が /srv/data/client.crt ファイルに保存されている。
    • CA 証明書は /srv/data/ca.crt ファイルに保存されます。

手順

  1. 機密性の高い変数を暗号化されたファイルに保存します。

    1. vault を作成します。

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create コマンドでエディターが開いたら、機密データを <key>: <value> 形式で入力します。

      pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
  2. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure a wifi connection with 802.1X authentication
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Copy client key for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0400
    
        - name: Copy client certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - name: Wifi connection profile with dynamic IP address settings and 802.1X
          ansible.builtin.import_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: Wifi connection profile with dynamic IP address settings and 802.1X
                interface_name: wlp1s0
                state: up
                type: wireless
                autoconnect: yes
                ip:
                  dhcp4: true
                  auto6: true
                wireless:
                  ssid: "Example-wifi"
                  key_mgmt: "wpa-eap"
                ieee802_1x:
                  identity: <user_name>
                  eap: tls
                  private_key: "/etc/pki/tls/private/client.key"
                  private_key_password: "{{ pwd }}"
                  private_key_password_flags: none
                  client_cert: "/etc/pki/tls/certs/client.crt"
                  ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt"
                  domain_suffix_match: "example.com"
                  network_allow_restart: true
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    ieee802_1x
    この変数には、802.1X 関連の設定を含めます。
    eap: tls
    Extensible Authentication Protocol (EAP) に証明書ベースの TLS 認証方式を使用するようにプロファイルを設定します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  3. Playbook の構文を検証します。

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  4. Playbook を実行します。

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

9.7. ワイヤレス規制ドメインの手動設定

RHEL では、udev ルールが setregdomain ユーティリティーを実行してワイヤレス規制ドメインを設定します。次に、ユーティリティーはこの情報をカーネルに提供します。

デフォルトでは、setregdomain は国コードを自動的に決定しようとします。これが失敗する場合は、ワイヤレス規制ドメインの設定が間違っている可能性があります。この問題を回避するには、国コードを手動で設定します。

重要

規制ドメインを手動で設定すると、自動検出が無効になります。そのため、後で別の国でコンピューターを使用すると、以前に設定された設定が正しくなくなる可能性があります。この場合、/etc/sysconfig/regdomain ファイルを削除して自動検出に戻すか、以下の手順を使用して規制ドメイン設定を手動で再度更新します。

前提条件

  • Wi-Fi デバイスのドライバーが、規制ドメインの変更をサポートしている。

手順

  1. オプション: 現在の規制ドメイン設定を表示します。

    # iw reg get
    global
    country US: DFS-FCC
    ...
    Copy to Clipboard Toggle word wrap
  2. 次の内容で /etc/sysconfig/regdomain ファイルを作成します。

    COUNTRY=<country_code>
    Copy to Clipboard Toggle word wrap

    COUNTRY 変数を ISO 3166-1 alpha2 国コード (ドイツの場合は DE、アメリカ合衆国の場合は US など) に設定します。

  3. 規制ドメインを設定します。

    # setregdomain
    Copy to Clipboard Toggle word wrap

検証

  • 規制ドメインの設定を表示します。

    # iw reg get
    global
    country DE: DFS-ETSI
    ...
    Copy to Clipboard Toggle word wrap

第10章 MACsec を使用した同じ物理ネットワーク内のレイヤー 2 トラフィックの暗号化

MACsec を使用して、2 つのデバイス間の通信を (ポイントツーポイントで) セキュリティー保護できます。たとえば、ブランチオフィスがメトロイーサネット接続を介してセントラルオフィスに接続されている場合、オフィスを接続する 2 つのホストで MACsec を設定して、セキュリティーを強化できます。

10.1. MACsec がセキュリティーを強化する方法

Media Access Control Security (MACsec) は、イーサーネットリンクで異なるトラフィックタイプを保護するレイヤー 2 プロトコルです。これには以下が含まれます。

  • Dynamic Host Configuration Protocol (DHCP)
  • アドレス解決プロトコル (ARP)
  • IPv4 および IPv6 トラフィック
  • TCP や UDP などの IP 経由のトラフィック

MACsec はデフォルトで、LAN 内のすべてのトラフィックを GCM-AES-128 アルゴリズムで暗号化および認証し、事前共有キーを使用して参加者ホスト間の接続を確立します。事前共有キーを変更するには、MACsec を使用するすべてのネットワークホストで NM 設定を更新する必要があります。

MACsec 接続では、イーサネットネットワークカード、VLAN、トンネルデバイスなどのイーサネットデバイスを親として使用します。暗号化された接続のみを使用して他のホストと通信するように MACsec デバイスにのみ IP 設定を指定することも、親デバイスに IP 設定を設定することもできます。後者の場合、親デバイスを使用して、暗号化されていない接続と暗号化された接続用の MACsec デバイスで他のホストと通信できます。

MACsec には特別なハードウェアは必要ありません。たとえば、ホストとスイッチの間のトラフィックのみを暗号化する場合を除き、任意のスイッチを使用できます。このシナリオでは、スイッチが MACsec もサポートする必要があります。

つまり、次の 2 つの一般的なシナリオに合わせて MACsec を設定できます。

  • ホストからホストへ
  • ホストからスイッチへ、およびスイッチから他のホストへ
重要

MACsec は、同じ物理 LAN または仮想 LAN 内にあるホスト間でのみ使用できます。

リンク層 (Open Systems Interconnection (OSI) モデルのレイヤー 2 とも呼ばれます) での通信を保護するために MACsec セキュリティー標準を使用すると、主に次のような利点が得られます。

  • レイヤー 2 で暗号化することで、レイヤー 7 で個々のサービスを暗号化する必要がなくなります。これにより、各ホストの各エンドポイントで多数の証明書を管理することに関連するオーバーヘッドが削減されます。
  • ルーターやスイッチなどの直接接続されたネットワークデバイス間のポイントツーポイントセキュリティー。
  • アプリケーションや上位レイヤープロトコルに変更を加える必要がなくなります。

10.2. nmcli を使用した MACsec 接続の設定

nmcli ユーティリティーを使用して、MACsec を使用するようにイーサネットインターフェイスを設定できます。たとえば、イーサネット経由で接続された 2 つのホスト間に MACsec 接続を作成できます。

手順

  1. MACsec を設定する最初のホストで:

    • 事前共有鍵の接続アソシエーション鍵 (CAK) と接続アソシエーション鍵名 (CKN) を作成します。

      1. 16 バイトの 16 進 CAK を作成します。

        # dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
        50b71a8ef0bd5751ea76de6d6c98c03a
        Copy to Clipboard Toggle word wrap
      2. 32 バイトの 16 進 CKN を作成します。

        # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
        f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
        Copy to Clipboard Toggle word wrap
  2. 両方のホストで、MACsec 接続を介して接続します。
  3. MACsec 接続を作成します。

    # nmcli connection add type macsec con-name macsec0 ifname macsec0 connection.autoconnect yes macsec.parent enp1s0 macsec.mode psk macsec.mka-cak 50b71a8ef0bd5751ea76de6d6c98c03a macsec.mka-ckn f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
    Copy to Clipboard Toggle word wrap

    前の手順で生成された CAK および CKN を macsec.mka-cak および macsec.mka-ckn パラメーターで使用します。この値は、MACsec で保護されるネットワーク内のすべてのホストで同じである必要があります。

  4. MACsec 接続で IP を設定します。

    1. IPv4 設定を指定します。たとえば、静的 IPv4 アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーを macsec0 接続に設定するには、以下のコマンドを実行します。

      # nmcli connection modify macsec0 ipv4.method manual ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253'
      Copy to Clipboard Toggle word wrap
    2. IPv6 設定を指定しますたとえば、静的 IPv6 アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーを macsec0 接続に設定するには、以下のコマンドを実行します。

      # nmcli connection modify macsec0 ipv6.method manual ipv6.addresses '2001:db8:1::1/32' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd'
      Copy to Clipboard Toggle word wrap
  5. 接続をアクティベートします。

    # nmcli connection up macsec0
    Copy to Clipboard Toggle word wrap

検証

  1. トラフィックが暗号化されていることを確認します。

    # tcpdump -nn -i enp1s0
    Copy to Clipboard Toggle word wrap
  2. オプション: 暗号化されていないトラフィックを表示します。

    # tcpdump -nn -i macsec0
    Copy to Clipboard Toggle word wrap
  3. MACsec の統計を表示します。

    # ip macsec show
    Copy to Clipboard Toggle word wrap
  4. integrity-only (encrypt off) および encryption (encrypt on) の各タイプの保護に対して個々のカウンターを表示します。

    # ip -s macsec show
    Copy to Clipboard Toggle word wrap

10.3. nmstatectl を使用した MACsec 接続の設定

nmstatectl ユーティリティーを宣言的に使用して、イーサネットインターフェイスが MACsec を使用するように設定できます。たとえば、YAML ファイルでは、ネットワークの望ましい状態を記述します。ネットワークでは、イーサネット経由で接続された 2 つのホスト間に MACsec 接続があることが想定されます。nmstatectl ユーティリティーは、YAML ファイルを解釈し、ホスト間に永続的かつ一貫したネットワーク設定をデプロイします。

前提条件

  • 物理または仮想イーサネットネットワークインターフェイスコントローラー (NIC) がサーバーに設定されている。
  • nmstate パッケージがインストールされている。

手順

  1. MACsec を設定する最初のホストで、事前共有キー用の接続関連キー (CAK: connectivity association key) および接続関連キー名 (CKN: connectivity-association key name) を作成します。

    1. 16 バイトの 16 進 CAK を作成します。

      # dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
      50b71a8ef0bd5751ea76de6d6c98c03a
      Copy to Clipboard Toggle word wrap
    2. 32 バイトの 16 進 CKN を作成します。

      # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
      f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
      Copy to Clipboard Toggle word wrap
  2. MACsec 接続を介して接続するホストの両方で、次の手順を実行します。

    1. 次の設定を含む YAML ファイル (例: create-macsec-connection.yml) を作成します。

      ---
      routes:
        config:
        - destination: 0.0.0.0/0
          next-hop-interface: macsec0
          next-hop-address: 192.0.2.2
          table-id: 254
        - destination: 192.0.2.2/32
          next-hop-interface: macsec0
          next-hop-address: 0.0.0.0
          table-id: 254
      dns-resolver:
        config:
          search:
          - example.com
          server:
          - 192.0.2.200
          - 2001:db8:1::ffbb
      interfaces:
      - name: macsec0
        type: macsec
        state: up
        ipv4:
          enabled: true
          address:
          - ip: 192.0.2.1
            prefix-length: 32
        ipv6:
          enabled: true
          address:
          - ip: 2001:db8:1::1
            prefix-length: 64
        macsec:
          encrypt: true
          base-iface: enp0s1
          mka-cak: 50b71a8ef0bd5751ea76de6d6c98c03a
          mka-ckn: f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
          port: 0
          validation: strict
          send-sci: true
      Copy to Clipboard Toggle word wrap
    2. 前の手順で生成された CAK および CKN を mka-cak および mka-ckn パラメーターで使用します。この値は、MACsec で保護されるネットワーク内のすべてのホストで同じである必要があります。
    3. オプション: 同じ YAML 設定ファイルで、以下も設定できます。

      • 静的 IPv4 アドレス: 192.0.2.1 (サブネットマスクが /32)
      • 静的 IPv6 アドレス: 2001:db8:1::1 (サブネットマスクが /64)
      • IPv4 デフォルトゲートウェイ - 192.0.2.2
      • IPv4 DNS サーバー - 192.0.2.200
      • IPv6 DNS サーバー - 2001:db8:1::ffbb
      • DNS 検索ドメイン - example.com
  3. 設定をシステムに適用します。

    # nmstatectl apply create-macsec-connection.yml
    Copy to Clipboard Toggle word wrap

検証

  1. 現在の状態を YAML 形式で表示します。

    # nmstatectl show macsec0
    Copy to Clipboard Toggle word wrap
  2. トラフィックが暗号化されていることを確認します。

    # tcpdump -nn -i enp0s1
    Copy to Clipboard Toggle word wrap
  3. オプション: 暗号化されていないトラフィックを表示します。

    # tcpdump -nn -i macsec0
    Copy to Clipboard Toggle word wrap
  4. MACsec の統計を表示します。

    # ip macsec show
    Copy to Clipboard Toggle word wrap
  5. integrity-only (encrypt off) および encryption (encrypt on) の各タイプの保護に対して個々のカウンターを表示します。

    # ip -s macsec show
    Copy to Clipboard Toggle word wrap

第11章 特定のデバイスを無視するように NetworkManager の設定

デフォルトでは、NetworkManager は /usr/lib/udev/rules.d/85-nm-unmanaged.rules ファイルに記述されているデバイスを除くすべてのデバイスを管理します。他の特定のデバイスを無視するには、NetworkManager でそのデバイスを unmanaged として設定できます。

11.1. NetworkManager でデバイスをマネージド外として永続的に設定

インターフェイス名、MAC アドレス、デバイスタイプなどのいくつかの基準に基づいてデバイスを unmanaged として設定できます。設定内のデバイスセクションを使用してデバイスを管理対象外として設定した場合、NetworkManager は接続プロファイルでそのデバイスの使用を開始するまでそのデバイスを管理しません。

手順

  1. オプション: デバイスの一覧を表示して、unmanaged に設定するデバイスまたは MAC アドレスを特定します。

    # ip link show
    ...
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:74:79:56 brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap
  2. /etc/NetworkManager/conf.d/ ディレクトリーに *.conf ファイルを作成します (例: /etc/NetworkManager/conf.d/99-unmanaged-devices.conf)。
  3. 管理対象外として設定するデバイスごとに、一意の名前を持つセクションをファイルに追加します。

    重要

    セクション名は device- で始まる必要があります。

    • 特定のインターフェイスを管理対象外として設定するには、以下を追加します。

      [device-enp1s0-unmanaged]
      match-device=interface-name:enp1s0
      managed=0
      Copy to Clipboard Toggle word wrap
    • 特定の MAC アドレスを管理対象外として設定するには、以下を追加します。

      [device-mac525400747956-unmanaged]
      match-device=mac:52:54:00:74:79:56
      managed=0
      Copy to Clipboard Toggle word wrap
    • 特定のタイプのすべてのデバイスを管理対象外として設定するには、以下を追加します。

      [device-ethernet-unmanaged]
      match-device=type:ethernet
      managed=0
      Copy to Clipboard Toggle word wrap
    • 複数のデバイスを管理対象外に設定するには、unmanaged-devices パラメーターのエントリーをセミコロンで区切ります。以下に例を示します。

      [device-multiple-devices-unmanaged]
      match-device=interface-name:enp1s0;interface-name:enp7s0
      managed=0
      Copy to Clipboard Toggle word wrap

      または、このファイルにデバイスごとに個別のセクションを追加したり、/etc/NetworkManager/conf.d/ ディレクトリーに追加の *.conf ファイルを作成したりすることもできます。

  4. ホストシステムを再起動します。

    # reboot
    Copy to Clipboard Toggle word wrap

検証

  • デバイスのリストを表示します。

    # nmcli device status
    DEVICE  TYPE      STATE      CONNECTION
    enp1s0  ethernet  unmanaged  --
    ...
    Copy to Clipboard Toggle word wrap

    enp1s0 デバイスの横の unmanaged 状態は、NetworkManager がこのデバイスを管理していないことを示しています。

トラブルシューティング

  • nmcli device status コマンドの出力にデバイスが unmanaged としてリストされていない場合は、NetworkManager 設定を表示します。

    # NetworkManager --print-config
    ...
    [device-enp1s0-unmanaged]
    match-device=interface-name:enp1s0
    managed=0
    ...
    Copy to Clipboard Toggle word wrap

    指定した設定と出力が一致しない場合は、より優先度が高い設定ファイルによって設定がオーバーライドされていないことを確認してください。NetworkManager が複数の設定ファイルをマージする方法の詳細は、システム上の NetworkManager.conf(5) man ページを参照してください。

11.2. NetworkManager でデバイスをマネージド外として一時的に設定

たとえばテスト目的で、デバイスを一時的に unmanaged として設定できます。この変更は、NetworkManager systemd サービスの再ロード後および再起動後も維持されますが、システムの再起動後は維持されません。

手順

  1. 必要に応じて、デバイスのリストを表示して、マネージド外 に設定するデバイスを特定します。

    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp1s0  ethernet  disconnected  --
    ...
    Copy to Clipboard Toggle word wrap
  2. enp1s0 デバイスを unmanaged の状態に設定します。

    # nmcli device set enp1s0 managed no
    Copy to Clipboard Toggle word wrap

検証

  • デバイスのリストを表示します。

    # nmcli device status
    DEVICE  TYPE      STATE      CONNECTION
    enp1s0  ethernet  unmanaged  --
    ...
    Copy to Clipboard Toggle word wrap

    enp1s0 デバイスの横の unmanaged 状態は、NetworkManager がこのデバイスを管理していないことを示しています。

11.3. NetworkManager が特定のネットワークデバイスを管理しない理由を特定する

NetworkManager は、各ネットワークデバイスのステータスに加えて、デバイスが現在のステータスになっている理由も追跡します。この機能を使用すると、NetworkManager が特定のデバイスを管理しない理由を特定できます。

手順

  • すべてのネットワークデバイスのステータスとその理由を表示します。

    # nmcli -f GENERAL.DEVICE,GENERAL.STATE,GENERAL.REASON device show
    Copy to Clipboard Toggle word wrap

    コマンドにデバイス名を渡すと、指定したデバイスの出力のみを表示できます。

    出力例:

    GENERAL.DEVICE:    enp1s0
    GENERAL.STATE:     10 (unmanaged)
    GENERAL.REASON:    75 (The device is unmanaged by explicit user decision (e.g. 'nmcli device set $DEV managed no'))
    
    GENERAL.DEVICE:    enp7s0
    GENERAL.STATE:     10 (unmanaged)
    GENERAL.REASON:    74 (The device is unmanaged by user decision in NetworkManager.conf ('unmanaged' in a [device*] section)
    
    GENERAL.DEVICE:    veth3
    GENERAL.STATE:     10 (unmanaged)
    GENERAL.REASON:    77 (The device is unmanaged via udev rule)
    Copy to Clipboard Toggle word wrap
    注記

    このコマンドは、管理対象か管理対象外かに関係なく、すべてのデバイスのステータスを返すことに注意してください。

第12章 デフォルトゲートウェイの管理

デフォルトゲートウェイは、他のルートがパケットの宛先と一致する場合にネットワークパケットを転送するルーターです。ローカルネットワークでは、通常、デフォルトゲートウェイは、インターネットの近くの 1 ホップのホストです。

12.1. nmcli を使用して既存の接続にデフォルトゲートウェイを設定する

ほとんどの場合、管理者は接続を作成するときにデフォルトゲートウェイを設定します。ただし、nmcli ユーティリティーを使用して、以前に作成した接続のデフォルトゲートウェイ設定を設定または更新することもできます。

前提条件

  • デフォルトゲートウェイが設定されている接続で、静的 IP アドレスを少なくとも 1 つ設定している。
  • 物理コンソールにログインしている場合は、十分な権限を有している。それ以外の場合は、root 権限が必要になります。

手順

  1. デフォルトゲートウェイの IP アドレスを設定します。

    IPv4 デフォルトゲートウェイを設定するには、次のように実行します。

    # nmcli connection modify <connection_name> ipv4.gateway "<IPv4_gateway_address>"
    Copy to Clipboard Toggle word wrap

    IPv6 デフォルトゲートウェイを設定するには、次のように実行します。

    # nmcli connection modify <connection_name> ipv6.gateway "<IPv6_gateway_address>"
    Copy to Clipboard Toggle word wrap
  2. ネットワーク接続を再起動して、変更を有効にします。

    # nmcli connection up <connection_name>
    Copy to Clipboard Toggle word wrap
    警告

    このネットワーク接続を現在使用しているすべての接続が、再起動時に一時的に中断されます。

検証

  • ルートがアクティブであることを確認します。

    1. IPv4 デフォルトゲートウェイを表示するには、次のように実行します。

      # ip -4 route
      default via 192.0.2.1 dev example proto static metric 100
      Copy to Clipboard Toggle word wrap
    2. IPv6 デフォルトゲートウェイを表示するには、次のように実行します。

      # ip -6 route
      default via 2001:db8:1::1 dev example proto static metric 100 pref medium
      Copy to Clipboard Toggle word wrap

12.2. nmstatectl を使用して既存の接続にデフォルトゲートウェイを設定する

ほとんどの場合、管理者は接続を作成するときにデフォルトゲートウェイを設定します。ただし、nmstatectl ユーティリティーを使用して、以前に作成した接続のデフォルトゲートウェイ設定を設定または更新することもできます。

nmstatectl ユーティリティーを使用して、Nmstate API を介してデフォルトゲートウェイを設定します。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

前提条件

  • デフォルトゲートウェイが設定されている接続で、静的 IP アドレスを少なくとも 1 つ設定している。
  • enp1s0 インターフェイスが設定され、デフォルトゲートウェイの IP アドレスがこのインターフェイスの IP 設定のサブネット内にある。
  • nmstate パッケージがインストールされている。

手順

  1. 以下の内容を含む YAML ファイル (例: ~/set-default-gateway.yml) を作成します。

    ---
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.1
        next-hop-interface: enp1s0
    Copy to Clipboard Toggle word wrap

    これらの設定では、192.0.2.1 をデフォルトゲートウェイとして定義します。デフォルトゲートウェイは enp1s0 インターフェイス経由で到達可能です。

  2. 設定をシステムに適用します。

    # nmstatectl apply ~/set-default-gateway.yml
    Copy to Clipboard Toggle word wrap

12.3. network RHEL システムロールを使用して既存の接続にデフォルトゲートウェイを設定する

パケットの宛先に、直接接続されたネットワーク経由でも、ホストに設定されたルート経由でも到達できない場合、ホストはネットワークパケットをデフォルトゲートウェイに転送します。ホストのデフォルトゲートウェイを設定するには、デフォルトゲートウェイと同じネットワークに接続されているインターフェイスの NetworkManager 接続プロファイルで、そのゲートウェイを設定します。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

ほとんどの場合、管理者は接続を作成するときにデフォルトゲートウェイを設定します。ただし、以前に作成した接続でデフォルトゲートウェイ設定を設定または更新することもできます。

警告

network RHEL システムロールを使用して、既存接続プロファイル内の特定の値だけを更新することはできません。このロールは、接続プロファイルが Playbook の設定と正確に一致するようにします。同じ名前の接続プロファイルがすでに存在する場合、このロールは Playbook の設定を適用し、プロファイル内の他のすべての設定をデフォルトにリセットします。値がリセットされないようにするには、変更しない設定も含め、ネットワーク接続プロファイルの設定全体を Playbook に常に指定してください。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with static IP address settings
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  address:
                    - 198.51.100.20/24
                    - 2001:db8:1::1/64
                  gateway4: 198.51.100.254
                  gateway6: 2001:db8:1::fffe
                  dns:
                    - 198.51.100.200
                    - 2001:db8:1::ffbb
                  dns_search:
                    - example.com
                state: up
    Copy to Clipboard Toggle word wrap

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • 管理対象ノードの Ansible fact をクエリーし、アクティブなネットワーク設定を確認します。

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
    	    ...
                "gateway": "198.51.100.254",
                "interface": "enp1s0",
    	    ...
            },
            "ansible_default_ipv6": {
    	    ...
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
    	    ...
    	}
    ...
    Copy to Clipboard Toggle word wrap

12.4. NetworkManager が複数のデフォルトゲートウェイを管理する方法

フォールバック上の理由で特定の状況では、ホストに複数のデフォルトゲートウェイを設定します。ただし、非同期ルーティングの問題を回避するために、同じプロトコルの各デフォルトゲートウェイには別のメトリック値が必要です。RHEL は、最も低いメトリックセットを持つデフォルトゲートウェイへの接続のみを使用することに注意してください。

以下のコマンドを使用して、接続の IPv4 ゲートウェイと IPv6 ゲートウェイの両方にメトリックを設定できます。

# nmcli connection modify <connection_name> ipv4.route-metric <value> ipv6.route-metric <value>
Copy to Clipboard Toggle word wrap
重要

ルーティングの問題を回避するために、複数の接続プロファイルで同じプロトコルに同じメトリック値を設定しないでください。

メトリック値なしでデフォルトのゲートウェイを設定すると、NetworkManager は、インターフェイスタイプに基づいてメトリック値を自動的に設定します。このため、NetworkManager は、アクティブな最初の接続に、このネットワークタイプのデフォルト値を割り当て、そのネットワークタイプがアクティベートされる順序で、同じタイプの他の接続にインクリメントした値を設定します。たとえば、デフォルトゲートウェイを持つ 2 つのイーサネット接続が存在する場合、NetworkManager は、ルートに 100 のメトリックを、最初にアクティブにしている接続のデフォルトゲートウェイに設定します。2 つ目の接続では、NetworkManager は 101 を設定します。

以下は、よく使用されるネットワークタイプと、そのデフォルトのメトリックの概要です。

Expand
接続タイプデフォルトのメトリック値

VPN

50

イーサネット

100

MACsec

125

InfiniBand

150

Bond

300

VLAN

400

ブリッジ

425

TUN

450

Wi-Fi

600

IP トンネル

675

NetworkManager が特定のプロファイルを使用してデフォルトゲートウェイを指定しないようにすることができます。デフォルトゲートウェイに接続されていない接続プロファイルには、以下の手順に従います。

前提条件

  • デフォルトゲートウェイに接続されていない接続の NetworkManager 接続プロファイルが存在する。

手順

  1. 接続で動的 IP 設定を使用する場合は、NetworkManager が、対応する IP タイプのデフォルト接続としてこの接続を使用しないように設定します。つまり、NetworkManager がデフォルトのルートをこの接続に割り当てないようにします。

    # nmcli connection modify <connection_name> ipv4.never-default yes ipv6.never-default yes
    Copy to Clipboard Toggle word wrap

    ipv4.never-default および ipv6.never-defaultyes に設定すると、対応するプロトコルのデフォルトのゲートウェイ IP アドレスが、接続プロファイルから削除されることに注意してください。

  2. 接続をアクティベートします。

    # nmcli connection up <connection_name>
    Copy to Clipboard Toggle word wrap

検証

  • ip -4 route コマンドおよび ip -6 route コマンドを使用して、RHEL が、IPv4 プロトコルおよび IPv6 プロトコルのデフォルトルートにネットワークインターフェイスを使用しないことを確認します。

12.6. 複数のデフォルトゲートウェイによる予期しないルーティング動作の修正

ホストに複数のデフォルトゲートウェイが必要となる状況は、Multipath TCP を使用する場合など、ごく限られています。多くの場合、ルーティングの動作や非同期ルーティングの問題を回避するために、1 つのデフォルトゲートウェイのみを設定します。

注記

異なるインターネットプロバイダーにトラフィックをルーティングするには、複数のデフォルトゲートウェイの代わりにポリシーベースのルーティングを使用します。

前提条件

  • ホストは NetworkManager を使用してネットワーク接続を管理します。これはデフォルトです。
  • ホストには複数のネットワークインターフェイスがある。
  • ホストには複数のデフォルトゲートウェイが設定されている。

手順

  1. ルーティングテーブルを表示します。

    • IPv4 の場合は、次のコマンドを実行します。

      # ip -4 route
      default via 192.0.2.1 dev enp1s0 proto dhcp metric 101
      default via 198.51.100.1 dev enp7s0 proto dhcp metric 102
      ...
      Copy to Clipboard Toggle word wrap
    • IPv6 の場合は、次のコマンドを実行します。

      # ip -6 route
      default via 2001:db8:1::1 dev enp1s0 proto ra metric 101 pref medium
      default via 2001:db8:2::1 dev enp7s0 proto ra metric 102 pref medium
      ...
      Copy to Clipboard Toggle word wrap

    default で開始するエントリーはデフォルトのルートを示します。dev の横に表示されるこれらのエントリーのインターフェイス名を書き留めます。

  2. 以下のコマンドを使用して、前の手順で特定したインターフェイスを使用する NetworkManager 接続を表示します。

    # nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp1s0
    GENERAL.CONNECTION:      Corporate-LAN
    IP4.GATEWAY:             192.0.2.1
    IP6.GATEWAY:             2001:db8:1::1
    
    # nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp7s0
    GENERAL.CONNECTION:      Internet-Provider
    IP4.GATEWAY:             198.51.100.1
    IP6.GATEWAY:             2001:db8:2::1
    Copy to Clipboard Toggle word wrap

    この例では、Corporate-LANInternet-Provider という名前のプロファイルにはデフォルトのゲートウェイが設定されています。これは、ローカルネットワークでは、通常、インターネット 1 ホップ近いホストがデフォルトゲートウェイであるため、この手順の残りの部分では、Corporate-LAN のデフォルトゲートウェイが正しくないことを想定するためです。

  3. NetworkManager が、IPv4 および IPv6 接続のデフォルトルートとして Corporate-LAN 接続を使用しないように設定します。

    # nmcli connection modify Corporate-LAN ipv4.never-default yes ipv6.never-default yes
    Copy to Clipboard Toggle word wrap

    ipv4.never-default および ipv6.never-defaultyes に設定すると、対応するプロトコルのデフォルトのゲートウェイ IP アドレスが、接続プロファイルから削除されることに注意してください。

  4. Corporate-LAN 接続をアクティブにします。

    # nmcli connection up Corporate-LAN
    Copy to Clipboard Toggle word wrap

検証

  • IPv4 および IPv6 ルーティングテーブルを表示し、プロトコルごとに 1 つのデフォルトゲートウェイのみが利用可能であることを確認します。

    • IPv4 の場合は、次のコマンドを実行します。

      # ip -4 route
      default via 198.51.100.1 dev enp7s0 proto dhcp metric 102
      ...
      Copy to Clipboard Toggle word wrap
    • IPv6 の場合は、次のコマンドを実行します。

      # ip -6 route
      default via 2001:db8:2::1 dev enp7s0 proto ra metric 102 pref medium
      ...
      Copy to Clipboard Toggle word wrap

第13章 静的ルートの設定

ルーティングにより、相互に接続されたネットワーク間でトラフィックを送受信できるようになります。大規模な環境では、管理者は通常、ルーターが他のルーターについて動的に学習できるようにサービスを設定します。小規模な環境では、管理者は多くの場合、静的ルートを設定して、トラフィックが 1 つのネットワークから次のネットワークに確実に到達できるようにします。

次の条件がすべて当てはまる場合、複数のネットワーク間で機能する通信を実現するには、静的ルートが必要です。

  • トラフィックは複数のネットワークを通過する必要があります。
  • デフォルトゲートウェイを通過する排他的なトラフィックフローは十分ではありません。

静的ルートを必要とするネットワークの例 セクションで、静的ルートを設定しない場合のシナリオと、異なるネットワーク間でトラフィックがどのように流れるかを説明します。

13.1. 静的ルートを必要とするネットワークの例

すべての IP ネットワークが 1 つのルーターを介して直接接続されているわけではないため、この例では静的ルートが必要です。スタティックルートがないと、一部のネットワークは相互に通信できません。さらに、一部のネットワークからのトラフィックは一方向にしか流れません。

注記

この例のネットワークトポロジーは人為的なものであり、静的ルーティングの概念を説明するためにのみ使用されています。これは、実稼働環境で推奨されるトポロジーではありません。

この例のすべてのネットワーク間で通信を機能させるには、Raleigh (198.51.100.0/24) への静的ルートを設定し、次のホップ Router 2 (203.0.113.10) を設定します。ネクストホップの IP アドレスは、データセンターネットワークのルーター 2 のものです (203.0.113.0/24)。

スタティックルートは次のように設定できます。

  • 設定を簡素化するには、この静的ルートをルーター 1 だけに設定します。ただし、データセンター (203.0.113.0/24) からのホストがトラフィックを Raleigh (198.51.100.0/24) に送信するため、常にルーター 1 を経由してルーター 2 に送信されるため、ルーター 1 のトラフィックが増加します。
  • より複雑な設定の場合、データセンター (203.0.113.0/24) 内のすべてのホストでこの静的ルートを設定します。このサブネット内のすべてのホストは、Raleigh (198.51.100.0/24) に近いルーター 2 (203.0.113.10) にトラフィックを直接送信します。

どのネットワーク間でトラフィックが流れるかどうかの詳細は、図の下の説明を参照してください。

必要な静的経路が設定されていないときに、通信がうまくいく場合とうまくいかない場合を以下に示します。

  • ベルリンネットワークのホスト (192.0.2.0/24):

    • 直接接続されているため、同じサブネット内の他のホストと通信できます。
    • Router 1 はベルリンネットワーク (192.0.2.0/24) 内にあり、インターネットにつながるデフォルトゲートウェイがあるため、インターネットと通信できます。
    • ルーター 1 はベルリン (192.0.2.0/24) とデータセンター (203.0.113.0/24) ネットワークの両方にインターフェイスを持っているため、データセンターネットワーク (203.0.113.0/24) と通信できます。
    • ローリーネットワーク (198.51.100.0/24) と通信できません。これは、ルーター 1 がこのネットワークにインターフェイスを持たないためです。したがって、Router 1 はトラフィックを独自のデフォルトゲートウェイ (インターネット) に送信します。
  • データセンターネットワーク内のホスト (203.0.113.0/24):

    • 直接接続されているため、同じサブネット内の他のホストと通信できます。
    • デフォルトゲートウェイがルーター 1 に設定されているため、インターネットと通信できます。ルーター 1 には、データセンター (203.0.113.0/24) とインターネットの両方のネットワークにインターフェイスがあります。
    • デフォルトゲートウェイがルーター 1 に設定されているため、ベルリンネットワーク (192.0.2.0/24) と通信でき、ルーター 1 にはデータセンター (203.0.113.0/24) とベルリン (192.0.2.0/24) の両方にインターフェイスがあります。) ネットワーク。
    • Raleigh ネットワーク (198.51.100.0/24) と通信できません。これは、データセンターネットワークがこのネットワークにインターフェイスを持たないためです。したがって、データセンター (203.0.113.0/24) 内のホストは、トラフィックをデフォルトゲートウェイ (ルーター 1) に送信します。ルーター 1 も Raleigh ネットワーク (198.51.100.0/24) にインターフェイスを持たないため、ルーター 1 はこのトラフィックを独自のデフォルトゲートウェイ (インターネット) に送信します。
  • Raleigh ネットワーク内のホスト (198.51.100.0/24):

    • 直接接続されているため、同じサブネット内の他のホストと通信できます。
    • インターネット上のホストと通信できません。デフォルトゲートウェイの設定により、ルーター 2 はトラフィックをルーター 1 に送信します。ルーター 1 の実際の動作は、リバースパスフィルター (rp_filter) システム制御 (sysctl) の設定によって異なります。RHEL のデフォルトでは、Router 1 は送信トラフィックをインターネットにルーティングする代わりにドロップします。ただし、設定された動作に関係なく、スタティックルートがないと通信できません。
    • データセンターネットワーク (203.0.113.0/24) と通信できません。デフォルトゲートウェイの設定により、発信トラフィックはルーター 2 を経由して宛先に到達します。ただし、データセンターネットワーク (203.0.113.0/24) 内のホストがデフォルトゲートウェイ (ルーター 1) に応答を送信するため、パケットへの応答は送信者に届きません。次に、Router 1 がトラフィックをインターネットに送信します。
    • ベルリンのネットワーク (192.0.2.0/24) と通信できません。デフォルトゲートウェイの設定により、ルーター 2 はトラフィックをルーター 1 に送信します。ルーター 1 の実際の動作は、sysctl 設定の rp_filter によって異なります。RHEL のデフォルトでは、Router 1 は発信トラフィックを Berlin ネットワーク (192.0.2.0/24) に送信する代わりにドロップします。ただし、設定された動作に関係なく、スタティックルートがないと通信できません。
注記

静的ルートの設定に加え、両方のルーターで IP 転送を有効にする必要があります。

13.2. nmcli ユーティリティーを使用して静的ルートを設定する方法

静的ルートを設定するには、次の構文で nmcli ユーティリティーを使用します。

$ nmcli connection modify connection_name ipv4.routes "ip[/prefix] [next_hop] [metric] [attribute=value] [attribute=value] ..."
Copy to Clipboard Toggle word wrap

このコマンドは、次のルート属性に対応します。

  • cwnd=n: パケット数で定義された輻輳ウィンドウ (CWND) サイズを設定します。
  • lock-cwnd=true|false: カーネルが CWND 値を更新できるかどうかを定義します。
  • lock-mtu=true|false: カーネルが MTU をパス MTU ディスカバリーに更新できるかどうかを定義します。
  • lock-window=true|false: カーネルが TCP パケットの最大ウィンドウサイズを更新できるかどうかを定義します。
  • mtu=<mtu_value>: 宛先へのパスに沿って使用する最大転送単位 (MTU) を設定します。
  • onlink=true|false: ネクストホップがどのインターフェイス接頭辞とも一致しない場合でも、このリンクに直接接続されるかどうかを定義します。
  • scope=<scope>: IPv4 ルートの場合、この属性は、ルート接頭辞によってカバーされる宛先の範囲を設定します。値を整数 (0〜255) として設定します。
  • src=<source_address>: ルート接頭辞の対象となる宛先にトラフィックを送信するときに優先する送信元アドレスを設定します。
  • table=<table_id>: ルートを追加するテーブルの ID を設定します。このパラメーターを省略すると、NetworkManager は main テーブルを使用します。
  • tos=<type_of_service_key>: Type of Service (TOS) キーを設定します。値を整数 (0〜255) として設定します。
  • type=<route_type>: ルートタイプを設定します。NetworkManager は、unicastlocalblackholeunreachableprohibit、および throw ルートタイプをサポートします。デフォルトは unicast です。
  • window=<window_size>: これらの宛先にアドバタイズする TCP の最大ウィンドウサイズをバイト単位で設定します。
重要

先頭に + 記号を付けずに ipv4.routes オプションを使用すると、nmcli はこのパラメーターの現在の設定をすべてオーバーライドします。

  • 追加のルートを作成するには、次のように実行します。

    $ nmcli connection modify connection_name +ipv4.routes "<route>"
    Copy to Clipboard Toggle word wrap
  • 特定のルートを削除するには、次のように実行します。

    $ nmcli connection modify connection_name -ipv4.routes "<route>"
    Copy to Clipboard Toggle word wrap

13.3. nmcli を使用した静的ルートの設定

nmcli connection modify コマンドを使用して、既存の NetworkManager 接続プロファイルに静的ルートを追加できます。

以下の手順では、次のルートを設定します。

  • リモート 198.51.100.0/24 ネットワークへの IPv4 ルート。IP アドレス 192.0.2.10 を持つ対応するゲートウェイは、LAN 接続プロファイルを通じて到達可能です。
  • リモート 2001:db8:2::/64 ネットワークへの IPv6 ルート。IP アドレス 2001:db8:1::10 を持つ対応するゲートウェイは、LAN 接続プロファイルを通じて到達可能です。

前提条件

  • LAN 接続プロファイルが存在し、このホストがゲートウェイと同じ IP サブネットに存在するように設定されている。

手順

  1. LAN 接続プロファイルに静的 IPv4 ルートを追加します。

    # nmcli connection modify LAN +ipv4.routes "198.51.100.0/24 192.0.2.10"
    Copy to Clipboard Toggle word wrap

    一度に複数のルートを設定するには、個々のルートをコンマで区切ってコマンドに渡します。

    # nmcli connection modify <connection_profile> +ipv4.routes "<remote_network_1>/<subnet_mask_1> <gateway_1>, <remote_network_n>/<subnet_mask_n> <gateway_n>, ..."
    Copy to Clipboard Toggle word wrap
  2. LAN 接続プロファイルに静的 IPv6 ルートを追加します。

    # nmcli connection modify LAN +ipv6.routes "2001:db8:2::/64 2001:db8:1::10"
    Copy to Clipboard Toggle word wrap
  3. 接続を再度有効にします。

    # nmcli connection up LAN
    Copy to Clipboard Toggle word wrap

検証

  1. IPv4 ルートを表示します。

    # ip -4 route
    ...
    198.51.100.0/24 via 192.0.2.10 dev enp1s0
    Copy to Clipboard Toggle word wrap
  2. IPv6 ルートを表示します。

    # ip -6 route
    ...
    2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
    Copy to Clipboard Toggle word wrap

13.4. nmtui を使用した静的ルートの設定

nmtui アプリケーションは、NetworkManager 用のテキストベースのユーザーインターフェイスを提供します。nmtui を使用して、グラフィカルインターフェイスを使用せずにホスト上で静的ルートを設定できます。

たとえば、以下の手順では 198.51.100.1 で実行しているゲートウェイを使用する 192.0.2.0/24 ネットワークに経路を追加します。これは、既存の接続プロファイルから到達可能です。

注記

nmtui で以下を行います。

  • カーソルキーを使用してナビゲートします。
  • ボタンを選択して Enter を押します。
  • Space を使用してチェックボックスをオンまたはオフにします。
  • 前の画面に戻るには、ESC を使用します。

前提条件

  • ネットワークが設定されている。
  • 静的ルートのゲートウェイが、インターフェイスで直接到達できる。
  • 物理コンソールにログインしている場合は、十分な権限を有している。それ以外の場合は、コマンドに root 権限が必要になります。

手順

  1. nmtui を開始します。

    # nmtui
    Copy to Clipboard Toggle word wrap
  2. Edit a connection を選択し、Enter を押します。
  3. 宛先ネットワークへのネクストホップに到達できる接続プロファイルを選択し、Enter を押します。
  4. IPv4 ルートまたは IPv6 ルートに応じて、プロトコルの設定エリアの横にある Show ボタンを押します。
  5. Routing の横にある Edit ボタンを押します。これにより、静的ルートを設定する新しいウィンドウが開きます。

    1. Add ボタンを押して、次のように実行します。

      • Classless Inter-Domain Routing (CIDR) 形式の接頭辞を含む宛先ネットワーク
      • ネクストホップの IP アドレス
      • 同じネットワークに複数のルートを追加し、効率によってルートに優先順位を付けたい場合のメトリック値
    2. 追加するルートごとに前の手順を繰り返し、この接続プロファイルを介して到達できます。
    3. OK ボタンを押して、接続設定のウィンドウに戻ります。

      図13.1 メトリックのない静的ルートの例

  6. OK ボタンを押して nmtui メインメニューに戻ります。
  7. Activate a connection を選択し、Enter を押します。
  8. 編集した接続プロファイルを選択し、Enter キーを 2 回押して非アクティブ化し、再度アクティブ化します。

    重要

    再アクティブ化する接続プロファイルを使用する SSH などのリモート接続で nmtui を実行する場合は、この手順をスキップしてください。この場合は、nmtui で非アクティブ化すると、接続が切断されるため、再度アクティブ化することはできません。この問題を回避するには、上記のシナリオで nmcli connection <connection_profile> up コマンドを使用して接続を再アクティブ化します。

  9. Back ボタンを押してメインメニューに戻ります。
  10. Quit を選択し、Enter キーを押して nmtui アプリケーションを閉じます。

検証

  • ルートがアクティブであることを確認します。

    $ ip route
    ...
    192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100
    Copy to Clipboard Toggle word wrap

13.5. nmstatectl を使用した静的ルートの設定

nmstatectl ユーティリティーを使用して、Nmstate API を介して静的ルートを設定します。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

前提条件

  • enp1s0 ネットワークインターフェイスが設定され、ゲートウェイと同じ IP サブネット内にあります。
  • nmstate パッケージがインストールされている。

手順

  1. 以下の内容を含む YAML ファイルを作成します (例: ~/add-static-route-to-enp1s0.yml)。

    ---
    routes:
      config:
      - destination: 198.51.100.0/24
        next-hop-address: 192.0.2.10
        next-hop-interface: enp1s0
      - destination: 2001:db8:2::/64
        next-hop-address: 2001:db8:1::10
        next-hop-interface: enp1s0
    Copy to Clipboard Toggle word wrap

    これらの設定では、次の静的ルートを定義します。

    • リモート 198.51.100.0/24 ネットワークへの IPv4 ルート。IP アドレス 192.0.2.10 の対応するゲートウェイは、enp1s0 インターフェイスを介して到達できます。
    • リモート 2001:db8:2::/64 ネットワークへの IPv6 ルート。IP アドレス 2001:db8:1::10 の対応するゲートウェイは、enp1s0 インターフェイスを介して到達できます。
  2. 設定をシステムに適用します。

    # nmstatectl apply ~/add-static-route-to-enp1s0.yml
    Copy to Clipboard Toggle word wrap

検証

  1. IPv4 ルートを表示します。

    # ip -4 route
    ...
    198.51.100.0/24 via 192.0.2.10 dev enp1s0
    Copy to Clipboard Toggle word wrap
  2. IPv6 ルートを表示します。

    # ip -6 route
    ...
    2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
    Copy to Clipboard Toggle word wrap

13.6. network RHEL システムロールを使用した静的ルートの設定

network RHEL システムロールを使用して、静的ルートを設定できます。

重要

network RHEL システムロールを使用するプレイの実行時に、プレイで指定した値と設定値が一致しない場合、当該ロールは同じ名前の既存の接続プロファイルをオーバーライドします。これらの値がデフォルトにリセットされないようにするには、IP 設定などの設定がすでに存在する場合でも、ネットワーク接続プロファイルの設定全体をプレイで必ず指定してください。

前提条件

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Configure an Ethernet connection with static IP and additional routes
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: enp7s0
                type: ethernet
                autoconnect: yes
                ip:
                  address:
                    - 192.0.2.1/24
                    - 2001:db8:1::1/64
                  gateway4: 192.0.2.254
                  gateway6: 2001:db8:1::fffe
                  dns:
                    - 192.0.2.200
                    - 2001:db8:1::ffbb
                  dns_search:
                    - example.com
                  route:
                  route:
                    - network: 198.51.100.0
                      prefix: 24
                      gateway: 192.0.2.10
                    - network: '2001:db8:2::'
                      prefix: 64
                      gateway: 2001:db8:1::10
                state: up
    Copy to Clipboard Toggle word wrap

    この手順では、すでに存在するかどうかに応じて、以下の設定で enp7s0 接続プロファイルを作成または更新します。

    • 静的 IPv4 アドレス: サブネットマスクが /24192.0.2.1
    • 静的 IPv6 アドレス - 2001:db8:1::1 (/64 サブネットマスクあり)
    • IPv4 デフォルトゲートウェイ - 192.0.2.254
    • IPv6 デフォルトゲートウェイ - 2001:db8:1::fffe
    • IPv4 DNS サーバー - 192.0.2.200
    • IPv6 DNS サーバー - 2001:db8:1::ffbb
    • DNS 検索ドメイン - example.com
    • 静的ルート:

      • 198.51.100.0/24 のゲートウェイ 192.0.2.10
      • 2001:db8:2::/64 とゲートウェイ 2001:db8:1::10
  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  1. 管理対象ノードで以下を行います。

    1. IPv4 ルートを表示します。

      # ip -4 route
      ...
      198.51.100.0/24 via 192.0.2.10 dev enp7s0
      Copy to Clipboard Toggle word wrap
    2. IPv6 ルートを表示します。

      # ip -6 route
      ...
      2001:db8:2::/64 via 2001:db8:1::10 dev enp7s0 metric 1024 pref medium
      Copy to Clipboard Toggle word wrap

第14章 代替ルートを定義するポリシーベースのルーティングの設定

デフォルトでは、RHEL のカーネルは、ルーティングテーブルを使用して宛先アドレスに基づいてネットワークパケットを転送する場所を決定します。ポリシーベースのルーティングにより、複雑なルーティングシナリオを設定できます。たとえば、送信元アドレス、パケットメタデータ、プロトコルなどのさまざまな基準に基づいてパケットをルーティングできます。

ポリシーベースのルーティングを使用して、特定のサブネットからのトラフィックに対して別のデフォルトゲートウェイを設定できます。たとえば、RHEL をルーターとして設定し、デフォルトルートを使用してすべてのトラフィックをインターネットプロバイダー A にデフォルトでルーティングできます。ただし、内部ワークステーションサブネットから受信したトラフィックはプロバイダー B にルーティングされます。

この手順では、次のネットワークトポロジーを想定しています。

policy based routing

前提条件

  • システムは、NetworkManager を使用して、ネットワークを設定します (これがデフォルトです)。
  • この手順で設定する RHEL ルーターには、4 つのネットワークインターフェイスがあります。

    • enp7s0 インターフェイスはプロバイダー A のネットワークに接続されます。プロバイダーのネットワークのゲートウェイ IP は 198.51.100.2 で、ネットワークは /30 ネットワークマスクを使用します。
    • enp1s0 インターフェイスはプロバイダー B のネットワークに接続されます。プロバイダーのネットワークのゲートウェイ IP は 192.0.2.2 で、ネットワークは /30 ネットワークマスクを使用します。
    • enp8s0 インターフェイスは、内部ワークステーションで 10.0.0.0/24 サブネットに接続されています。
    • enp9s0 インターフェイスは、会社のサーバーで 203.0.113.0/24 サブネットに接続されています。
  • 内部ワークステーションのサブネット内のホストは、デフォルトゲートウェイとして 10.0.0.1 を使用します。この手順では、この IP アドレスをルーターの enp8s0 ネットワークインターフェイスに割り当てます。
  • サーバーサブネット内のホストは、デフォルトゲートウェイとして 203.0.113.1 を使用します。この手順では、この IP アドレスをルーターの enp9s0 ネットワークインターフェイスに割り当てます。
  • デフォルトでは、firewalld サービスは有効でアクティブになっています。

手順

  1. プロバイダー A へのネットワークインターフェイスを設定します。

    # nmcli connection add type ethernet con-name Provider-A ifname enp7s0 ipv4.method manual ipv4.addresses 198.51.100.1/30 ipv4.gateway 198.51.100.2 ipv4.dns 198.51.100.200 connection.zone external
    Copy to Clipboard Toggle word wrap

    nmcli connection add コマンドでは、NetworkManager 接続プロファイルが作成されます。このコマンドでは次のオプションを使用します。

    • type ethernet: 接続タイプがイーサネットであることを定義します。
    • con-name <connection_name>: プロファイルの名前を設定します。混乱を避けるために、わかりやすい名前を使用してください。
    • ifname <network_device>: ネットワークインターフェイスを設定します。
    • ipv4.method manual: 静的 IP アドレスを設定できるようにします。
    • ipv4.addresses <IP_address>/<subnet_mask>: IPv4 アドレスとサブネットマスクを設定します。
    • ipv4.gateway <IP_address>: デフォルトゲートウェイアドレスを設定します。
    • ipv4.dns <IP_of_DNS_server>: DNS サーバーの IPv4 アドレスを設定します。
    • connection.zone <firewalld_zone>: 定義された firewalld ゾーンにネットワークインターフェイスを割り当てます。firewalld は、外部 ゾーンに割り当てられたマスカレードインターフェイスを自動的に有効にすることに注意してください。
  2. プロバイダー B へのネットワークインターフェイスを設定します。

    # nmcli connection add type ethernet con-name Provider-B ifname enp1s0 ipv4.method manual ipv4.addresses 192.0.2.1/30 ipv4.routes "0.0.0.0/0 192.0.2.2 table=5000" connection.zone external
    Copy to Clipboard Toggle word wrap

    このコマンドは、デフォルトゲートウェイを設定する ipv4.gateway の代わりに、ipv4.routes パラメーターを使用します。これは、この接続のデフォルトゲートウェイを、デフォルトのルーティングテーブル (5000) に割り当てるために必要です。NetworkManager は、接続がアクティブになると、この新しいルーティングテーブルを自動的に作成します。

  3. 内部ワークステーションサブネットへのネットワークインターフェイスを設定します。

    # nmcli connection add type ethernet con-name Internal-Workstations ifname enp8s0 ipv4.method manual ipv4.addresses 10.0.0.1/24 ipv4.routes "10.0.0.0/24 table=5000" ipv4.routing-rules "priority 5 from 10.0.0.0/24 table 5000" connection.zone trusted
    Copy to Clipboard Toggle word wrap

    このコマンドは、ipv4.routes パラメーターを使用して、ID が 5000 のルーティングテーブルに静的ルートを追加します。10.0.0.0/24 サブネットのこの静的ルートは、ローカルネットワークインターフェイスの IP を使用してプロバイダー B (192.0.2.1) を次のホップとして使用します。

    また、このコマンドでは ipv4.routing-rules パラメーターを使用して、優先度 5 のルーティングルールを追加します。このルーティングルールは、トラフィックを 10.0.0.0/24 サブネットからテーブル 5000 へルーティングします。値が小さいほど優先度が高くなります。

    ipv4.routing-rules パラメーターの構文は ip rule add コマンドと同じですが、ipv4.routing-rules は常に優先度を指定する必要があります。

  4. サーバーサブネットへのネットワークインターフェイスを設定します。

    # nmcli connection add type ethernet con-name Servers ifname enp9s0 ipv4.method manual ipv4.addresses 203.0.113.1/24 connection.zone trusted
    Copy to Clipboard Toggle word wrap

検証

  1. 内部ワークステーションサブネットの RHEL ホストで、以下を行います。

    1. traceroute パッケージをインストールします。

      # dnf install traceroute
      Copy to Clipboard Toggle word wrap
    2. traceroute ユーティリティーを使用して、インターネット上のホストへのルートを表示します。

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  _gateway (10.0.0.1)     0.337 ms  0.260 ms  0.223 ms
       2  192.0.2.2 (192.0.2.2)   0.884 ms  1.066 ms  1.248 ms
       ...
      Copy to Clipboard Toggle word wrap

      コマンドの出力には、ルーターがプロバイダー B のネットワークである 192.0.2.1 経由でパケットを送信することが表示されます。

  2. サーバーのサブネットの RHEL ホストで、以下を行います。

    1. traceroute パッケージをインストールします。

      # dnf install traceroute
      Copy to Clipboard Toggle word wrap
    2. traceroute ユーティリティーを使用して、インターネット上のホストへのルートを表示します。

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  _gateway (203.0.113.1)    2.179 ms  2.073 ms  1.944 ms
       2  198.51.100.2 (198.51.100.2)  1.868 ms  1.798 ms  1.549 ms
       ...
      Copy to Clipboard Toggle word wrap

      コマンドの出力には、ルーターがプロバイダー A のネットワークである 198.51.100.2 経由でパケットを送信することが表示されます。

トラブルシューティングの手順

RHEL ルーターで以下を行います。

  1. ルールのリストを表示します。

    # ip rule list
    0:	from all lookup local
    5:	from 10.0.0.0/24 lookup 5000
    32766:	from all lookup main
    32767:	from all lookup default
    Copy to Clipboard Toggle word wrap

    デフォルトでは、RHEL には、local テーブル、main テーブル、および default テーブルのルールが含まれます。

  2. テーブル 5000 のルートを表示します。

    # ip route list table 5000
    default via 192.0.2.2 dev enp1s0 proto static metric 100
    10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
    Copy to Clipboard Toggle word wrap
  3. インターフェイスとファイアウォールゾーンを表示します。

    # firewall-cmd --get-active-zones
    external
      interfaces: enp1s0 enp7s0
    trusted
      interfaces: enp8s0 enp9s0
    Copy to Clipboard Toggle word wrap
  4. external ゾーンでマスカレードが有効になっていることを確認します。

    # firewall-cmd --info-zone=external
    external (active)
      target: default
      icmp-block-inversion: no
      interfaces: enp1s0 enp7s0
      sources:
      services: ssh
      ports:
      protocols:
      masquerade: yes
      ...
    Copy to Clipboard Toggle word wrap

ポリシーベースのルーティングを使用して、特定のサブネットからのトラフィックに対して別のデフォルトゲートウェイを設定できます。たとえば、RHEL をルーターとして設定し、デフォルトルートを使用してすべてのトラフィックをインターネットプロバイダー A にデフォルトでルーティングできます。ただし、内部ワークステーションサブネットから受信したトラフィックはプロバイダー B にルーティングされます。

ポリシーベースのルーティングをリモートで複数のノードに設定するには、network RHEL システムロールを使用できます。

この手順では、次のネットワークトポロジーを想定しています。

policy based routing

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • 管理対象ノードは、NetworkManager および firewalld サービスを使用します。
  • 設定する管理対象ノードには、次の 4 つのネットワークインターフェイスがあります。

    • enp7s0 インターフェイスはプロバイダー A のネットワークに接続されます。プロバイダーのネットワークのゲートウェイ IP は 198.51.100.2 で、ネットワークは /30 ネットワークマスクを使用します。
    • enp1s0 インターフェイスはプロバイダー B のネットワークに接続されます。プロバイダーのネットワークのゲートウェイ IP は 192.0.2.2 で、ネットワークは /30 ネットワークマスクを使用します。
    • enp8s0 インターフェイスは、内部ワークステーションで 10.0.0.0/24 サブネットに接続されています。
    • enp9s0 インターフェイスは、会社のサーバーで 203.0.113.0/24 サブネットに接続されています。
  • 内部ワークステーションのサブネット内のホストは、デフォルトゲートウェイとして 10.0.0.1 を使用します。この手順では、この IP アドレスをルーターの enp8s0 ネットワークインターフェイスに割り当てます。
  • サーバーサブネット内のホストは、デフォルトゲートウェイとして 203.0.113.1 を使用します。この手順では、この IP アドレスをルーターの enp9s0 ネットワークインターフェイスに割り当てます。

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configuring policy-based routing
      hosts: managed-node-01.example.com
      tasks:
        - name: Routing traffic from a specific subnet to a different default gateway
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: Provider-A
                interface_name: enp7s0
                type: ethernet
                autoconnect: True
                ip:
                  address:
                    - 198.51.100.1/30
                  gateway4: 198.51.100.2
                  dns:
                    - 198.51.100.200
                state: up
                zone: external
    
              - name: Provider-B
                interface_name: enp1s0
                type: ethernet
                autoconnect: True
                ip:
                  address:
                    - 192.0.2.1/30
                  route:
                    - network: 0.0.0.0
                      prefix: 0
                      gateway: 192.0.2.2
                      table: 5000
                state: up
                zone: external
    
              - name: Internal-Workstations
                interface_name: enp8s0
                type: ethernet
                autoconnect: True
                ip:
                  address:
                    - 10.0.0.1/24
                  route:
                    - network: 10.0.0.0
                      prefix: 24
                      table: 5000
                  routing_rule:
                    - priority: 5
                      from: 10.0.0.0/24
                      table: 5000
                state: up
                zone: trusted
    
              - name: Servers
                interface_name: enp9s0
                type: ethernet
                autoconnect: True
                ip:
                  address:
                    - 203.0.113.1/24
                state: up
                zone: trusted
    Copy to Clipboard Toggle word wrap

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  1. 内部ワークステーションサブネットの RHEL ホストで、以下を行います。

    1. traceroute パッケージをインストールします。

      # dnf install traceroute
      Copy to Clipboard Toggle word wrap
    2. traceroute ユーティリティーを使用して、インターネット上のホストへのルートを表示します。

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  _gateway (10.0.0.1)     0.337 ms  0.260 ms  0.223 ms
       2  192.0.2.1 (192.0.2.1)   0.884 ms  1.066 ms  1.248 ms
       ...
      Copy to Clipboard Toggle word wrap

      コマンドの出力には、ルーターがプロバイダー B のネットワークである 192.0.2.1 経由でパケットを送信することが表示されます。

  2. サーバーのサブネットの RHEL ホストで、以下を行います。

    1. traceroute パッケージをインストールします。

      # dnf install traceroute
      Copy to Clipboard Toggle word wrap
    2. traceroute ユーティリティーを使用して、インターネット上のホストへのルートを表示します。

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  _gateway (203.0.113.1)    2.179 ms  2.073 ms  1.944 ms
       2  198.51.100.2 (198.51.100.2)  1.868 ms  1.798 ms  1.549 ms
       ...
      Copy to Clipboard Toggle word wrap

      コマンドの出力には、ルーターがプロバイダー A のネットワークである 198.51.100.2 経由でパケットを送信することが表示されます。

  3. RHEL システムロールを使用して設定した RHEL ルーターで、次の手順を実行します。

    1. ルールのリストを表示します。

      # ip rule list
      0:      from all lookup local
      5:    from 10.0.0.0/24 lookup 5000
      32766:  from all lookup main
      32767:  from all lookup default
      Copy to Clipboard Toggle word wrap

      デフォルトでは、RHEL には、local テーブル、main テーブル、および default テーブルのルールが含まれます。

    2. テーブル 5000 のルートを表示します。

      # ip route list table 5000
      default via 192.0.2.2 dev enp1s0 proto static metric 100
      10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
      Copy to Clipboard Toggle word wrap
    3. インターフェイスとファイアウォールゾーンを表示します。

      # firewall-cmd --get-active-zones
      external
        interfaces: enp1s0 enp7s0
      trusted
        interfaces: enp8s0 enp9s0
      Copy to Clipboard Toggle word wrap
    4. external ゾーンでマスカレードが有効になっていることを確認します。

      # firewall-cmd --info-zone=external
      external (active)
        target: default
        icmp-block-inversion: no
        interfaces: enp1s0 enp7s0
        sources:
        services: ssh
        ports:
        protocols:
        masquerade: yes
        ...
      Copy to Clipboard Toggle word wrap

第15章 hostnamectl を使用したホスト名の変更

hostnamectl ユーティリティーを使用してホスト名を更新できます。デフォルトでは、このユーティリティーは以下のホスト名タイプを設定します。

  • 静的ホスト名: /etc/hostname ファイルに保存されます。通常、サービスはこの名前をホスト名として使用します。
  • Pretty hostname: Proxy server in data center A などの説明的な名前。
  • 一時的なホスト名: 通常ネットワーク設定から受信されるフォールバック値。

手順

  1. オプション: 現在のホスト名設定を表示します。

    # hostnamectl status --static
    old-hostname.example.com
    Copy to Clipboard Toggle word wrap
  2. 新しいホスト名を設定します。

    # hostnamectl set-hostname new-hostname.example.com
    Copy to Clipboard Toggle word wrap

    このコマンドは、static と transient のホスト名を新しい値に設定します。特定のタイプのみを設定するには、--static オプション、--pretty オプション、または --transient オプションをコマンドに渡します。

  3. hostnamectl ユーティリティーは、systemd-hostnamed を自動的に再起動して、新しい名前をアクティブにします。変更を有効にするには、ホストを再起動します。

    # reboot
    Copy to Clipboard Toggle word wrap

    あるいは、そのホスト名を使用するサービスがわかっている場合は、次のようにします。

    1. サービスの起動時にホスト名のみを読み取るすべてのサービスを再起動します。

      # systemctl restart <service_name>
      Copy to Clipboard Toggle word wrap
    2. 変更を反映するには、アクティブなシェルユーザーを再ログインする必要があります。

検証

  • ホスト名を表示します。

    # hostnamectl status --static
    new-hostname.example.com
    Copy to Clipboard Toggle word wrap

第16章 NetworkManager 接続の DHCP タイムアウト動作の設定

DHCP (Dynamic Host Configuration Protocol) クライアントは、クライアントがネットワークに接続するたびに、動的 IP アドレスと対応する設定情報を DHCP サーバーに要求します。

接続プロファイルで DHCP を有効にすると、NetworkManager はデフォルトでこの要求が完了するまで 45 秒間待機します。

注記

Red Hat は NetworkManager 内部の DHCP クライアントのみをサポートします。

前提条件

  • DHCP を使用する接続がホストに設定されている。

手順

  1. オプション: ipv4.dhcp-timeout プロパティーおよび ipv6.dhcp-timeout プロパティーを設定します。たとえば、両方のオプションを 30 秒に設定するには、次のコマンドを実行します。

    # nmcli connection modify <connection_name> ipv4.dhcp-timeout 30 ipv6.dhcp-timeout 30
    Copy to Clipboard Toggle word wrap

    パラメーターを infinity に設定すると、成功するまで NetworkManager が IP アドレスのリクエストおよび更新を停止しないようにします。

  2. 必要に応じて、タイムアウト前に NetworkManager が IPv4 アドレスを受信しない場合にこの動作を設定します。

    # nmcli connection modify <connection_name> ipv4.may-fail <value>
    Copy to Clipboard Toggle word wrap

    ipv4.may-fail オプションを以下のように設定します。

    • yes、接続のステータスは IPv6 設定により異なります。

      • IPv6 設定が有効になり、成功すると、NetworkManager は IPv6 接続をアクティブにし、IPv4 接続のアクティブ化を試みなくなります。
      • IPv6 設定が無効であるか設定されていないと、接続は失敗します。
    • いいえ、接続は非アクティブになります。この場合は、以下のようになります。

      • 接続の autoconnect プロパティーが有効になっている場合、NetworkManager は、autoconnect-retries プロパティーに設定された回数だけ、接続のアクティベーションを再試行します。デフォルト値は 4 です。
      • それでも接続が DHCP アドレスを取得できないと、自動アクティベーションは失敗します。5 分後に自動接続プロセスが再開され、DHCP サーバーから IP アドレスを取得するようになりました。
  3. 必要に応じて、タイムアウト前に NetworkManager が IPv6 アドレスを受信しない場合にこの動作を設定します。

    # nmcli connection modify <connection_name> ipv6.may-fail <value>
    Copy to Clipboard Toggle word wrap

第17章 DNS サーバーの順序の設定

ほとんどのアプリケーションは、glibc ライブラリーの getaddrinfo() 関数を使用して DNS で名前を解決します。デフォルトでは、glibc はすべての DNS 要求を、/etc/resolv.conf ファイルで指定された最初の DNS サーバーに送信します。このサーバーが応答しない場合、{ProductShortName} はこのファイル内にある他のすべてのネームサーバーを試します。NetworkManager を使用すると、/etc/resolv.conf 内の DNS サーバーの順序に影響を与えることができます。

17.1. NetworkManager が /etc/resolv.conf で DNS サーバーを順序付ける方法

NetworkManager は、以下のルールに基づいて /etc/resolv.conf ファイルの DNS サーバーの順序を付けます。

  • 接続プロファイルが 1 つしか存在しない場合、NetworkManager は、その接続で指定された IPv4 および IPv6 の DNS サーバーの順序を使用します。
  • 複数の接続プロファイルがアクティベートされると、NetworkManager は DNS の優先度の値に基づいて DNS サーバーを順序付けます。DNS の優先度を設定すると、NetworkManager の動作は、dns パラメーターに設定した値によって異なります。このパラメーターは、/etc/NetworkManager/NetworkManager.conf ファイルの [main] セクションで設定できます。

    • dns=default または dns パラメーターが設定されていないと、以下のようになります。

      NetworkManager は、各接続の ipv4.dns-priority パラメーターおよび ipv6.dns-priority パラメーターに基づいて、複数の接続から DNS サーバーを順序付けます。

      値を指定しない場合、または ipv4.dns-priority および ipv6.dns-priority0 に設定すると、NetworkManager はグローバルのデフォルト値を使用します。

    • dns=dnsmasq または dns=systemd-resolved:

      この設定のいずれかを使用すると、NetworkManager は dnsmasq127.0.0.1 に設定するか、127.0.0.53nameserver エントリーとして /etc/resolv.conf ファイルに設定します。

      dnsmasq サービスと systemd-resolved サービスはどちらも、NetworkManager 接続で設定された検索ドメインのクエリーをその接続で指定された DNS サーバーに転送し、他のドメインへのクエリーをデフォルトルートを持つ接続に転送します。複数の接続に同じ検索ドメインが設定されている場合は、dnsmasq および systemd-resolved が、このドメインのクエリーを、優先度の値が最も低い接続に設定された DNS サーバーへ転送します。

NetworkManager は、接続に以下のデフォルト値を使用します。

  • VPN 接続の場合は 50
  • 他の接続の場合は 100

グローバルのデフォルトおよび接続固有の ipv4.dns-priority パラメーターおよび ipv6.dns-priority パラメーターの両方を -2147483647 から 2147483647 までの値に設定できます。

  • 値が小さいほど優先度が高くなります。
  • 負の値は、値が大きい他の設定を除外する特別な効果があります。たとえば、優先度が負の値の接続が 1 つでも存在する場合は、NetworkManager が、優先度が最も低い接続プロファイルで指定された DNS サーバーのみを使用します。
  • 複数の接続の DNS の優先度が同じ場合、NetworkManager は以下の順番で DNS の優先順位を決定します。

    1. VPN 接続。
    2. アクティブなデフォルトルートとの接続。アクティブなデフォルトルートは、メトリックスが最も低いデフォルトルートです。

17.2. NetworkManager 全体でデフォルトの DNS サーバー優先度の値の設定

NetworkManager は、接続に以下の DNS 優先度のデフォルト値を使用します。

  • VPN 接続の場合は 50
  • 他の接続の場合は 100

これらのシステム全体のデフォルトは、IPv4 接続および IPv6 接続のカスタムデフォルト値で上書きできます。

手順

  1. /etc/NetworkManager/NetworkManager.conf ファイルを編集します。

    1. [connection] セクションが存在しない場合は追加します。

      [connection]
      Copy to Clipboard Toggle word wrap
    2. [connection] セクションにカスタムのデフォルト値を追加します。たとえば、IPv4 と IPv6 の両方で新しいデフォルトを 200 に設定するには、以下を追加します。

      ipv4.dns-priority=200
      ipv6.dns-priority=200
      Copy to Clipboard Toggle word wrap

      パラメーターは、-2147483647 から 2147483647 までの値に設定できます。パラメーターを 0 に設定すると、組み込みのデフォルト (VPN 接続の場合は 50、他の接続の場合は 100) が有効になります。

  2. NetworkManager サービスを再読み込みします。

    # systemctl reload NetworkManager
    Copy to Clipboard Toggle word wrap

17.3. NetworkManager 接続の DNS 優先度の設定

特定の DNS サーバーの順序が必要な場合は、接続プロファイルに優先度の値を設定できます。NetworkManager はこれらの値を使用して、サービスが /etc/resolv.conf ファイルを作成または更新する際にサーバーを順序付けます。

DNS 優先度の設定は、異なる DNS サーバーが設定された複数の接続がある場合にのみ有効であることに注意してください。複数の DNS サーバーが設定された接続が 1 つしかない場合は、接続プロファイルで DNS サーバーを優先順に手動で設定します。

前提条件

  • システムに NetworkManager の接続が複数設定されている。
  • システムで、/etc/NetworkManager/NetworkManager.conf ファイルに dns パラメーターが設定されていないか、そのパラメーターが default に設定されている。

手順

  1. 必要に応じて、利用可能な接続を表示します。

    # nmcli connection show
    NAME           UUID                                  TYPE      DEVICE
    Example_con_1  d17ee488-4665-4de2-b28a-48befab0cd43  ethernet  enp1s0
    Example_con_2  916e4f67-7145-3ffa-9f7b-e7cada8f6bf7  ethernet  enp7s0
    ...
    Copy to Clipboard Toggle word wrap
  2. ipv4.dns-priority パラメーターおよび ipv6.dns-priority パラメーターを設定します。たとえば、両方のパラメーターを 10 に設定するには、次のように入力します。

    # nmcli connection modify <connection_name> ipv4.dns-priority 10 ipv6.dns-priority 10
    Copy to Clipboard Toggle word wrap
  3. 必要に応じて、他のコネクションに対しても 1 つ前の手順を繰り返します。
  4. 更新した接続を再度アクティブにします。

    # nmcli connection up <connection_name>
    Copy to Clipboard Toggle word wrap

検証

  • /etc/resolv.conf ファイルの内容を表示して、DNS サーバーの順序が正しいことを確認します。

    # cat /etc/resolv.conf
    Copy to Clipboard Toggle word wrap

17.4. 特定のインターフェイスを介して DNS トラフィックをルーティングする

NetworkManager は、システム内の DNS サーバーを設定するためのさまざまなメカニズムをサポートしています。これには、/etc/resolv.conf ファイルへの設定の追加や、systemd-resolveddnsmasqdnsconfd などの DNS サービスの設定が含まれます。

接続プロファイルに記載されている各 DNS サーバーは、特定のネットワークインターフェイスに関連付けられています。DNS バックエンドサービス systemd-resolved および dnsmasq により、各 DNS ネームサーバーは正しいネットワークインターフェイス経由でのみアクセス可能になります。ただし、他のバックエンドサービスではこの機能はサポートされていません。これに関連して、NetworkManager には、各ネームサーバーに正しいインターフェイス経由でのみアクセスできるように専用ルートを自動的に追加する機能があります。この機能を使用するには、ipv4.routed-dns および ipv6.routed-dns プロパティーを設定します。

サンプルシナリオ:

  • 接続プロファイル 1 <example-connection-1>:

    • デフォルトケートウェイ: 192.0.2.254
    • DNS サーバー: 10.0.0.1
    • 検索ドメイン: example-domain.com
  • 接続プロファイル 2 <example-connection-2> :

    • デフォルトゲートウェイ: 198.51.100.254 (このゲートウェイは 10.0.0.0/24 ネットワークにアクセスできません)
    • DNS サーバー: 203.0.113.1

この例では、enp1s0 および enp7s0 ネットワークインターフェイスを介して接続される <example-connection-1><example-connection-2> の 2 つの接続プロファイルがあります。2 番目のプロファイル <example-connection-2> が最初に接続された場合、この接続のデフォルトゲートウェイ 198.51.100.254 のメトリクスの方が引っ杭ため、最初のプロファイルよりも優先されます。その結果、RHEL は最初のプロファイルの DNS サーバー 10.0.0.1 に接続する際に、2 番目の接続のデフォルトゲートウェイを使用します。その結果、DNS 解決は失敗します。この問題を解決するには、両方の接続プロファイルに対して ipv4.routed-dns 設定を有効にして、NetworkManager が正しいインターフェイス (この場合は enp1s0) を介して 10.0.0.1 DNS サーバーの専用ルートを作成するようにします。

前提条件

  • 接続プロファイルがある。

手順

  1. ネームサーバーへのルートの作成を有効にするために、接続プロファイルを変更します。

    1. 接続プロファイル 1 の場合は、次のように入力します。

      # nmcli connection modify <example-connection-1> ipv4.routed-dns yes
      Copy to Clipboard Toggle word wrap
    2. 接続プロファイル 2 の場合は、次のように入力します。

      # nmcli connection modify <example-connection-2> ipv4.routed-dns yes
      Copy to Clipboard Toggle word wrap
  2. 接続を再度有効にします。

    # nmcli connection up <example-connection-1>
    
    # nmcli connection up <example-connection-2>
    Copy to Clipboard Toggle word wrap

検証

  • IP アドレスに到達するためのルートを表示します。

    # ip route get 203.0.113.1
    203.0.113.1  dev  enp1s0  table  20053  src  10.0.0.1  uid  0
    Copy to Clipboard Toggle word wrap

    このコマンドは、ネームサーバーに正しいインターフェイス経由でアクセスしているかどうかを確認し、DNS サーバーのすべてのルートを特別なルーティングテーブル 20053 に配置するポリシールーティングメソッドを使用します。

デフォルトでは、Red Hat Enterprise Linux (RHEL) は、すべての DNS リクエストを、/etc/resolv.conf ファイルで指定されている最初の DNS サーバーに送信します。このサーバーが応答しない場合、RHEL は動作するサーバーが見つかるまでこのファイル内の次のサーバーを試行します。ある DNS サーバーがすべてのドメインを解決できない環境では、管理者は、特定のドメインの DNS 要求を選択した DNS サーバーに送信するように RHEL を設定できます。

たとえば、サーバーを仮想プライベートネットワーク (VPN) に接続し、VPN 内のホストが example.com ドメインを使用するとします。この場合、次の方法で DNS クエリーを処理するように RHEL を設定できます。

  • example.com の DNS 要求のみを VPN ネットワーク内の DNS サーバーに送信します。
  • 他のすべての要求は、デフォルトゲートウェイを使用して接続プロファイルで設定されている DNS サーバーに送信します。

dnsmasq のインスタンスを開始するように NetworkManager を設定できます。次に、この DNS キャッシュサーバーは、loopback デバイスのポート 53 をリッスンします。したがって、このサービスはローカルシステムからのみ到達でき、ネットワークからは到達できません。

この設定では、NetworkManager は nameserver 127.0.0.1 エントリーを /etc/resolv.conf ファイルに追加し、dnsmasq は DNS 要求を NetworkManager 接続プロファイルで指定された対応する DNS サーバーに動的にルーティングします。

前提条件

  • システムに NetworkManager の接続が複数設定されている。
  • 特定のドメインを解決する役割を担う接続に対して、DNS サーバーと検索ドメインが設定されている。

    たとえば、VPN 接続で指定された DNS サーバーが example.com ドメインのクエリーを確実に解決できるようにするには、次の設定が必要です。

    • example.com を解決できる DNS サーバー。DHCP サーバーによってこの情報を動的に提供することも、VPN 接続プロファイルで ipv4.dns および ipv6.dns パラメーターを設定することもできます。
    • example.com に設定された検索ドメイン。DHCP サーバーによってこの情報を動的に提供することも、VPN 接続プロファイルで ipv4.dns-search および ipv6.dns-search パラメーターを設定することもできます。
  • dnsmasq サービスが実行されていないか、localhost とは異なるインターフェイスでリッスンするように設定されています。

手順

  1. dnsmasq パッケージをインストールします。

    # dnf install dnsmasq
    Copy to Clipboard Toggle word wrap
  2. /etc/NetworkManager/NetworkManager.conf ファイルを編集し、[main] セクションに以下のエントリーを設定します。

    dns=dnsmasq
    Copy to Clipboard Toggle word wrap
  3. NetworkManager サービスを再読み込みします。

    # systemctl reload NetworkManager
    Copy to Clipboard Toggle word wrap

検証

  1. NetworkManager ユニットの systemd ジャーナルで、サービスが別の DNS サーバーを使用しているドメインを検索します。

    # journalctl -xeu NetworkManager
    ...
    Jun 02 13:30:17 <client_hostname>_ dnsmasq[5298]: using nameserver 198.51.100.7#53 for domain example.com
    ...
    Copy to Clipboard Toggle word wrap
  2. tcpdump パケットスニファを使用して、DNS 要求の正しいルートを確認します。

    1. tcpdump パッケージをインストールします。

      # dnf install tcpdump
      Copy to Clipboard Toggle word wrap
    2. 1 つのターミナルで tcpdump を起動し、すべてのインターフェイスで DNS トラフィックを取得します。

      # tcpdump -i any port 53
      Copy to Clipboard Toggle word wrap
    3. 別のターミナルで、例外が存在するドメインと別のドメインのホスト名を解決します。次に例を示します。

      # host -t A www.example.com
      # host -t A www.redhat.com
      Copy to Clipboard Toggle word wrap
    4. tcpdump 出力で、Red Hat Enterprise Linux が example.com ドメインの DNS クエリーのみを指定された DNS サーバーに、対応するインターフェイスを通じて送信していることを確認します。

      ...
      13:52:42.234533 tun0   Out IP server.43534 > 198.51.100.7.domain: 50121+ A? www.example.com. (33)
      ...
      13:52:57.753235 enp1s0 Out IP server.40864 > 192.0.2.1.domain: 6906+ A? www.redhat.com. (33)
      ...
      Copy to Clipboard Toggle word wrap

      Red Hat Enterprise Linux は、www.example.com の DNS クエリーを 198.51.100.7 の DNS サーバーに送信し、www.redhat.com のクエリーを 192.0.2.1 に送信します。

トラブルシューティング

  1. /etc/resolv.conf ファイルの nameserver エントリーが 127.0.0.1 を指していることを確認します。

    # cat /etc/resolv.conf
    nameserver 127.0.0.1
    Copy to Clipboard Toggle word wrap

    エントリーがない場合は、/etc/NetworkManager/NetworkManager.conf ファイルの dns パラメーターを確認します。

  2. dnsmasq サービスが loopback デバイスのポート 53 でリッスンしていることを確認します。

    # ss -tulpn | grep "127.0.0.1:53"
    udp  UNCONN 0  0    127.0.0.1:53   0.0.0.0:*    users:(("dnsmasq",pid=7340,fd=18))
    tcp  LISTEN 0  32   127.0.0.1:53   0.0.0.0:*    users:(("dnsmasq",pid=7340,fd=19))
    Copy to Clipboard Toggle word wrap

    サービスが 127.0.0.1:53 をリッスンしていない場合は、NetworkManager ユニットのジャーナルエントリーを確認します。

    # journalctl -u NetworkManager
    Copy to Clipboard Toggle word wrap

管理者は、IEEE 802.1X 標準に基づいてポートベースのネットワークアクセス制御 (NAC) を使用して、承認されていない LAN および Wi-Fi クライアントからネットワークを保護します。ネットワークで Extensible Authentication Protocol Transport Layer Security (EAP-TLS) メカニズムを使用している場合は、このネットワークに対してクライアントを認証するための証明書が必要です。

19.1. nmcli を使用した既存のイーサネット接続での 802.1X ネットワーク認証の設定

nmcli ユーティリティーを使用して、コマンドラインで 802.1X ネットワーク認証によるイーサネット接続を設定できます。

前提条件

  • ネットワークは 802.1X ネットワーク認証をサポートしている。
  • イーサネット接続プロファイルが NetworkManager に存在し、有効な IP 設定があります。
  • TLS 認証に必要な以下のファイルがクライアントにある。

    • クライアント鍵が保存されているのは /etc/pki/tls/private/client.key ファイルで、そのファイルは所有されており、root ユーザーのみが読み取り可能です。
    • クライアント証明書は /etc/pki/tls/certs/client.crt に保存されます。
    • 認証局 (CA) 証明書は、/etc/pki/tls/certs/ca.crt ファイルに保存されています。
  • wpa_supplicant パッケージがインストールされている。

手順

  1. EAP (Extensible Authentication Protocol) を tls に設定し、クライアント証明書およびキーファイルへのパスを設定します。

    # nmcli connection modify enp1s0 802-1x.eap tls 802-1x.client-cert /etc/pki/tls/certs/client.crt 802-1x.private-key /etc/pki/tls/certs/certs/client.key
    Copy to Clipboard Toggle word wrap

    1 つのコマンドで、802-1x.eap パラメーター、802-1x.client-cert パラメーター、および 802-1x.private-key パラメーターを設定する必要があります。

  2. CA 証明書のパスを設定します。

    # nmcli connection modify enp1s0 802-1x.ca-cert /etc/pki/tls/certs/ca.crt
    Copy to Clipboard Toggle word wrap
  3. 証明書で使用するユーザーの ID を設定します。

    # nmcli connection modify enp1s0 802-1x.identity user@example.com
    Copy to Clipboard Toggle word wrap
  4. オプション: 設定にパスワードを保存します。

    # nmcli connection modify enp1s0 802-1x.private-key-password password
    Copy to Clipboard Toggle word wrap
    重要

    デフォルトでは、NetworkManager はディスク上の接続プロファイルにパスワードをクリアテキストで保存します。このファイルを読み取ることができるのは root ユーザーだけです。ただし、設定ファイルのクリアテキストパスワードはセキュリティーリスクとなる可能性があります。

    セキュリティーを強化するには、802-1x.password-flags パラメーターを agent-owned に設定します。この設定では、GNOME デスクトップ環境または nm-applet が実行中のサーバーで、NetworkManager はキーリングのロックを解除してから、これらのサービスからパスワードを取得します。その他の場合は、NetworkManager によりパスワードの入力が求められます。

  5. 接続プロファイルをアクティベートします。

    # nmcli connection up enp1s0
    Copy to Clipboard Toggle word wrap

検証

  • ネットワーク認証が必要なネットワーク上のリソースにアクセスします。

19.2. nmstatectl を使用した 802.1X ネットワーク認証による静的イーサネット接続の設定

nmstatectl ユーティリティーを使用して、Nmstate API を介して、802.1X ネットワーク認証によるイーサネット接続を設定します。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

注記

nmstate ライブラリーは、TLS Extensible Authentication Protocol (EAP) 方式のみをサポートします。

前提条件

  • ネットワークは 802.1X ネットワーク認証をサポートしている。
  • 管理ノードは NetworkManager を使用している。
  • TLS 認証に必要な以下のファイルがクライアントにある。

    • クライアント鍵が保存されているのは /etc/pki/tls/private/client.key ファイルで、そのファイルは所有されており、root ユーザーのみが読み取り可能です。
    • クライアント証明書は /etc/pki/tls/certs/client.crt に保存されます。
    • 認証局 (CA) 証明書は、/etc/pki/tls/certs/ca.crt ファイルに保存されています。

手順

  1. 以下の内容を含む YAML ファイル (例: ~/create-ethernet-profile.yml) を作成します。

    ---
    interfaces:
    - name: enp1s0
      type: ethernet
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
      802.1x:
        ca-cert: /etc/pki/tls/certs/ca.crt
        client-cert: /etc/pki/tls/certs/client.crt
        eap-methods:
          - tls
        identity: client.example.org
        private-key: /etc/pki/tls/private/client.key
        private-key-password: password
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: enp1s0
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: enp1s0
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    これらの設定では、次の設定を使用して enp1s0 デバイスのイーサネット接続プロファイルを定義します。

    • 静的 IPv4 アドレス: サブネットマスクが /24192.0.2.1
    • 静的 IPv6 アドレス - 2001:db8:1::1 (/64 サブネットマスクあり)
    • IPv4 デフォルトゲートウェイ - 192.0.2.254
    • IPv6 デフォルトゲートウェイ - 2001:db8:1::fffe
    • IPv4 DNS サーバー - 192.0.2.200
    • IPv6 DNS サーバー - 2001:db8:1::ffbb
    • DNS 検索ドメイン - example.com
    • TLS EAP プロトコルを使用した 802.1X ネットワーク認証
  2. 設定をシステムに適用します。

    # nmstatectl apply ~/create-ethernet-profile.yml
    Copy to Clipboard Toggle word wrap

検証

  • ネットワーク認証が必要なネットワーク上のリソースにアクセスします。

ネットワークアクセス制御 (NAC) は、不正なクライアントからネットワークを保護します。クライアントがネットワークにアクセスできるようにするために、認証に必要な詳細を NetworkManager 接続プロファイルで指定できます。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

Ansible Playbook を使用して秘密鍵、証明書、および CA 証明書をクライアントにコピーしてから、network RHEL システムロールを使用して 802.1X ネットワーク認証による接続プロファイルを設定できます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • ネットワークは 802.1X ネットワーク認証をサポートしている。
  • 管理対象ノードが NetworkManager を使用している。
  • TLS 認証に必要な次のファイルがコントロールノードに存在する。

    • クライアントキーが /srv/data/client.key ファイルに保存されている。
    • クライアント証明書が /srv/data/client.crt ファイルに保存されている。
    • 認証局 (CA) 証明書が /srv/data/ca.crt ファイルに保存されている。

手順

  1. 機密性の高い変数を暗号化されたファイルに保存します。

    1. vault を作成します。

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create コマンドでエディターが開いたら、機密データを <key>: <value> 形式で入力します。

      pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
  2. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure an Ethernet connection with 802.1X authentication
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Copy client key for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0600
    
        - name: Copy client certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - name: Ethernet connection profile with static IP address settings and 802.1X
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  address:
                    - 192.0.2.1/24
                    - 2001:db8:1::1/64
                  gateway4: 192.0.2.254
                  gateway6: 2001:db8:1::fffe
                  dns:
                    - 192.0.2.200
                    - 2001:db8:1::ffbb
                  dns_search:
                    - example.com
                ieee802_1x:
                  identity: <user_name>
                  eap: tls
                  private_key: "/etc/pki/tls/private/client.key"
                  private_key_password: "{{ pwd }}"
                  client_cert: "/etc/pki/tls/certs/client.crt"
                  ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt"
                  domain_suffix_match: example.com
                state: up
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    ieee802_1x
    この変数には、802.1X 関連の設定を含めます。
    eap: tls
    Extensible Authentication Protocol (EAP) に証明書ベースの TLS 認証方式を使用するようにプロファイルを設定します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  3. Playbook の構文を検証します。

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  4. Playbook を実行します。

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  • ネットワーク認証が必要なネットワーク上のリソースにアクセスします。

19.4. network RHEL システムロールを使用した 802.1X ネットワーク認証による Wi-Fi 接続の設定

ネットワークアクセス制御 (NAC) は、不正なクライアントからネットワークを保護します。クライアントがネットワークにアクセスできるようにするために、認証に必要な詳細を NetworkManager 接続プロファイルで指定できます。Ansible と network RHEL システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

Ansible Playbook を使用して秘密鍵、証明書、および CA 証明書をクライアントにコピーしてから、network RHEL システムロールを使用して 802.1X ネットワーク認証による接続プロファイルを設定できます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • ネットワークは 802.1X ネットワーク認証をサポートしている。
  • マネージドノードに wpa_supplicant パッケージをインストールしました。
  • DHCP は、管理対象ノードのネットワークで使用できる。
  • TLS 認証に必要な以下のファイルがコントロールノードにある。

    • クライアントキーが /srv/data/client.key ファイルに保存されている。
    • クライアント証明書が /srv/data/client.crt ファイルに保存されている。
    • CA 証明書は /srv/data/ca.crt ファイルに保存されます。

手順

  1. 機密性の高い変数を暗号化されたファイルに保存します。

    1. vault を作成します。

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create コマンドでエディターが開いたら、機密データを <key>: <value> 形式で入力します。

      pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
  2. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure a wifi connection with 802.1X authentication
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Copy client key for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0400
    
        - name: Copy client certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - name: Wifi connection profile with dynamic IP address settings and 802.1X
          ansible.builtin.import_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: Wifi connection profile with dynamic IP address settings and 802.1X
                interface_name: wlp1s0
                state: up
                type: wireless
                autoconnect: yes
                ip:
                  dhcp4: true
                  auto6: true
                wireless:
                  ssid: "Example-wifi"
                  key_mgmt: "wpa-eap"
                ieee802_1x:
                  identity: <user_name>
                  eap: tls
                  private_key: "/etc/pki/tls/private/client.key"
                  private_key_password: "{{ pwd }}"
                  private_key_password_flags: none
                  client_cert: "/etc/pki/tls/certs/client.crt"
                  ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt"
                  domain_suffix_match: "example.com"
                  network_allow_restart: true
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    ieee802_1x
    この変数には、802.1X 関連の設定を含めます。
    eap: tls
    Extensible Authentication Protocol (EAP) に証明書ベースの TLS 認証方式を使用するようにプロファイルを設定します。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  3. Playbook の構文を検証します。

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  4. Playbook を実行します。

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

IEEE 802.1X 標準では、許可されていないクライアントからネットワークを保護するためのセキュアな認証および認可方法を定義しています。hostapd サービスと FreeRADIUS を使用すると、ネットワークにネットワークアクセス制御 (NAC) を提供できます。

注記

Red Hat では、認証のバックエンドソースとして Red Hat Identity Management (IdM) を使用した FreeRADIUS のみをサポートしています。

このドキュメントでは、RHEL ホストは、さまざまなクライアントを既存のネットワークに接続するためのブリッジとして機能します。ただし、RHEL ホストは、認証されたクライアントのみにネットワークへのアクセスを許可します。

20.1. 前提条件

  • freeradius および freeradius-ldap パッケージのクリーンインストール。

    パッケージがすでにインストールされている場合は、/etc/raddb/ ディレクトリーを削除し、パッケージをアンインストールしてから再度インストールします。/etc/raddb/ ディレクトリー内の権限とシンボリックリンクが異なるため、dnf reinstall コマンドを使用してパッケージを再インストールしないでください。

  • FreeRADIUS を設定するホストが IdM ドメイン内のクライアント である。

20.2. オーセンティケーターにブリッジを設定する

ネットワークブリッジは、MAC アドレスのテーブルに基づいてホストとネットワーク間のトラフィックを転送するリンク層デバイスです。RHEL を 802.1X オーセンティケーターとして設定する場合は、認証を実行するインターフェイスと LAN インターフェイスの両方をブリッジに追加します。

前提条件

  • サーバーには複数のイーサネットインターフェイスがあります。

手順

  1. ブリッジインターフェイスが存在しない場合は、作成します。

    # nmcli connection add type bridge con-name br0 ifname br0
    Copy to Clipboard Toggle word wrap
  2. イーサネットインターフェイスをブリッジに割り当てます。

    # nmcli connection add type ethernet port-type bridge con-name br0-port1 ifname enp1s0 controller br0
    # nmcli connection add type ethernet port-type bridge con-name br0-port2 ifname enp7s0 controller br0
    # nmcli connection add type ethernet port-type bridge con-name br0-port3 ifname enp8s0 controller br0
    # nmcli connection add type ethernet port-type bridge con-name br0-port4 ifname enp9s0 controller br0
    Copy to Clipboard Toggle word wrap
  3. ブリッジが拡張認証プロトコル over LAN (EAPOL) パケットを転送できるようにします。

    # nmcli connection modify br0 group-forward-mask 8
    Copy to Clipboard Toggle word wrap
  4. ブリッジデバイスで Spanning Tree Protocol (STP) を無効にします。

    # *nmcli connection modify br0 stp off"
    Copy to Clipboard Toggle word wrap
  5. ポートを自動的にアクティブ化するように接続を設定します。

    # nmcli connection modify br0 connection.autoconnect-ports 1
    Copy to Clipboard Toggle word wrap
  6. 接続をアクティベートします。

    # nmcli connection up br0
    Copy to Clipboard Toggle word wrap

検証

  1. 特定のブリッジのポートであるイーサネットデバイスのリンクステータスを表示します。

    # ip link show master br0
    3: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap
  2. EAPOL パケットの転送が br0 デバイスで有効になっているかどうかを確認します。

    # cat /sys/class/net/br0/bridge/group_fwd_mask
    0x8
    Copy to Clipboard Toggle word wrap

    コマンドが 0x8 を返す場合、転送が有効になります。

20.3. ネットワーククライアントを安全に認証するための FreeRADIUS の設定 (EAP 使用)

FreeRADIUS は、Extensible Authentication Protocol (EAP) のさまざまな方式をサポートしています。しかし、サポートされるセキュアな状況では、EAP-TTLS (Tunneled Transport Layer Security) を使用してください。

EAP-TTLS では、クライアントが、トンネルを設定するための外部認証プロトコルとしてセキュアな TLS 接続を使用します。内部認証では、LDAP を使用して Identity Management に対して認証を行います。EAP-TTLS を使用するには、TLS サーバー証明書が必要です。

注記

デフォルトの FreeRADIUS 設定ファイルはドキュメントとして機能し、すべてのパラメーターとディレクティブを記述します。特定の機能を無効にする場合は、設定ファイルの対応する部分を削除するのではなく、コメントアウトしてください。これにより、設定ファイルと含まれているドキュメントの構造を保持できます。

前提条件

  • freeradius および freeradius-ldap パッケージがインストールされている。
  • /etc/raddb/ ディレクトリー内の設定ファイルが変更されておらず、freeradius パッケージによって提供されるものである。
  • ホストが Red Hat Identity Management (IdM) ドメインに登録されている。

手順

  1. 秘密鍵を作成し、IdM から証明書を要求します。

    # ipa-getcert request -w -k /etc/pki/tls/private/radius.key -f /etc/pki/tls/certs/radius.pem -o "root:radiusd" -m 640 -O "root:radiusd" -M 640 -T caIPAserviceCert -C 'systemctl restart radiusd.service' -N freeradius.idm.example.com -D freeradius.idm.example.com -K radius/freeradius.idm.example.com
    Copy to Clipboard Toggle word wrap

    certmonger サービスが、秘密鍵を /etc/pki/tls/private/radius.key ファイルに保存し、証明書を /etc/pki/tls/certs/radius.pem ファイルに保存して、セキュアな権限を設定します。さらに、certmonger は証明書を監視し、有効期限が切れる前に更新し、証明書の更新後に radiusd サービスを再起動します。

  2. CA が証明書を正常に発行したことを確認します。

    # ipa-getcert list -f /etc/pki/tls/certs/radius.pem
    ...
    Number of certificates and requests being tracked: 1.
    Request ID '20240918142211':
            status: MONITORING
            stuck: no
            key pair storage: type=FILE,location='/etc/pki/tls/private/radius.key'
            certificate: type=FILE,location='/etc/pki/tls/certs/radius.crt'
            ...
    Copy to Clipboard Toggle word wrap
  3. Diffie-Hellman (DH) パラメーターを使用して /etc/raddb/certs/dh ファイルを作成します。たとえば、2048 ビットの素数を持つ DH ファイルを作成するには、次のように実行します。

    # openssl dhparam -out /etc/raddb/certs/dh 2048
    Copy to Clipboard Toggle word wrap

    セキュリティー上の理由から、素数が 2048 ビット未満の DH ファイルは使用しないでください。ビット数によっては、ファイルの作成に数分かかる場合があります。

  4. /etc/raddb/mods-available/eap ファイルを編集します。

    1. tls-config tls-common ディレクティブで TLS 関連の設定を指定します。

      eap {
          ...
          tls-config tls-common {
              ...
      	private_key_file = /etc/pki/tls/private/radius.key
      	certificate_file = /etc/pki/tls/certs/radius.pem
      	ca_file = /etc/ipa/ca.crt
              ...
          }
      }
      Copy to Clipboard Toggle word wrap
    2. eap ディレクティブの default_eap_type パラメーターを ttls に設定します。

      eap {
          ...
          default_eap_type = ttls
          ...
      }
      Copy to Clipboard Toggle word wrap
    3. 安全でない EAP-MD5 認証方式を無効にするには、md5 ディレクティブをコメントアウトします。

      eap {
          ...
          # md5 {
          # }
          ...
      }
      Copy to Clipboard Toggle word wrap

      デフォルトの設定ファイルでは、他の安全でない EAP 認証方法がデフォルトでコメントアウトされていることに注意してください。

  5. /etc/raddb/sites-available/default ファイルを編集し、eap 以外のすべての認証方法をコメントアウトします。

    authenticate {
        ...
        # Auth-Type PAP {
        #     pap
        # }
    
        # Auth-Type CHAP {
        #     chap
        # }
    
        # Auth-Type MS-CHAP {
        #     mschap
        # }
    
        # mschap
    
        # digest
        ...
    }
    Copy to Clipboard Toggle word wrap

    これにより、外部認証で EAP のみが有効になり、プレーンテキスト認証方法が無効になります。

  6. /etc/raddb/sites-available/inner-tunnel ファイルを編集し、次の変更を加えます。

    1. -ldap エントリーをコメントアウトし、ldap モジュール設定を authorize ディレクティブに追加します。

      authorize {
          ...
      
          #-ldap
          ldap
          if ((ok || updated) && User-Password) {
              update {
                  control:Auth-Type := ldap
              }
          }
      
          ...
      }
      Copy to Clipboard Toggle word wrap
    2. authenticate ディレクティブ内の LDAP 認証タイプのコメントを解除します。

      authenticate {
          Auth-Type LDAP {
              ldap
          }
      }
      Copy to Clipboard Toggle word wrap
  7. ldap モジュールを有効にします。

    # ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
    Copy to Clipboard Toggle word wrap
  8. /etc/raddb/mods-available/ldap ファイルを編集し、次の変更を加えます。

    1. ldap ディレクティブで、IdM LDAP サーバーの URL とベース識別名 (DN) を設定します。

      ldap {
          ...
          server = 'ldaps://idm_server.idm.example.com'
          base_dn = 'cn=users,cn=accounts,dc=idm,dc=example,dc=com'
          ...
      }
      Copy to Clipboard Toggle word wrap

      FreeRADIUS ホストと IdM サーバー間で TLS 暗号化接続を使用するには、サーバー URL に ldaps プロトコルを指定します。

    2. ldap ディレクティブで、IdM LDAP サーバーの TLS 証明書検証を有効にします。

      tls {
          ...
              require_cert = 'demand'
          ...
      }
      Copy to Clipboard Toggle word wrap
  9. /etc/raddb/clients.conf ファイルを編集します。

    1. localhost および localhost_ipv6 クライアントディレクティブでセキュアなパスワードを設定します。

      client localhost {
          ipaddr = 127.0.0.1
          ...
          secret = localhost_client_password
          ...
      }
      
      client localhost_ipv6 {
          ipv6addr = ::1
          secret = localhost_client_password
      }
      Copy to Clipboard Toggle word wrap
    2. ネットワークオーセンティケーターのクライアントディレクティブを追加します。

      client hostapd.example.org {
          ipaddr = 192.0.2.2/32
          secret = hostapd_client_password
      }
      Copy to Clipboard Toggle word wrap
    3. オプション: 他のホストも FreeRADIUS サービスにアクセスできるようにするには、それらのホストにもクライアントディレクティブを追加します。以下に例を示します。

      client <hostname_or_description> {
          ipaddr = <IP_address_or_range>
          secret = <client_password>
      }
      Copy to Clipboard Toggle word wrap

      ipaddr パラメーターは IPv4 および IPv6 アドレスを受け入れ、オプションのクラスレスドメイン間ルーティング (CIDR) 表記を使用して範囲を指定できます。ただし、このパラメーターに設定できる値は 1 つだけです。たとえば、IPv4 アドレスと IPv6 アドレスの両方へのアクセスを許可するには、2 つのクライアントディレクティブを追加する必要があります。

      ホスト名や IP 範囲が使用される場所を説明する単語など、クライアントディレクティブのわかりやすい名前を使用します。

  10. 設定ファイルを確認します。

    # radiusd -XC
    ...
    Configuration appears to be OK
    Copy to Clipboard Toggle word wrap
  11. firewalld サービスで RADIUS ポートを開きます。

    # firewall-cmd --permanent --add-service=radius
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
  12. radiusd サービスを有効にして開始します。

    # systemctl enable --now radiusd
    Copy to Clipboard Toggle word wrap

トラブルシューティング

  • radiusd サービスの起動に失敗した場合は、IdM サーバーのホスト名を解決できることを確認します。

    # host -v idm_server.idm.example.com
    Copy to Clipboard Toggle word wrap
  • その他の問題が発生した場合は、radiusd をデバッグモードで実行します。

    1. radiusd サービスを停止します。

      # systemctl stop radiusd
      Copy to Clipboard Toggle word wrap
    2. デバッグモードでサービスを開始します。

      # radiusd -X
      ...
      Ready to process requests
      Copy to Clipboard Toggle word wrap
    3. Verification セクションで参照されているように、FreeRADIUS ホストで認証テストを実行します。

次のステップ

  • 不要になった認証方法や使用しないその他の機能を無効にします。

20.4. 有線ネットワークで hostapd をオーセンティケーターとして設定する

ホストアクセスポイントデーモン (hostapd) サービスは、有線ネットワークでオーセンティケーターとして機能し、802.1X 認証を提供できます。このため、hostapd サービスには、クライアントを認証する RADIUS サーバーが必要です。

hostapd サービスは、統合された RADIUS サーバーを提供します。ただし、統合 RADIUS サーバーはテスト目的でのみ使用してください。実稼働環境では、さまざまな認証方法やアクセス制御などの追加機能をサポートする FreeRADIUS サーバーを使用します。

重要

hostapd サービスはトラフィックプレーンと相互作用しません。このサービスは、オーセンティケーターとしてのみ機能します。たとえば、hostapd 制御インターフェイスを使用するスクリプトまたはサービスを使用して、認証イベントの結果に基づいてトラフィックを許可または拒否します。

前提条件

  • hostapd パッケージをインストールしました。
  • FreeRADIUS サーバーが設定され、クライアントを認証する準備が整いました。

手順

  1. 次のコンテンツで /etc/hostapd/hostapd.conf ファイルを作成します。

    # General settings of hostapd
    # ===========================
    
    # Control interface settings
    ctrl_interface=/var/run/hostapd
    ctrl_interface_group=wheel
    
    # Enable logging for all modules
    logger_syslog=-1
    logger_stdout=-1
    
    # Log level
    logger_syslog_level=2
    logger_stdout_level=2
    
    
    # Wired 802.1X authentication
    # ===========================
    
    # Driver interface type
    driver=wired
    
    # Enable IEEE 802.1X authorization
    ieee8021x=1
    
    # Use port access entry (PAE) group address
    # (01:80:c2:00:00:03) when sending EAPOL frames
    use_pae_group_addr=1
    
    
    # Network interface for authentication requests
    interface=br0
    
    
    # RADIUS client configuration
    # ===========================
    
    # Local IP address used as NAS-IP-Address
    own_ip_addr=192.0.2.2
    
    # Unique NAS-Identifier within scope of RADIUS server
    nas_identifier=hostapd.example.org
    
    # RADIUS authentication server
    auth_server_addr=192.0.2.1
    auth_server_port=1812
    auth_server_shared_secret=hostapd_client_password
    
    # RADIUS accounting server
    acct_server_addr=192.0.2.1
    acct_server_port=1813
    acct_server_shared_secret=hostapd_client_password
    Copy to Clipboard Toggle word wrap

    この設定で使用されるパラメーターの詳細は、/usr/share/doc/hostapd/hostapd.conf サンプル設定ファイルの説明を参照してください。

  2. hostapd サービスを有効にして開始します。

    # systemctl enable --now hostapd
    Copy to Clipboard Toggle word wrap

トラブルシューティング

  • hostapd サービスの起動に失敗した場合は、/etc/hostapd/hostapd.conf ファイルで使用するブリッジインターフェイスがシステム上に存在することを確認します。

    # ip link show br0
    Copy to Clipboard Toggle word wrap
  • その他の問題が発生した場合は、hostapd をデバッグモードで実行します。

    1. hostapd サービスを停止します。

      # systemctl stop hostapd
      Copy to Clipboard Toggle word wrap
    2. デバッグモードでサービスを開始します。

      # hostapd -d /etc/hostapd/hostapd.conf
      Copy to Clipboard Toggle word wrap
    3. Verification セクションで参照されているように、FreeRADIUS ホストで認証テストを実行します。

20.5. FreeRADIUS サーバーまたはオーセンティケーターに対する EAP-TTLS 認証のテスト

Extensible Authentication Protocol - Tunneled Transport Layer Security (EAP-TTLS) を使用した認証が、期待どおりに機能するかテストするには、次の手順を実行します。

  • FreeRADIUS サーバーをセットアップした後
  • hostapd サービスを 802.1X ネットワーク認証のオーセンティケーターとして設定した後。

この手順で使用されるテストユーティリティーの出力は、EAP 通信に関する追加情報を提供し、問題のデバッグに役立ちます。

前提条件

  • 認証先が以下の場合:

    • FreeRADIUS サーバー:

      • hostapd パッケージによって提供される eapol_test ユーティリティーがインストールされている。
      • この手順の実行対象のクライアントが、FreeRADIUS サーバーのクライアントデータベースで認可されている。
    • 同じ名前のパッケージによって提供されるオーセンティケーターである wpa_supplicant ユーティリティーがインストールされている。
  • 認証局 (CA) 証明書が /etc/ipa/ca.cert ファイルに保存されている。

手順

  1. オプション: Identity Management (IdM) でユーザーを作成します。

    # ipa user-add --first "Test" --last "User" idm_user --password
    Copy to Clipboard Toggle word wrap
  2. 次のコンテンツで /etc/wpa_supplicant/wpa_supplicant-TTLS.conf ファイルを作成します。

    ap_scan=0
    
    network={
        eap=TTLS
        eapol_flags=0
        key_mgmt=IEEE8021X
    
        # Anonymous identity (sent in unencrypted phase 1)
        # Can be any string
        anonymous_identity="anonymous"
    
        # Inner authentication (sent in TLS-encrypted phase 2)
        phase2="auth=PAP"
        identity="idm_user"
        password="idm_user_password"
    
        # CA certificate to validate the RADIUS server's identity
        ca_cert="/etc/ipa/ca.crt"
    }
    Copy to Clipboard Toggle word wrap
  3. 認証するには:

    • FreeRADIUS サーバーには、次のように実行します。

      # eapol_test -c /etc/wpa_supplicant/wpa_supplicant-TTLS.conf -a 192.0.2.1 -s <client_password>
      ...
      EAP: Status notification: remote certificate verification (param=success)
      ...
      CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
      ...
      SUCCESS
      Copy to Clipboard Toggle word wrap

      -a オプションは FreeRADIUS サーバーの IP アドレスを定義し、-s オプションは FreeRADIUS サーバーのクライアント設定でコマンドを実行するホストのパスワードを指定します。

    • オーセンティケーター。次のように実行します。

      # wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-TTLS.conf -D wired -i enp0s31f6
      ...
      enp0s31f6: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
      ...
      Copy to Clipboard Toggle word wrap

      -i オプションは、wpa_supplicant が LAN(EAPOL) パケットを介して拡張認証プロトコルを送信するネットワークインターフェイス名を指定します。

      デバッグ情報の詳細は、コマンドに -d オプションを渡してください。

20.6. hostapd 認証イベントに基づくトラフィックのブロックと許可

hostapd サービスはトラフィックプレーンと相互作用しません。このサービスは、オーセンティケーターとしてのみ機能します。ただし、認証イベントの結果に基づいてトラフィックを許可および拒否するスクリプトを作成できます。

重要

この手順はサポートされておらず、エンタープライズ対応のソリューションではありません。hostapd_cli によって取得されたイベントを評価することにより、トラフィックをブロックまたは許可する方法のみを示しています。

802-1x-tr-mgmt systemd サービスが開始すると、RHEL は LAN(EAPOL) パケットを介した拡張認証プロトコルを除く hostapd のリッスンポート上のすべてのトラフィックをブロックし、hostapd_cli ユーティリティーを使用して hostapd 制御インターフェイスに接続します。次に、/usr/local/bin/802-1x-tr-mgmt スクリプトがイベントを評価します。hostapd_cli が受信するさまざまなイベントに応じて、スクリプトは MAC アドレスのトラフィックを許可またはブロックします。802-1x-tr-mgmt サービスが停止すると、すべてのトラフィックが自動的に再度許可されることに注意してください。

hostapd サーバーでこの手順を実行します。

前提条件

  • hostapd サービスが設定され、サービスはクライアントを認証する準備ができています。

手順

  1. 次のコンテンツで /usr/local/bin/802-1x-tr-mgmt ファイルを作成します。

    #!/bin/sh
    
    TABLE="tr-mgmt-${1}"
    read -r -d '' TABLE_DEF << EOF
    table bridge ${TABLE} {
        set allowed_macs {
            type ether_addr
        }
    
        chain accesscontrol {
            ether saddr @allowed_macs accept
            ether daddr @allowed_macs accept
            drop
        }
    
        chain forward {
            type filter hook forward priority 0; policy accept;
            meta ibrname "$0" jump accesscontrol
        }
    }
    EOF
    
    case ${2:-NOTANEVENT} in
        block_all)
            nft destroy table bridge "$TABLE"
            printf "$TABLE_DEF" | nft -f -
            echo "$1: All the bridge traffic blocked. Traffic for a client with a given MAC will be allowed after 802.1x authentication"
            ;;
    
        AP-STA-CONNECTED | CTRL-EVENT-EAP-SUCCESS | CTRL-EVENT-EAP-SUCCESS2)
            nft add element bridge tr-mgmt-br0 allowed_macs { $3 }
            echo "$1: Allowed traffic from $3"
            ;;
    
        AP-STA-DISCONNECTED | CTRL-EVENT-EAP-FAILURE)
            nft delete element bridge tr-mgmt-br0 allowed_macs { $3 }
            echo "$1: Denied traffic from $3"
            ;;
    
        allow_all)
            nft destroy table bridge "$TABLE"
            echo "$1: Allowed all bridge traffice again"
            ;;
    
        NOTANEVENT)
            echo "$0 was called incorrectly, usage: $0 interface event [mac_address]"
            ;;
    esac
    Copy to Clipboard Toggle word wrap
  2. 次のコンテンツで /etc/systemd/system/802-1x-tr-mgmt@.service サービスファイルを作成します。

    [Unit]
    Description=Example 802.1x traffic management for hostapd
    After=hostapd.service
    After=sys-devices-virtual-net-%i.device
    
    [Service]
    Type=simple
    ExecStartPre=bash -c '/usr/sbin/hostapd_cli ping | grep PONG'
    ExecStartPre=/usr/local/bin/802-1x-tr-mgmt %i block_all
    ExecStart=/usr/sbin/hostapd_cli -i %i -a /usr/local/bin/802-1x-tr-mgmt
    ExecStopPost=/usr/local/bin/802-1x-tr-mgmt %i allow_all
    
    [Install]
    WantedBy=multi-user.target
    Copy to Clipboard Toggle word wrap
  3. systemd を再ロードします。

    # systemctl daemon-reload
    Copy to Clipboard Toggle word wrap
  4. hostapd がリッスンしているインターフェイス名で 802-1x-tr-mgmt サービスを有効にして開始します。

    # systemctl enable --now 802-1x-tr-mgmt@br0.service
    Copy to Clipboard Toggle word wrap

検証

第21章 キーファイル形式の NetworkManager 接続プロファイル

Red Hat Enterprise Linux (RHEL) の NetworkManager は、接続プロファイルをキーファイル形式で保存します。この形式は、NetworkManager が提供するすべての接続設定をサポートします。

注記

ifcfg 形式の接続プロファイルは RHEL 10 ではサポートされていません。NetworkManager はこの形式のファイルを無視します。また、RHEL 10 でキーファイル形式に変換することもできません。

21.1. NetworkManager プロファイルのキーファイル形式

キーファイルの形式は INI 形式に似ています。たとえば、次はキーファイル形式のイーサネット接続プロファイルです。

[connection]
id=example_connection
uuid=82c6272d-1ff7-4d56-9c7c-0eb27c300029
type=ethernet
autoconnect=true

[ipv4]
method=auto

[ipv6]
method=auto

[ethernet]
mac-address=00:53:00:8f:fa:66
Copy to Clipboard Toggle word wrap
警告

パラメーターの入力や配置を誤ると、予期しない動作が発生する可能性があります。したがって、NetworkManager プロファイルを手動で編集または作成しないでください。

NetworkManager 接続を管理するには、nmcli ユーティリティー、network RHEL システムロール、または nmstate API を使用してください。たとえば、オフラインモードで nmcli ユーティリティー を使用して接続プロファイルを作成できます。

各セクションは、nm-settings(5) man ページで説明されている NetworkManager 設定名に対応しています。セクションの各 key-value-pair は、man ページの settings 仕様に記載されているプロパティーのいずれかになります。

NetworkManager キーファイルのほとんどの変数には、1 対 1 のマッピングがあります。つまり、NetworkManager プロパティーは、同じ名前と形式の変数としてキーファイルに保存されます。ただし、主にキーファイルの構文を読みやすくするために例外があります。この例外のリストは、システム上の nm-settings-keyfile(5) man ページを参照してください。

重要

接続プロファイルには秘密鍵やパスフレーズなどの機密情報が含まれる可能性があるため、セキュリティー上の理由から、NetworkManager は root ユーザーが所有し、root のみが読み書きできる設定ファイルのみを使用します。

接続プロファイルを .nmconnection 接尾辞付きで /etc/NetworkManager/system-connections/ ディレクトリーに保存します。このディレクトリーには永続的なプロファイルが含まれています。NetworkManager API を使用して、永続プロファイルを変更すると、NetworkManager は、このディレクトリーにファイルを書き込み、上書きします。

NetworkManager は、ディスクからプロファイルを自動的に再読み込みしません。キーファイル形式で接続プロファイルを作成または更新する場合は、nmcli connection reload コマンドを使用して、変更を NetworkManager に通知します。

21.2. nmcli を使用したオフラインモードでのキーファイル接続プロファイルの作成

NetworkManager ユーティリティー (nmclinetwork RHEL システムロール、NetworkManager 接続を管理するための nmstate API など) を使用して、設定ファイルを作成および更新します。ただし、nmcli --offline connection add コマンドを使用して、オフラインモードでキーファイル形式のさまざまな接続プロファイルを作成することもできます。

オフラインモードでは、nmcliNetworkManager サービスなしで動作し、標準出力を介してキーファイル接続プロファイルを生成することが保証されます。この機能は、次の場合に役立ちます。

  • どこかに事前に展開する必要がある接続プロファイルを作成する場合。たとえば、コンテナーイメージ内、または RPM パッケージとして作成する場合。
  • NetworkManager サービスが利用できない環境で接続プロファイルを作成する場合 (chroot ユーティリティーを使用する場合など)。または、Kickstart %post スクリプトを使用してインストールする RHEL システムのネットワーク設定を作成または変更する場合。

手順

  1. キーファイル形式で新しい接続プロファイルを作成します。たとえば、DHCP を使用しないイーサネットデバイスの接続プロファイルの場合は、同様の nmcli コマンドを実行します。

    # nmcli --offline connection add type ethernet con-name Example-Connection ipv4.addresses 192.0.2.1/24 ipv4.dns 192.0.2.200 ipv4.method manual > /etc/NetworkManager/system-connections/example.nmconnection
    Copy to Clipboard Toggle word wrap
    注記

    con-name キーで指定した接続名は、生成されたプロファイルの id 変数に保存されます。後で nmcli コマンドを使用してこの接続を管理する場合は、次のように接続を指定します。

    • id 変数を省略しない場合は、Example-Connection などの接続名を使用します。
    • id 変数を省略する場合は、output のように .nmconnection 接尾辞のないファイル名を使用します。
  2. 設定ファイルにパーミッションを設定して、root ユーザーのみが読み取りおよび更新できるようにします。

    # chmod 600 /etc/NetworkManager/system-connections/example.nmconnection
    # chown root:root /etc/NetworkManager/system-connections/example.nmconnection
    Copy to Clipboard Toggle word wrap
  3. NetworkManager 接続をリロードします。

    # nmcli connection reload
    Copy to Clipboard Toggle word wrap
  4. プロファイルの autoconnect 変数を false に設定した場合は、コネクションをアクティブにします。

    # nmcli connection up Example-Connection
    Copy to Clipboard Toggle word wrap

検証

  1. NetworkManager サービスが実行されていることを確認します。

    # systemctl status NetworkManager.service
    ● NetworkManager.service - Network Manager
       Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
       Active: active (running) since Wed 2022-08-03 13:08:32 CEST; 1min 40s ago
    ...
    Copy to Clipboard Toggle word wrap
  2. NetworkManager が設定ファイルからプロファイルを読み込めることを確認します。

    # nmcli -f TYPE,FILENAME,NAME connection
    TYPE      FILENAME                                                     NAME
    ethernet  /etc/NetworkManager/system-connections/example.nmconnection  Example-Connection
    ...
    Copy to Clipboard Toggle word wrap

    新しく作成された接続が出力に表示されない場合は、使用したキーファイルのパーミッションと構文が正しいことを確認してください。

  3. 接続プロファイルを表示します。

    # nmcli connection show Example-Connection
    connection.id:                          Example-Connection
    connection.uuid:                        232290ce-5225-422a-9228-cb83b22056b4
    connection.stable-id:                   --
    connection.type:                        802-3-ethernet
    connection.interface-name:              --
    connection.autoconnect:                 yes
    ...
    Copy to Clipboard Toggle word wrap

21.3. キーファイル形式での NetworkManager プロファイルの手動作成

NetworkManager 接続プロファイルは、キーファイル形式で手動で作成できます。

警告

設定ファイルを手動で作成または更新すると、予期しないネットワーク設定や、機能しないネットワーク設定が発生する可能性があります。代わりに、オフラインモードで nmcli を使用できます。nmcli を使用したオフラインモードでのキーファイル接続プロファイルの作成 を参照してください。

手順

  1. 接続プロファイルを作成します。たとえば、DHCP を使用する enp1s0 イーサネットデバイスの接続プロファイルを作成する場合は、次の内容の /etc/NetworkManager/system-connections/example.nmconnection ファイルを作成します。

    [connection]
    id=Example-Connection
    type=ethernet
    autoconnect=true
    interface-name=enp1s0
    
    [ipv4]
    method=auto
    
    [ipv6]
    method=auto
    Copy to Clipboard Toggle word wrap
    注記

    ファイル名には、.nmconnection の接尾辞を付けた任意のファイル名を使用できます。ただし、後で nmcli コマンドを使用して接続を管理する場合は、この接続を参照する際に、id に設定した接続名を使用する必要があります。id を省略する場合は、.nmconnection を使用せずにファイルネームを使用して、このコネクションを参照してください。

  2. 設定ファイルにパーミッションを設定して、root のユーザーのみが読み取りおよび更新できるようにします。

    # chown root:root /etc/NetworkManager/system-connections/example.nmconnection
    # chmod 600 /etc/NetworkManager/system-connections/example.nmconnection
    Copy to Clipboard Toggle word wrap
  3. 接続プロファイルを再読み込みします。

    # nmcli connection reload
    Copy to Clipboard Toggle word wrap
  4. NetworkManager が設定ファイルからプロファイルを読み込んでいることを確認します。

    # nmcli -f NAME,UUID,FILENAME connection
    NAME                UUID                                  FILENAME
    Example-Connection  86da2486-068d-4d05-9ac7-957ec118afba  /etc/NetworkManager/system-connections/example.nmconnection
    ...
    Copy to Clipboard Toggle word wrap

    このコマンドで、新しく追加した接続が表示されない場合は、ファイルの権限と、ファイルで使用した構文が正しいことを確認します。

  5. プロファイルの autoconnect 変数を false に設定した場合は、コネクションをアクティブにします。

    # nmcli connection up Example-Connection
    Copy to Clipboard Toggle word wrap

検証

  • 接続プロファイルを表示します。

    # nmcli connection show Example-Connection
    Copy to Clipboard Toggle word wrap

第22章 systemd ネットワークターゲットおよびサービス

RHEL は、ネットワーク設定を適用する間に、network および network-online ターゲットと NetworkManager-wait-online サービスを使用します。また、systemd サービスがネットワークが稼働していることを前提としており、ネットワーク状態の変化に動的に反応できない場合は、ネットワークが完全に利用可能になった後にサービスが起動するように設定することもできます。

22.1. systemd ターゲット network と network-online の違い

Systemd は、ターゲットユニット network および network-online を維持します。NetworkManager-wait-online.service などの特殊ユニットは、WantedBy=network-online.target パラメーターおよび Before=network-online.target パラメーターを持ちます。有効にすると、このようなユニットは network-online.target で開始し、一部の形式のネットワーク接続が確立されるまでターゲットに到達させるよう遅延します。ネットワークが接続されるまで、network-online ターゲットが遅延します。

network-online ターゲットはサービスを開始します。これにより、実行の遅延が大幅に増加します。Systemd は、このターゲットユニットの Wants パラメーターおよび After パラメーターの依存関係を、$network ファシリティーを参照する Linux Standard Base (LSB) ヘッダーを持つすべての System V(SysV) init スクリプトサービスユニットに自動的に追加します。LSB ヘッダーは、init スクリプトのメタデータです。これを使用して依存関係を指定できます。これは systemd ターゲットに似ています。

network ターゲットは、起動プロセスの実行を大幅に遅らせません。network ターゲットに到達すると、ネットワークの設定を行うサービスが開始していることになります。ただし、ネットワークデバイスが設定されているわけではありません。このターゲットは、システムのシャットダウン時に重要です。たとえば、起動中に network ターゲットの後に順序付けされたサービスがあると、この依存関係はシャットダウン中に元に戻されます。サービスが停止するまで、ネットワークは切断されません。リモートネットワークファイルシステムのすべてのマウントユニットは、network-online ターゲットユニットを自動的に起動し、その後に自身を置きます。

注記

network-online ターゲットユニットは、システムの起動時にのみ役に立ちます。システムの起動が完了すると、このターゲットがネットワークのオンライン状態を追跡しなくなります。したがって、network-online を使用してネットワーク接続を監視することはできません。このターゲットは、1 回限りのシステム起動の概念を提供します。

22.2. NetworkManager-wait-online の概要

NetworkManager-wait-online サービスは、起動が完了したことを NetworkManager が報告するまで、network-online ターゲットへの到達を遅らせます。NetworkManager は、起動時に connection.autoconnect パラメーターが yes に設定されたすべてのプロファイルをアクティブにします。ただし、NetworkManager プロファイルがアクティブ化状態である限り、プロファイルのアクティベーションは完了しません。アクティベーションに失敗すると、NetworkManager は connection.autoconnect-retries の値に応じてアクティベーションを再試行します。

デバイスがアクティブ状態に達するタイミングは、その設定により異なります。たとえば、プロファイルに IPv4 と IPv6 の両方の設定が含まれている場合、アドレスファミリーの 1 つだけ準備が完了していると、NetworkManager はデフォルトでデバイスが完全にアクティブ化されていると見なします。接続プロファイルの ipv4.may-fail および ipv6.may-fail パラメーターが、この動作を制御します。

イーサネットデバイスの場合、NetworkManager はタイムアウトでキャリアを待ちます。したがって、イーサネットケーブルが接続されていないと、NetworkManager-wait-online.service はさらに遅延します。

起動が完了すると、すべてのプロファイルが非接続状態になるか、正常にアクティブ化されます。プロファイルを自動接続するように設定できます。以下は、タイムアウトを設定したり、接続がアクティブとみなされるタイミングを定義するいくつかのパラメーター例です。

  • connection.wait-device-timeout: ドライバーがデバイスを検出するためのタイムアウトを設定します。
  • ipv4.may-fail および ipv6.may-fail: 1 つの IP アドレスファミリーの準備ができている状態でアクティベーションを設定します。または、特定のアドレスファミリーが設定を完了する必要があるかを設定します。
  • ipv4.gateway-ping-timeout: NetworkManager が IPv4 ゲートウェイから ping 応答を受信するまで、ネットワークのアクティブ化を遅延します。システムは、次の処理に進む前に、最大で指定された秒数だけ待機します。
  • ip-ping-timeout および ip-ping-addresses: NetworkManager が ip-ping-addresses で定義されたホストから ping 応答を受信するまで、ネットワークのアクティブ化を遅延します。システムは、次の処理に進む前に、最大で指定された秒数だけ待機します。

22.3. ネットワークの開始後に systemd サービスが起動する設定

Red Hat Enterprise Linux は、systemd サービスファイルを /usr/lib/systemd/system/ ディレクトリーにインストールします。この手順では、/etc/systemd/system/<service_name>.service.d/ 内のサービスファイル用のドロップインスニペットを作成します。このスニペットは、ネットワークがオンラインになった後に特定のサービスを起動するために、/usr/lib/systemd/system/ 内のサービスファイルと一緒に使用します。ドロップインスニペットの設定が、/usr/lib/systemd/system/ 内のサービスファイルにある値と重複する場合は、優先度が高くなります。

手順

  1. エディターでサービスファイルを開きます。

    # systemctl edit <service_name>
    Copy to Clipboard Toggle word wrap
  2. 以下を入力し、変更を保存します。

    [Unit]
    After=network-online.target
    Copy to Clipboard Toggle word wrap
  3. systemd サービスを再度読み込みます。

    # systemctl daemon-reload
    Copy to Clipboard Toggle word wrap

システムの起動後に NetworkManager サービスが開始されます。ネットワークファイルシステム (NFS) などの特定のサービスは、ネットワーク接続に依存します。ゲートウェイ IP またはターゲット IP アドレスが応答を返さない場合、ネットワークが完全に起動していないため宛先に接続できず、NFS はマウントに失敗します。このような問題は、connection.ip-ping-addresses および connection.ip-ping-timeout を設定して、特定のターゲットへの接続を確認することで回避できます。connection.ip-ping-addresses 設定は、IPv4 および IPv6 アドレスの設定をサポートします。

手順

  1. 接続プロファイルがまだ存在しない場合は作成します。たとえば、動的 IP アドレス割り当てを使用して enp1s0 インターフェイスのプロファイルを作成するには、次のように入力します。

    # nmcli connection add con-name enp1s0 ifname enp1s0 type ethernet
    Copy to Clipboard Toggle word wrap
    注記

    connection.ip-ping-addresses を設定すると、ping 操作の完了またはタイムアウト時間のいずれかを待機するため、systemdnetwork-online ターゲットサービスからの応答が遅れる可能性があります。

  2. 定義されたタイムアウト時間で指定された IP アドレスに ping を実行するように接続を設定します。

    # nmcli connection modify enp1s0 connection.ip-ping-addresses "192.0.2.56, 192.0.2.60" connection.ip-ping-timeout 10 ipv4.may-fail no
    Copy to Clipboard Toggle word wrap

    ipv4.may-fail 属性を no に設定すると、確実に IPv4 設定が正常に完了します。

  3. 接続を再度有効にします。

    # nmcli connection up enp1s0
    Copy to Clipboard Toggle word wrap

第23章 Nmstate の概要

Nmstate は宣言型のネットワークマネージャー API です。Nmstate を使用する場合、YAML または JSON 形式の命令を使用して想定されるネットワーク状態を記述します。

Nmstate には多くの利点があります。たとえば、以下のようになります。

  • 安定性と拡張可能なインターフェイスを提供して RHEL ネットワーク機能を管理する。
  • ホストおよびクラスターレベルでのアトミックおよびトランザクション操作をサポートする。
  • ほとんどのプロパティーの部分編集をサポートし、この手順で指定されていない既存の設定を保持する。

Nmstate は次のパッケージで構成されています。

Expand
パッケージ内容

nmstate

nmstatectl コマンドラインユーティリティー

python3-libnmstate

libnmstate Python ライブラリー

nmstate-libs

Nmstate C ライブラリー

nmstate-devel

Nmstate C ライブラリーヘッダー

23.1. Python アプリケーションでの libnmstate ライブラリーの使用

libnmstate Python ライブラリーを使用すると、開発者は独自のアプリケーションで Nmstate を使用できます。

ライブラリーを使用するには、ソースコードにインポートします。

import libnmstate
Copy to Clipboard Toggle word wrap

このライブラリーを使用するには、nmstate および python3-libnmstate パッケージをインストールする必要があることに注意してください。

例23.1 libnmstate ライブラリーを使用したネットワーク状態のクエリー

以下の Python コードは、libnmstate ライブラリーをインポートし、利用可能なネットワークインターフェイスとその状態を表示します。

import libnmstate
from libnmstate.schema import Interface

net_state = libnmstate.show()
for iface_state in net_state[Interface.KEY]:
    print(iface_state[Interface.NAME] + ": "
          + iface_state[Interface.STATE])
Copy to Clipboard Toggle word wrap

23.2. nmstatectl を使用した現在のネットワーク設定の更新

nmstatectl ユーティリティーを使用して、1 つまたはすべてのインターフェイスの現在のネットワーク設定をファイルに保存できます。このファイルを使用して、以下を行うことができます。

  • 設定を変更し、同じシステムに適用します。
  • 別のホストにファイルをコピーし、同じまたは変更された設定でホストを設定します。

たとえば、enp1s0 インターフェイスの設定をファイルにエクスポートして、設定を変更し、その設定をホストに適用することができます。

前提条件

  • nmstate パッケージがインストールされている。

手順

  1. enp1s0 インターフェイスの設定を ~/network-config.yml ファイルにエクスポートします。

    # nmstatectl show enp1s0 > ~/network-config.yml
    Copy to Clipboard Toggle word wrap

    このコマンドにより、enp1s0 の設定が YAML 形式で保存されます。JSON 形式で出力を保存するには、--json オプションをコマンドに渡します。

    インターフェイス名を指定しない場合、nmstatectl はすべてのインターフェイスの設定をエクスポートします。

  2. テキストエディターで ~/network-config.yml ファイルを変更して、設定を更新します。
  3. ~/network-config.yml ファイルからの設定を適用します。

    # nmstatectl apply ~/network-config.yml
    Copy to Clipboard Toggle word wrap

    JSON 形式で設定をエクスポートしている場合は、--json オプションをコマンドに渡します。

23.3. nmstate systemd サービス

nmstate パッケージをインストールすると、nmstate systemd サービスを設定することで、Red Hat Enterprise Linux システムの起動時に新しいネットワーク設定を自動的に適用できます。このサービスは oneshot systemd サービスです。そのため、systemd は、システムの起動時とサービスを手動で再起動した場合にのみこれを実行します。

注記

デフォルトでは、nmstate サービスは無効になっています。これを有効にするには systemctl enable nmstate コマンドを使用します。その後、systemd は、システムが起動するたびにこのサービスを実行します。

このサービスを使用するには、Nmstate 命令を含む *.yml ファイルを /etc/nmstate/ ディレクトリーに保存します。nmstate サービスは、次回の再起動時、またはサービスを手動で再起動したときに、ファイルを自動的に適用します。デフォルトでは、Nmstate がファイルを正常に適用すると、サービスが同じファイルを再度処理しないように、ファイルの .yml 接尾辞の名前が .applied に変更されます。

nmstate サービスは /etc/nmstate/nmstate.conf ファイルで設定できます。たとえば、適用後の元の *.yml ファイルを保持し、.applied 接尾辞を持つコピーのみを作成するには、/etc/nmstate/nmstate.conf に次の行を追加します。

[service]
keep_state_file_after_apply = false
Copy to Clipboard Toggle word wrap

詳細およびその他の設定オプションは、システム上の nmstate.service(8) man ページを参照してください。

23.4. network RHEL システムロールのネットワーク状態

network RHEL システムロールは、Playbook でデバイスを設定するための状態設定をサポートしています。これには、network_state 変数の後に状態設定を使用します。

Playbook で network_state 変数を使用する利点:

  • 状態設定で宣言型の方法を使用すると、インターフェイスを設定でき、NetworkManager はこれらのインターフェイスのプロファイルをバックグラウンドで作成します。
  • network_state 変数を使用すると、変更が必要なオプションを指定できます。他のすべてのオプションはそのまま残ります。ただし、network_connections 変数を使用して、ネットワーク接続プロファイルを変更するには、すべての設定を指定する必要があります。
重要

network_state では Nmstate YAML 命令のみを設定できます。この命令は、network_connections で設定できる変数とは異なります。

たとえば、動的 IP アドレス設定でイーサネット接続を作成するには、Playbook で次の vars ブロックを使用します。

Expand

状態設定を含む Playbook

通常の Playbook

vars:
  network_state:
    interfaces:
    - name: enp7s0
      type: ethernet
      state: up
      ipv4:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        dhcp: true
      ipv6:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        autoconf: true
        dhcp: true
Copy to Clipboard Toggle word wrap
vars:
  network_connections:
    - name: enp7s0
      interface_name: enp7s0
      type: ethernet
      autoconnect: yes
      ip:
        dhcp4: yes
        auto6: yes
      state: up
Copy to Clipboard Toggle word wrap

たとえば、上記のように作成した動的 IP アドレス設定の接続ステータスのみを変更するには、Playbook で次の vars ブロックを使用します。

Expand

状態設定を含む Playbook

通常の Playbook

vars:
  network_state:
    interfaces:
    - name: enp7s0
      type: ethernet
      state: down
Copy to Clipboard Toggle word wrap
vars:
  network_connections:
    - name: enp7s0
      interface_name: enp7s0
      type: ethernet
      autoconnect: yes
      ip:
        dhcp4: yes
        auto6: yes
      state: down
Copy to Clipboard Toggle word wrap

第24章 Multipath TCP の使用

Transmission Control Protocol (TCP) は、インターネットを介したデータの信頼できる配信を保証し、ネットワーク負荷に応じて帯域幅を自動的に調整します。マルチパス TCP (MPTCP) は、元の TCP プロトコル (シングルパス) のエクステンションです。MPTCP は、トランスポート接続が複数のパスで同時に動作することを可能にし、ユーザーエンドポイントデバイスにネットワーク接続の冗長性をもたらします。

24.1. MPTCP について

マルチパス TCP (MPTCP) プロトコルを使用すると、接続エンドポイント間で複数のパスを同時に使用できます。プロトコル設計により、接続の安定性が向上し、シングルパス TCP と比較して他の利点ももたらされます。

注記

MPTCP 用語では、リンクはパスと見なされます。

以下に、MPTCP を使用する利点の一部を示します。

  • これにより、接続が複数のネットワークインターフェイスを同時に使用できるようになります。
  • 接続がリンク速度にバインドされている場合は、複数のリンクを使用すると、接続スループットが向上します。接続が CPU にバインドされている場合は、複数のリンクを使用すると接続が遅くなることに注意してください。
  • これは、リンク障害に対する耐障害性を高めます。

MPTCP の詳細は、関連情報 を参照してください。

24.2. MPTCP アプリケーションの複数パスの永続的な設定

nmcli コマンドを使用して MultiPath TCP (MPTCP) を設定し、送信元システムと宛先システムの間に複数のサブフローを永続的に確立できます。サブフローは、さまざまなリソース、宛先へのさまざまなルート、さまざまなネットワークを使用できます。たとえばイーサネット、セルラー、Wi-Fi などです。その結果、接続が組み合わされ、ネットワークの回復力とスループットが向上します。

ここで使用した例では、サーバーは次のネットワークインターフェイスを使用します。

  • enp4s0: 192.0.2.1/24
  • enp1s0: 198.51.100.1/24
  • enp7s0: 192.0.2.3/24

ここで使用した例では、クライアントは次のネットワークインターフェイスを使用します。

  • enp4s0f0: 192.0.2.2/24
  • enp4s0f1: 198.51.100.2/24
  • enp6s0: 192.0.2.5/24

前提条件

  • 関連するインターフェイスでデフォルトゲートウェイを設定している

手順

  1. カーネルで MPTCP ソケットを有効にします。

    # echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
    Copy to Clipboard Toggle word wrap
  2. オプション: RHEL カーネルのサブフロー制限のデフォルトは 2 です。不足する場合、以下を実行します。

    1. 次の内容で /etc/systemd/system/set_mptcp_limit.service ファイルを作成します。

      [Unit]
      Description=Set MPTCP subflow limit to 3
      After=network.target
      
      [Service]
      ExecStart=ip mptcp limits set subflows 3
      Type=oneshot
      
      [Install]
      WantedBy=multi-user.target
      Copy to Clipboard Toggle word wrap

      ワンショット ユニットは、各ブートプロセス中にネットワーク (network.target) が動作した後に ip mptcp limits set subflows 3 コマンドを実行します。

      ip mptcp limits set subflows 3 コマンドは、各接続の 追加 サブフローの最大数を設定するため、合計が 4 になります。追加サブフローは最大 3 つです。

    2. set_mptcp_limit サービスを有効にします。

      # systemctl enable --now set_mptcp_limit
      Copy to Clipboard Toggle word wrap
  3. 接続のアグリゲーションに使用するすべての接続プロファイルで MPTCP を有効にします。

    # nmcli connection modify <profile_name> connection.mptcp-flags signal,subflow,also-without-default-route
    Copy to Clipboard Toggle word wrap

    connection.mptcp-flags パラメーターは、MPTCP エンドポイントと IP アドレスフラグを設定します。MPTCP が NetworkManager 接続プロファイルで有効になっている場合、設定により、関連するネットワークインターフェイスの IP アドレスが MPTCP エンドポイントとして設定されます。

    デフォルトでは、デフォルトゲートウェイがない場合、NetworkManager は MPTCP フラグを IP アドレスに追加しません。そのチェックをバイパスしたい場合は、also-without-default-route フラグも使用する必要があります。

検証

  1. MPTCP カーネルパラメーターが有効になっていることを確認します。

    # sysctl net.mptcp.enabled
    net.mptcp.enabled = 1
    Copy to Clipboard Toggle word wrap
  2. デフォルトでは不足する場合に備えて、サブフロー制限を適切に設定していることを確認します。

    # ip mptcp limit show
    add_addr_accepted 2 subflows 3
    Copy to Clipboard Toggle word wrap
  3. アドレスごとの MPTCP 設定が正しく設定されていることを確認します。

    # ip mptcp endpoint show
    192.0.2.1 id 1 subflow dev enp4s0
    198.51.100.1 id 2 subflow dev enp1s0
    192.0.2.3 id 3 subflow dev enp7s0
    192.0.2.4 id 4 subflow dev enp3s0
    ...
    Copy to Clipboard Toggle word wrap

24.3. mptcpd の設定

mptcpd サービスは、mptcp エンドポイントを設定するためのインストルメントを提供する mptcp プロトコルのコンポーネントです。mptcpd サービスは、デフォルトでアドレスごとにサブフローエンドポイントを作成します。エンドポイントリストは、実行中のホストでの IP アドレスの変更に応じて動的に更新されます。mptcpd サービスは、エンドポイントのリストを自動的に作成します。ip ユーティリティーを使用する代わりに複数のパスを有効にします。

前提条件

  • インストールされた mptcpd パッケージ

手順

  1. 次のコマンドを使用して、カーネルで mptcp.enabled オプションを有効にします。

    # echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
    Copy to Clipboard Toggle word wrap
  2. mptcpd サービスを有効にして起動します。

    # systemctl enable --now mptcp.service
    Copy to Clipboard Toggle word wrap
  3. mptcpd サービスを手動で設定するには、/etc/mptcpd/mptcpd.conf 設定ファイルを変更します。

    mptcpd サービスが作成するエンドポイントは、ホストがシャットダウンするまで続くことに注意してください。

検証

  • エンドポイントの作成を確認します。

    # ip mptcp endpoint
    Copy to Clipboard Toggle word wrap

第25章 Linux トラフィックの制御

Linux は、パケットの送信を管理および操作するためのツールを提供します。Linux Traffic Control (TC) サブシステムは、ネットワークトラフィックの規制、分類、成熟、およびスケジューリングに役立ちます。また、TC はフィルターとアクションを使用して分類中にパケットコンテンツをマスリングします。TC サブシステムは、TC アーキテクチャーの基本要素であるキューイング規則 (qdisc) を使用してこれを実現します。

スケジューリングメカニズムは、異なるキューに入るか、終了する前にパケットを設定または再編成します。最も一般的なスケジューラーは First-In-First-Out (FIFO) スケジューラーです。qdiscs 操作は、tc ユーティリティーを使用して一時的に、NetworkManager を使用して永続的に実行できます。

Red Hat Enterprise Linux では、デフォルトのキューの規則をさまざまな方法で設定して、ネットワークインターフェイスのトラフィックを管理できます。

25.1. キュー規則の概要

グルーピング規則 (qdiscs) は、ネットワークインターフェイスによるトラフィックのスケジューリング、後でキューに役に立ちます。qdisc には 2 つの操作があります。

  • パケットを後送信用にキューに入れるできるようにするキュー要求。
  • キューに置かれたパケットのいずれかを即時に送信できるように要求を解除します。

qdisc には、ハンドル と呼ばれる 16 ビットの 16 進数の識別番号があり、1:abcd: などのコロンが付けられています。この番号は qdisc メジャー番号と呼ばれます。qdisc にクラスがある場合、識別子はマイナー番号 (<major>:<minor>) の前にメジャー番号を持つ 2 つの数字のペア (abcd:1) として形成されます。マイナー番号の番号設定スキームは、qdisc タイプによって異なります。1 つ目のクラスには ID <major>:1、2 つ目の <major>:2 などが含まれる場合があります。一部の qdiscs では、クラスの作成時にクラスマイナー番号を任意に設定することができます。

分類的な qdiscs

ネットワークインターフェイスへのパケット転送には、さまざまな qdiscs があり、そのタイプの qdiscs が存在します。root、親、または子クラスを使用して qdiscs を設定できます。子を割り当て可能なポイントはクラスと呼ばれます。qdisc のクラスは柔軟性があり、常に複数の子クラス、または 1 つの子 qdisc を含めることができます。これは、クラスフルな qdisc 自体を含むクラスに対して禁止がないため、複雑なトラフィック制御シナリオが容易になります。

分類的な qdiscs はパケットを格納しません。代わりに、qdisc 固有の基準に従って、子のいずれかに対してキューをキューに入れ、デキューします。最終的にこの再帰パケットが渡される場所は、パケットが格納される場所 (またはデキューの場合はから取得) となります。

クラスレス qdiscs
一部の qdiscs には子クラスがなく、クラスレス qdiscs と呼ばれます。クラスレス qdiscs は、クラスフル qdiscs と比較してカスタマイズが少なくなります。通常、インターフェイスに割り当てるだけで十分です。

25.2. tc ユーティリティーを使用したネットワークインターフェイスの qdiscs の検査

デフォルトでは、Red Hat Enterprise Linux システムは fq_codel qdisc を使用します。tc ユーティリティーを使用して qdisc カウンターを検査できます。

手順

  1. オプション: 現在の qdisc を表示します。

    # tc qdisc show dev enp0s1
    Copy to Clipboard Toggle word wrap
  2. 現在の qdisc カウンターを検査します。

    # tc -s qdisc show dev enp0s1
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
    Sent 1008193 bytes 5559 pkt (dropped 233, overlimits 55 requeues 77)
    backlog 0b 0p requeues 0
    Copy to Clipboard Toggle word wrap
    • dropped: すべてのキューが満杯であるため、パケットがドロップされる回数
    • overlimits: 設定されたリンク容量が一杯になる回数
    • sent: デキューの数

25.3. デフォルトの qdisc の更新

現在の qdisc でネットワークパケットの損失を確認する場合は、ネットワーク要件に基づいて qdisc を変更できます。

手順

  1. 現在のデフォルト qdisc を表示します。

    # sysctl -a | grep qdisc
    net.core.default_qdisc = fq_codel
    Copy to Clipboard Toggle word wrap
  2. 現在のイーサネット接続の qdisc を表示します。

    # tc -s qdisc show dev enp0s1
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
    Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0
    maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
    new_flows_len 0 old_flows_len 0
    Copy to Clipboard Toggle word wrap
  3. 既存の qdisc を更新します。

    # sysctl -w net.core.default_qdisc=pfifo_fast
    Copy to Clipboard Toggle word wrap
  4. 変更を適用するには、ネットワークドライバーを再読み込みします。

    # modprobe -r NETWORKDRIVERNAME
    # modprobe NETWORKDRIVERNAME
    Copy to Clipboard Toggle word wrap
  5. ネットワークインターフェイスを起動します。

    # ip link set enp0s1 up
    Copy to Clipboard Toggle word wrap

検証

  • イーサネット接続の qdisc を表示します。

    # tc -s qdisc show dev enp0s1
    qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
     Sent 373186 bytes 5333 pkt (dropped 0, overlimits 0 requeues 0)
     backlog 0b 0p requeues 0
     ...
    Copy to Clipboard Toggle word wrap

デフォルトの qdisc を変更せずに、現在の qdisc を更新できます。

手順

  1. オプション: 現在の qdisc を表示します。

    # tc -s qdisc show dev enp0s1
    Copy to Clipboard Toggle word wrap
  2. 現在の qdisc を更新します。

    # tc qdisc replace dev enp0s1 root htb
    Copy to Clipboard Toggle word wrap

検証

  • 更新された現在の qdisc を表示します。

    # tc -s qdisc show dev enp0s1
    qdisc htb 8001: root refcnt 2 r2q 10 default 0 direct_packets_stat 0 direct_qlen 1000
    Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0
    Copy to Clipboard Toggle word wrap

NetworkManager 接続の現在の qdisc 値を更新できます。

手順

  1. オプション: 現在の qdisc を表示します。

    # tc qdisc show dev enp0s1
      qdisc fq_codel 0: root refcnt 2
    Copy to Clipboard Toggle word wrap
  2. 現在の qdisc を更新します。

    # nmcli connection modify enp0s1 tc.qdiscs 'root pfifo_fast'
    Copy to Clipboard Toggle word wrap
  3. 必要に応じて、既存の qdisc に別の qdisc を追加するには、+tc.qdisc オプションを使用します。

    # nmcli connection modify enp0s1 +tc.qdisc 'ingress handle ffff:'
    Copy to Clipboard Toggle word wrap
  4. 変更を有効にします。

    # nmcli connection up enp0s1
    Copy to Clipboard Toggle word wrap

検証

  • ネットワークインターフェイスの現在の qdisc を表示します。

    # tc qdisc show dev enp0s1
    qdisc pfifo_fast 8001: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    qdisc ingress ffff: parent ffff:fff1 ................
    Copy to Clipboard Toggle word wrap

25.6. tc-ctinfo ユーティリティーを使用したパケットのレート制限の設定

レート制限を使用すると、ネットワークトラフィックを制限し、ネットワーク内のリソースの枯渇を防ぐことができます。レート制限を使用すると、特定の時間枠内での反復的なパケット要求を制限することで、サーバーの負荷を軽減することもできます。さらに、tc-ctinfo ユーティリティーを使用して、カーネルでトラフィック制御を設定することにより、帯域幅レートを管理できます。

接続追跡エントリーには、Netfilter マークと接続情報が格納されます。ルーターがファイアウォールからパケットを転送するとき、ルーターはパケットから接続追跡エントリーを削除または変更します。接続追跡情報 (ctinfo) モジュールは、接続追跡マークからさまざまなフィールドにデータを取り出します。このカーネルモジュールは、Netfilter マークを、ソケットバッファー (skb) マークメタデータフィールドにコピーすることで保存します。

前提条件

  • iperf3 ユーティリティーがサーバーとクライアントにインストールされている。

手順

  1. サーバーで次の手順を実行します。

    1. ネットワークインターフェイスに仮想リンクを追加します。

      # ip link add name ifb4eth0 numtxqueues 48 numrxqueues 48 type ifb
      Copy to Clipboard Toggle word wrap

      このコマンドには次のパラメーターがあります。

      name ifb4eth0
      新しい仮想デバイスインターフェイスを設定します。
      numtxqueues 48
      送信キューの数を設定します。
      numrxqueues 48
      受信キューの数を設定します。
      type ifb
      新しいデバイスのタイプを設定します。
    2. インターフェイスの状態を変更します。

      # ip link set dev ifb4eth0 up
      Copy to Clipboard Toggle word wrap
    3. 物理ネットワークインターフェイスに qdisc 属性を追加し、それを受信トラフィックに適用します。

      # tc qdisc add dev enp1s0 handle ffff: ingress
      Copy to Clipboard Toggle word wrap

      handle ffff: オプションでは、handle パラメーターはデフォルト値としてメジャー番号 ffff:enp1s0 物理ネットワークインターフェイス上のクラスフル qdisc に割り当てます。ここで、qdisc は、トラフィック制御を分析するためのキューイング規則パラメーターになります。

    4. IP プロトコルの物理インターフェイスにフィルターを追加して、パケットを分類します。

      # tc filter add dev enp1s0 parent ffff: protocol ip u32 match u32 0 0 action ctinfo cpmark 100 action mirred egress redirect dev ifb4eth0
      Copy to Clipboard Toggle word wrap

      このコマンドには次の属性があります。

      parent ffff:
      qdisc のメジャー番号 ffff: を設定します。
      u32 match u32 0 0
      パターン u32 の IP ヘッダーと一致 (match) するように、u32 フィルターを設定します。最初の 0 は、IP ヘッダーの 2 番目のバイトを表し、もう 1 つの 0 は、一致させるビットがどれであるかをフィルターに指示するマスク照合です。
      action ctinfo
      接続追跡マークからさまざまなフィールドにデータを取り出すアクションを設定します。
      cpmark 100
      接続追跡マーク (connmark) 100 をパケットの IP ヘッダーフィールドにコピーします。
      action mirred egress redirect dev ifb4eth0
      actionmirred に設定して、受信したパケットを宛先インターフェイス ifb4eth0 にリダイレクトします。
    5. クラスフル qdisc をインターフェイスに追加します。

      # tc qdisc add dev ifb4eth0 root handle 1: htb default 1000
      Copy to Clipboard Toggle word wrap

      このコマンドは、メジャー番号 1 を root qdisc に設定し、マイナー ID 1000 のクラスフル qdisc を持つ htb 階層トークンバケットを使用します。

    6. インターフェイス上のトラフィックを 1 Mbit/s に制限し、上限を 2 Mbit/s にします。

      # tc class add dev ifb4eth0 parent 1:1 classid 1:100 htb ceil 2mbit rate 1mbit prio 100
      Copy to Clipboard Toggle word wrap

      このコマンドには次のパラメーターがあります。

      parent 1:1
      classid1root1 として parent を設定します。
      classid 1:100
      classid1:100 に設定します。ここで、1 は親 qdisc の数で、100 は親 qdisc のクラスの数です。
      htb ceil 2mbit
      htb のクラスフルな qdisc では、ceil レート制限として 2 Mbit/s の上限帯域幅が許可されます。
    7. クラスレス qdisc の Stochastic Fairness Queuing (sfq) を、60 秒の時間間隔でインターフェイスに適用して、キューアルゴリズムの摂動を軽減します。

      # tc qdisc add dev ifb4eth0 parent 1:100 sfq perturb 60
      Copy to Clipboard Toggle word wrap
    8. ファイアウォールマーク (fw) フィルターをインターフェイスに追加します。

      # tc filter add dev ifb4eth0 parent 1:0 protocol ip prio 100 handle 100 fw classid 1:100
      Copy to Clipboard Toggle word wrap
    9. 接続マーク (CONNMARK) からパケットのメタマークを復元します。

      # nft add rule ip mangle PREROUTING counter meta mark set ct mark
      Copy to Clipboard Toggle word wrap

      このコマンドでは、nft ユーティリティーにはチェーンルール仕様 PREROUTING を含む mangle テーブルがあり、ルーティング前に受信パケットを変更してパケットマークを CONNMARK に置き換えます。

    10. nft テーブルとチェーンが存在しない場合は、以下のようにテーブルを作成してチェーンルールを追加します。

      # nft add table ip mangle
      # nft add chain ip mangle PREROUTING {type filter hook prerouting priority mangle \;}
      Copy to Clipboard Toggle word wrap
    11. 指定された宛先アドレス 192.0.2.3 で受信した tcp パケットにメタマークを設定します。

      # nft add rule ip mangle PREROUTING ip daddr 192.0.2.3 counter meta mark set 0x64
      Copy to Clipboard Toggle word wrap
    12. パケットマークを接続マークに保存します。

      # nft add rule ip mangle PREROUTING counter ct mark set mark
      Copy to Clipboard Toggle word wrap
    13. -s パラメーターを使用して、iperf3 ユーティリティーをシステム上のサーバーとして実行すると、サーバーはクライアント接続の応答を待ちます。

      # iperf3 -s
      Copy to Clipboard Toggle word wrap
  2. クライアント上で、iperf3 をクライアントとして実行し、IP アドレス 192.0.2.3 で定期的な HTTP 要求と応答のタイムスタンプをリッスンするサーバーに接続します。

    # iperf3 -c 192.0.2.3 | tee rate
    Copy to Clipboard Toggle word wrap

    192.0.2.3 はサーバーの IP アドレスで、192.0.2.4 はクライアントの IP アドレスです。

  3. Ctrl+C を押して、サーバー上の iperf3 ユーティリティーを終了します。

    Accepted connection from 192.0.2.4, port 52128
    [5]  local 192.0.2.3 port 5201 connected to 192.0.2.4 port 52130
    [ID] Interval       	Transfer 	Bitrate
    [5]   0.00-1.00   sec   119 KBytes   973 Kbits/sec
    [5]   1.00-2.00   sec   116 KBytes   950 Kbits/sec
    ...
    [ID] Interval       	Transfer 	Bitrate
    [5]   0.00-14.81  sec  1.51 MBytes   853 Kbits/sec  receiver
    
    iperf3: interrupt - the server has terminated
    Copy to Clipboard Toggle word wrap
  4. Ctrl+C を押して、クライアント上の iperf3 ユーティリティーを終了します。

    Connecting to host 192.0.2.3, port 5201
    [5] local 192.0.2.4 port 52130 connected to 192.0.2.3 port 5201
    [ID] Interval       	Transfer 	Bitrate     	Retr  Cwnd
    [5]   0.00-1.00   sec   481 KBytes  3.94 Mbits/sec	0   76.4 KBytes
    [5]   1.00-2.00   sec   223 KBytes  1.83 Mbits/sec	0   82.0 KBytes
    ...
    [ID] Interval       	Transfer 	Bitrate     	Retr
    [5]   0.00-14.00  sec  3.92 MBytes  2.35 Mbits/sec   32     sender
    [5]   0.00-14.00  sec  0.00 Bytes  0.00 bits/sec            receiver
    
    iperf3: error - the server has terminated
    Copy to Clipboard Toggle word wrap

検証

  1. インターフェイス上の htb クラスと sfq クラスのパケット数に関する統計情報を表示します。

    # tc -s qdisc show dev ifb4eth0
    
    qdisc htb 1: root
    ...
     Sent 26611455 bytes 3054 pkt (dropped 76, overlimits 4887 requeues 0)
    ...
    qdisc sfq 8001: parent
    ...
     Sent 26535030 bytes 2296 pkt (dropped 76, overlimits 0 requeues 0)
    ...
    Copy to Clipboard Toggle word wrap
  2. mirred アクションと ctinfo アクションのパケット数の統計情報を表示します。

    # tc -s filter show dev enp1s0 ingress
    filter parent ffff: protocol ip pref 49152 u32 chain 0
    filter parent ffff: protocol ip pref 49152 u32 chain 0 fh 800: ht divisor 1
    filter parent ffff: protocol ip pref 49152 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 terminal flowid not_in_hw (rule hit 8075 success 8075)
      match 00000000/00000000 at 0 (success 8075 )
        action order 1: ctinfo zone 0 pipe
          index 1 ref 1 bind 1 cpmark 0x00000064 installed 3105 sec firstused 3105 sec DSCP set 0 error 0
          CPMARK set 7712
        Action statistics:
        Sent 25891504 bytes 3137 pkt (dropped 0, overlimits 0 requeues 0)
        backlog 0b 0p requeues 0
    
        action order 2: mirred (Egress Redirect to device ifb4eth0) stolen
           index 1 ref 1 bind 1 installed 3105 sec firstused 3105 sec
        Action statistics:
        Sent 25891504 bytes 3137 pkt (dropped 0, overlimits 61 requeues 0)
        backlog 0b 0p requeues 0
    Copy to Clipboard Toggle word wrap
  3. htb レートリミッターとその設定の統計情報を表示します。

    # tc -s class show dev ifb4eth0
    class htb 1:100 root leaf 8001: prio 7 rate 1Mbit ceil 2Mbit burst 1600b cburst 1600b
     Sent 26541716 bytes 2373 pkt (dropped 61, overlimits 4887 requeues 0)
     backlog 0b 0p requeues 0
     lended: 7248 borrowed: 0 giants: 0
     tokens: 187250 ctokens: 93625
    Copy to Clipboard Toggle word wrap

25.7. RHEL で利用できる qdiscs

qdisc は、ネットワーク関連の固有の問題に対応します。以下は、RHEL で利用可能な qdiscs のリストです。以下の qdisc を使用して、ネットワーク要件に基づいてネットワークトラフィックを形成できます。

Expand
表25.1 RHEL で利用可能なスケジューラー
qdisc以下に含まれるオフロードサポート

Credit-Based Shaper

kernel-modules-core

Yes

Enhanced Transmission Selection (ETS)

kernel-modules-core

Yes

Earliest TxTime First (ETF)

kernel-modules-extra

 

Fair Queue (FQ)

kernel-modules-core

 

FQ_CODel (Fair Queuing Controlled Delay)

kernel-core

 

GRED (Generalized Random Early Detection)

kernel-modules-extra

 

階層化されたサービス曲線 (HSFC)

kernel-modules-core

 

階層型トークンバケット (HTB)

kernel-modules-core

Yes

INGRESS

kernel-modules-core

Yes

MQPRIO (Multi Queue Priority)

kernel-modules-extra

Yes

マルチキュー (MULTIQ)

kernel-modules-extra

Yes

ネットワークエミュレーター (NETEM)

kernel-modules-extra

 

ランダム初期値検出 (RED)

kernel-modules-extra

Yes

SFQ (Stochastic Fairness Queueing)

kernel-modules-core

 

Time-aware Priority Shaper (TAPRIO)

kernel-modules-core

 

トークンバケットフィルター (TBF)

kernel-modules-core

Yes

重要

qdisc オフロードには、NIC でハードウェアとドライバーのサポートが必要です。

第26章 InfiniBand ネットワークおよび RDMA ネットワークの設定

さまざまなプロトコルを使用して、Remote Directory Memory Access (RDMA) ネットワークと InfiniBand ハードウェアをエンタープライズレベルで設定および管理できます。これらには、InfiniBand (IB)、RDMA over Converged Ethernet (RoCE)、iWARP などの IP ネットワークプロトコル、および RDMA 対応ハードウェアでのネイティブサポートとしての Omni-Path Architecture (OPA) プロトコルが含まれます。低レイテンシーで高スループットの接続を実現するために、IP over InfiniBand (IPoIB) を設定できます。

26.1. InfiniBand と RDMA の概要

InfiniBand は、次の 2 つの異なるものを指します。

  • InfiniBand ネットワーク用の物理リンク層プロトコル
  • Remote Direct Memory Access (RDMA) テクノロジーの実装である InfiniBand Verbs API

RDMA は、オペレーティングシステム、キャッシュ、またはストレージを使用せずに、2 台のコンピューターのメインメモリー間のアクセスを提供します。RDMA を使用することで、高スループット、低レイテンシー、低 CPU 使用率でデータ転送が可能になります。

通常の IP データ転送では、あるマシンのアプリケーションが別のマシンのアプリケーションにデータを送信すると、受信側で以下のアクションが起こります。

  1. カーネルがデータを受信する必要がある。
  2. カーネルは、データがアプリケーションに属するかどうかを判別する必要がある。
  3. カーネルは、アプリケーションを起動する。
  4. カーネルは、アプリケーションがカーネルへのシステムコールを実行するまで待機する。
  5. アプリケーションは、データをカーネルの内部メモリー領域から、アプリケーションが提供するバッファーにコピーする。

このプロセスでは、ホストアダプターが直接メモリーアクセス (DMA) などを使用する場合には、ほとんどのネットワークトラフィックが、システムのメインメモリーに少なくとも 2 回コピーされます。さらに、コンピューターはいくつかのコンテキストスイッチを実行して、カーネルとアプリケーションを切り替えます。これらのコンテキストスイッチは、他のタスクの速度を低下させる一方で、高いトラフィックレートで高い CPU 負荷を引き起こす可能性があります。

従来の IP 通信とは異なり、RDMA 通信は通信プロセスでのカーネルの介入を回避します。これにより、CPU のオーバーヘッドが軽減されます。パケットがネットワークに入ると、RDMA プロトコルにより、どのアプリケーションがパケットを受信するか、またそのアプリケーションのメモリー空間のどこにパケットを保存するかをホストアダプターが決定できるようになります。処理のためにパケットをカーネルに送信してユーザーアプリケーションのメモリーにコピーする代わりに、ホストアダプターは、パケットの内容をアプリケーションバッファーに直接配置します。このプロセスには、別個の API である InfiniBand Verbs API が必要であり、アプリケーションは RDMA を使用するために InfiniBand Verbs API を実装する必要があります。

Red Hat Enterprise Linux は、InfiniBand ハードウェアと InfiniBand Verbs API の両方をサポートしています。さらに、InfiniBand 以外のハードウェアで InfiniBand Verbs API を使用するための次のテクノロジーをサポートしています。

  • iWARP: IP ネットワーク上で RDMA を実装するネットワークプロトコル
  • RDMA over Converged Ethernet (RoCE)、別名 InfiniBand over Ethernet (IBoE): RDMA over Ethernet ネットワークを実装するネットワークプロトコル

26.2. コア RDMA サブシステムの設定

rdma サービス設定は、InfiniBand、iWARP、RoCE などのネットワークプロトコルと通信標準を管理します。

手順

  • rdma-core パッケージをインストールします。

    # dnf install rdma-core
    Copy to Clipboard Toggle word wrap

検証

  1. libibverbs-utils および infiniband-diags パッケージをインストールします。

    # dnf install libibverbs-utils infiniband-diags
    Copy to Clipboard Toggle word wrap
  2. 利用可能な InfiniBand デバイスのリストを表示します。

    # ibv_devices
    
        mlx5_0          	946dae0300418002
        mlx5_1          	946dae0300418003
    Copy to Clipboard Toggle word wrap
  3. mlx5_0 デバイスの情報を表示します。

    # ibv_devinfo -d mlx5_0
    
    hca_id:	mlx5_0
    	transport:			InfiniBand (0)
    	fw_ver:				28.42.1000
    	node_guid:			946d:ae03:0041:8002
    	sys_image_guid:			946d:ae03:0041:8002
    	vendor_id:			0x02c9
    	vendor_part_id:			4129
    	hw_ver:				0x0
    	board_id:			MT_0000000834
    	phys_port_cnt:			1
    		port:	1
    			state:			PORT_ACTIVE (4)
    			max_mtu:		4096 (5)
    			active_mtu:		4096 (5)
    			sm_lid:			3
    			port_lid:		66
    			port_lmc:		0x00
    			link_layer:		InfiniBand
    Copy to Clipboard Toggle word wrap
  4. mlx5_0 デバイスのステータスを表示します。

    # ibstat mlx5_0
    
    CA 'mlx5_0'
    	CA type: MT4129
    	Number of ports: 1
    	Firmware version: 28.42.1000
    	Hardware version: 0
    	Node GUID: 0x946dae0300418002
    	System image GUID: 0x946dae0300418002
    	Port 1:
    		State: Active
    		Physical state: LinkUp
    		Rate: 100
    		Base lid: 66
    		LMC: 0
    		SM lid: 3
    		Capability mask: 0xa759e848
    		Port GUID: 0x946dae0300418002
    		Link layer: InfiniBand
    Copy to Clipboard Toggle word wrap
  5. ibping ユーティリティーは、パラメーターを設定することで InfiniBand アドレスに ping を実行し、クライアント/サーバーとして動作します。

    1. ホスト上で InfiniBand チャネルアダプター (CA) 名 -C を指定し、ポート番号 -P でサーバーモード -S を開始します。

      # ibping -S -C mlx5_0 -P 1
      Copy to Clipboard Toggle word wrap
    2. ホスト上でローカル識別子 (LID) -L および InfiniBand チャネルアダプター (CA) 名 -C を指定し、ポート番号 -P でクライアントモードを開始して、パケット -c をいくつか送信します。

      # ibping -c 50 -C mlx5_0 -P 1 -L 2
      Copy to Clipboard Toggle word wrap

26.3. IPoIB の設定

デフォルトでは、InfiniBand は通信にインターネットプロトコル (IP) を使用しません。ただし、IPoIB (IP over InfiniBand) は、InfiniBand Remote Direct Memory Access (RDMA) ネットワーク上に IP ネットワークエミュレーション層を提供します。これにより、変更を加えていない既存のアプリケーションが InfiniBand ネットワーク経由でデータを送信できるようになりますが、アプリケーションが RDMA をネイティブに使用する場合よりもパフォーマンスが低下します。

注記

RHEL 8 以降の Mellanox デバイス (ConnectX-4 以降) は、デフォルトで Enhanced IPoIB モードを使用します (データグラムのみ)。これらのデバイスでは、Connected モードはサポートされていません。

26.3.1. IPoIB の通信モード

IPoIB デバイスは、Datagram モードまたは Connected モードのいずれかで設定可能です。違いは、通信の反対側で IPoIB 層がマシンで開こうとするキューペアのタイプです。

  • Datagram モードでは、システムは信頼できない非接続のキューペアを開きます。

    このモードは、InfiniBand リンク層の Maximum Transmission Unit (MTU) を超えるパッケージには対応していません。IPoIB 層は、データ転送時に IP パケットに 4 バイトの IPoIB ヘッダーを追加します。その結果、IPoIB MTU は InfiniBand リンク層 MTU より 4 バイト少なくなります。一般的な InfiniBand リンク層 MTU は 2048 であるため、Datagram モードの一般的な IPoIB デバイス MTU は 2044 になります。

  • Connected モードでは、システムは信頼できる接続されたキューペアを開きます。

    このモードでは、InfiniBand のリンク層の MTU より大きなメッセージを許可します。ホストアダプターがパケットのセグメンテーションと再構築を処理します。その結果、Connected モードでは、Infiniband アダプターから送信されるメッセージのサイズに制限がありません。しかし、data フィールドと TCP/IP header フィールドにより、IP パケットには制限があります。このため、Connected モードの IPoIB MTU は 65520 バイトです。

    Connected モードではパフォーマンスが向上しますが、より多くのカーネルメモリーを消費します。

システムが Connected モードを使用するように設定されていても、InfiniBand スイッチとファブリックは Connected モードでマルチキャストトラフィックを渡すことができないため、システムは引き続き Datagram モードを使用してマルチキャストトラフィックを送信します。また、ホストが Connected モードを使用するように設定されていない場合、システムは Datagram モードにフォールバックします。

インターフェイス上で MTU までのマルチキャストデータを送信するアプリケーションを実行しながら、インターフェイスを Datagram モードに設定するか、データグラムサイズのパケットに収まるように、パケットの送信サイズに上限を設けるようにアプリケーションを設定します。

26.3.2. IPoIB ハードウェアアドレスについて

IPoIB デバイスには、以下の部分で構成される 20 バイトのハードウェアアドレスがあります。

  • 最初の 4 バイトはフラグとキューペアの番号です。
  • 次の 8 バイトはサブネットの接頭辞です。

    デフォルトのサブネットの接頭辞は 0xfe:80:00:00:00:00:00:00 です。デバイスがサブネットマネージャーに接続すると、デバイスはこの接頭辞を変更して、設定されたサブネットマネージャーと一致させます。

  • 最後の 8 バイトは、IPoIB デバイスに接続する InfiniBand ポートのグローバル一意識別子 (GUID) です。
注記

最初の 12 バイトは変更される可能性があるため、udev デバイスマネージャールールでは使用しないでください。

26.3.4. nmcli を使用した IPoIB 接続の設定

nmcli ユーティリティーを使用して、コマンドラインで IP over InfiniBand 接続を作成できます。

前提条件

  • InfiniBand デバイスがサーバーにインストールされている。
  • 対応するカーネルモジュールがロードされている。

手順

  1. InfiniBand 接続を作成して、Connected トランスポートモードで mlx5_ib0 インターフェイスを使用し、最大 MTU が 65520 バイトになるようにします。

    # nmcli connection add type infiniband con-name mlx5_ib0 ifname mlx5_ib0 transport-mode Connected mtu 65520
    Copy to Clipboard Toggle word wrap
  2. P_Key を設定します。次に例を示します。

    # nmcli connection modify mlx5_ib0 infiniband.p-key 0x8002
    Copy to Clipboard Toggle word wrap
  3. IPv4 を設定します。

    • DHCP を使用するには、次のように実行します。

      # nmcli connection modify mlx5_ib0 ipv4.method auto
      Copy to Clipboard Toggle word wrap

      ipv4.method がすでに auto (デフォルト) に設定されている場合は、この手順をスキップしてください。

    • 静的 IPv4 アドレス、ネットワークマスク、デフォルトゲートウェイ、DNS サーバー、および検索ドメインを設定するには、次のように実行します。

      # nmcli connection modify mlx5_ib0 ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
      Copy to Clipboard Toggle word wrap
  4. IPv6 設定を行います。

    • ステートレスアドレス自動設定 (SLAAC) を使用するには、次のように実行します。

      # nmcli connection modify mlx5_ib0 ipv6.method auto
      Copy to Clipboard Toggle word wrap

      ipv6.method がすでに auto (デフォルト) に設定されている場合は、この手順をスキップしてください。

    • 静的 IPv6 アドレス、ネットワークマスク、デフォルトゲートウェイ、DNS サーバー、および検索ドメインを設定するには、次のように実行します。

      # nmcli connection modify mlx5_ib0 ipv6.method manual ipv6.addresses 2001:db8:1::fffe/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
      Copy to Clipboard Toggle word wrap
  5. プロファイルの他の設定をカスタマイズするには、次のコマンドを使用します。

    # nmcli connection modify mlx5_ib0 <setting> <value>
    Copy to Clipboard Toggle word wrap

    値はスペースまたはセミコロンで引用符で囲みます。

  6. プロファイルをアクティブ化します。

    # nmcli connection up mlx5_ib0
    Copy to Clipboard Toggle word wrap

検証

  • ping ユーティリティーを使用して、ICMP パケットをリモートホストの InfiniBand アダプターに送信します。次に例を示します。

    # ping -c5 192.0.2.2
    Copy to Clipboard Toggle word wrap

26.3.5. network RHEL システムロールを使用した IPoIB 接続の設定

IP over InfiniBand (IPoIB) を使用すると、InfiniBand インターフェイス経由で IP パケットを送信できます。IPoIB を設定するには、NetworkManager 接続プロファイルを作成します。Ansible と network システムロールを使用すると、このプロセスを自動化し、Playbook で定義されたホスト上の接続プロファイルをリモートで設定できます。

network RHEL システムロールを使用して IPoIB を設定できます。InfiniBand の親デバイスの接続プロファイルが存在しない場合は、このロールによって作成することもできます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • mlx5_ib0 という名前の InfiniBand デバイスが管理対象ノードにインストールされている。
  • 管理対象ノードが NetworkManager を使用してネットワークを設定している。

手順

  1. 次の内容を含む Playbook ファイル (例: ~/playbook.yml) を作成します。

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: IPoIB connection profile with static IP address settings
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              # InfiniBand connection mlx5_ib0
              - name: mlx5_ib0
                interface_name: mlx5_ib0
                type: infiniband
    
              # IPoIB device mlx5_ib0.8002 on top of mlx5_ib0
              - name: mlx5_ib0.8002
                type: infiniband
                autoconnect: yes
                infiniband:
                  p_key: 0x8002
                  transport_mode: datagram
                parent: mlx5_ib0
                ip:
                  address:
                    - 192.0.2.1/24
                    - 2001:db8:1::1/64
                state: up
    Copy to Clipboard Toggle word wrap

    サンプル Playbook で指定されている設定は次のとおりです。

    type: <profile_type>
    作成するプロファイルのタイプを設定します。このサンプル Playbook では、2 つの接続プロファイルを作成します。1 つは InfiniBand 接続用、もう 1 つは IPoIB デバイス用です。
    parent: <parent_device>
    IPoIB 接続プロファイルの親デバイスを設定します。
    p_key: <value>
    InfiniBand パーティションキーを設定します。この変数を設定する場合は、IPoIB デバイスに interface_name を設定しないでください。
    transport_mode: <mode>
    IPoIB 接続の動作モードを設定します。この変数は、datagram (デフォルト) または connected に設定できます。

    Playbook で使用されるすべての変数の詳細は、コントロールノードの /usr/share/ansible/roles/rhel-system-roles.network/README.md ファイルを参照してください。

  2. Playbook の構文を検証します。

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

検証

  1. mlx5_ib0.8002 デバイスの IP 設定を表示します。

    # ansible managed-node-01.example.com -m command -a 'ip address show mlx5_ib0.8002'
    managed-node-01.example.com | CHANGED | rc=0 >>
    ...
    inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute ib0.8002
       valid_lft forever preferred_lft forever
    inet6 2001:db8:1::1/64 scope link tentative noprefixroute
       valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. mlx5_ib0.8002 デバイスのパーティションキー (P_Key) を表示します。

    # ansible managed-node-01.example.com -m command -a 'cat /sys/class/net/mlx5_ib0.8002/pkey'
    managed-node-01.example.com | CHANGED | rc=0 >>
    0x8002
    Copy to Clipboard Toggle word wrap
  3. mlx5_ib0.8002 デバイスのモードを表示します。

    # ansible managed-node-01.example.com -m command -a 'cat /sys/class/net/mlx5_ib0.8002/mode'
    managed-node-01.example.com | CHANGED | rc=0 >>
    datagram
    Copy to Clipboard Toggle word wrap

26.3.6. nmstatectl を使用して IPoIB 接続を設定する

nmstatectl ユーティリティーを使用して、Nmstate API を介して IP over InfiniBand (IPoIB) 接続を設定できます。Nmstate API は、設定を行った後、結果が設定ファイルと一致することを確認します。何らかの障害が発生した場合には、nmstatectl は自動的に変更をロールバックし、システムが不正な状態のままにならないようにします。

前提条件

  • InfiniBand デバイスがサーバーにインストールされている。
  • InfiniBand デバイスのカーネルモジュールがロードされている。

手順

  1. 次の内容を含む YAML ファイル (例: ~/create-IPoIB-profile.yml) を作成します。

    interfaces:
    - name: mlx5_ib0.8002
      type: infiniband
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
      infiniband:
        base-iface: "mlx5_ib0"
        mode: datagram
        pkey: "0x8002"
    
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: mlx5_ib0.8002
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: mlx5_ib0.8002
    Copy to Clipboard Toggle word wrap

    IPoIB 接続に以下が設定されました。

    • IPOIB デバイス名: mlx5_ib0.8002
    • 基本インターフェイス (親): mlx5_ib0
    • InfiniBand パーティションキー: 0x8002
    • トランスポートモード: datagram
    • 静的 IPv4 アドレス: 192.0.2.1 (サブネットマスクが /24)
    • 静的 IPv6 アドレス: 2001:db8:1::1 (サブネットマスクが /64)
    • IPv4 デフォルトゲートウェイ: 192.0.2.254
    • IPv6 デフォルトゲートウェイ: 2001:db8:1::fffe
  2. 設定をシステムに適用します。

    # nmstatectl apply ~/create-IPoIB-profile.yml
    Copy to Clipboard Toggle word wrap

検証

  1. mlx5_ib0.8002 デバイスの IP 設定を表示します。

    # ip address show mlx5_ib0.8002
    ...
    inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute ib0.8002
       valid_lft forever preferred_lft forever
    inet6 2001:db8:1::1/64 scope link tentative noprefixroute
       valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. mlx5_ib0.8002 デバイスのパーティションキー (P_Key) を表示します。

    # cat /sys/class/net/mlx5_ib0.8002/pkey
    0x8002
    Copy to Clipboard Toggle word wrap
  3. mlx5_ib0.8002 デバイスのモードを表示します。

    # cat /sys/class/net/mlx5_ib0.8002/mode
    datagram
    Copy to Clipboard Toggle word wrap

26.3.7. IPoIB の設定後に iperf3 を使用して RDMA ネットワークをテストする

次の例では、大きなバッファーサイズを使用して、60 秒のテストを実行し、最大スループットを測定します。iperf3 ユーティリティーを使用して 2 つのホスト間の帯域幅とレイテンシーを十分に使用します。

前提条件

  • 両方のホストで IPoIB を設定している。

手順

  1. iperf3 をシステム上のサーバーとして実行するには、時間の間隔を定義して、定期的な帯域幅の更新 -i を指定し、クライアント接続の応答を待機するサーバー -s としてリッスンします。

    # iperf3 -i 5 -s
    Copy to Clipboard Toggle word wrap
  2. iperf3 を別のシステムでクライアントとして実行するには、時間の間隔を定義して、定期的な帯域幅の更新 -i を指定し、-t 秒使用して IP アドレス 192.168.2.2 のリスニングサーバー -c に接続します。

    # iperf3 -i 5 -t 60 -c 192.168.2.2
    Copy to Clipboard Toggle word wrap
  3. 以下のコマンドを使用します。

    1. サーバーとして動作するシステムでテスト結果を表示します。

      # iperf3 -i 10 -s
      -----------------------------------------------------------
      Server listening on 5201
      -----------------------------------------------------------
      Accepted connection from 192.168.2.3, port 22216
      [5] local 192.168.2.2 port 5201 connected to 192.168.2.3 port 22218
      [ID] Interval           Transfer     Bandwidth
      [5]   0.00-10.00  sec  17.5 GBytes  15.0 Gbits/sec
      [5]  10.00-20.00  sec  17.6 GBytes  15.2 Gbits/sec
      [5]  20.00-30.00  sec  18.4 GBytes  15.8 Gbits/sec
      [5]  30.00-40.00  sec  18.0 GBytes  15.5 Gbits/sec
      [5]  40.00-50.00  sec  17.5 GBytes  15.1 Gbits/sec
      [5]  50.00-60.00  sec  18.1 GBytes  15.5 Gbits/sec
      [5]  60.00-60.04  sec  82.2 MBytes  17.3 Gbits/sec
      - - - - - - - - - - - - - - - - - - - - - - - - -
      [ID] Interval           Transfer     Bandwidth
      [5]   0.00-60.04  sec  0.00 Bytes    0.00 bits/sec  sender
      [5]   0.00-60.04  sec   107 GBytes  15.3 Gbits/sec  receiver
      Copy to Clipboard Toggle word wrap
    2. クライアントとして動作するシステムでテスト結果を表示します。

      # iperf3 -i 1 -t 60 -c 192.168.2.2
      
      Connecting to host 192.168.2.2, port 5201
      [4] local 192.168.2.3 port 22218 connected to 192.168.2.2 port 5201
      [ID] Interval           Transfer     Bandwidth       Retr  Cwnd
      [4]   0.00-10.00  sec  17.6 GBytes  15.1 Gbits/sec    0   6.01 MBytes
      [4]  10.00-20.00  sec  17.6 GBytes  15.1 Gbits/sec    0   6.01 MBytes
      [4]  20.00-30.00  sec  18.4 GBytes  15.8 Gbits/sec    0   6.01 MBytes
      [4]  30.00-40.00  sec  18.0 GBytes  15.5 Gbits/sec    0   6.01 MBytes
      [4]  40.00-50.00  sec  17.5 GBytes  15.1 Gbits/sec    0   6.01 MBytes
      [4]  50.00-60.00  sec  18.1 GBytes  15.5 Gbits/sec    0   6.01 MBytes
      - - - - - - - - - - - - - - - - - - - - - - - - -
      [ID] Interval           Transfer     Bandwidth       Retr
      [4]   0.00-60.00  sec   107 GBytes  15.4 Gbits/sec    0   sender
      [4]   0.00-60.00  sec   107 GBytes  15.4 Gbits/sec        receiver
      Copy to Clipboard Toggle word wrap

26.4. RoCE の設定

Remote Direct Memory Access (RDMA) over Converged Ethernet (RoCE) は、イーサネットネットワーク上で RDMA を利用するネットワークプロトコルです。RoCE の設定には特定のハードウェアが必要です。ハードウェアベンダーには Mellanox、Broadcom、QLogic などがあります。

26.4.1. RoCE プロトコルバージョンの概要

以下は、RoCE のさまざまなバージョンです。

RoCE v1
RoCE バージョン 1 プロトコルは、Ethertype 0x8915 を持つイーサネットリンク層プロトコルです。同じイーサネットブロードキャストドメイン内にある 2 つのホスト間の通信を可能にします。
RoCE v2
RoCE バージョン 2 プロトコルは、UDP over IPv4 または UDP over IPv6 プロトコルの上位に存在します。RoCE v2 の場合、UDP の宛先ポート番号は 4791 です。

RDMA_CM は、データを転送するためにクライアントとサーバーとの間に信頼できる接続を確立します。RDMA_CM は、接続を確立するために RDMA トランスポートに依存しないインターフェイスを提供します。通信は、特定の RDMA デバイスとメッセージベースのデータ転送を使用します。

重要

クライアントで RoCE v2 を使用し、サーバーで RoCE v1 を使用するなど、異なるバージョンの使用はサポートされていません。このような場合は、サーバーとクライアントの両方が RoCE v1 で通信するように設定してください。

RoCE v1 はデータリンク層 (Layer 2) で動作し、同じネットワーク内の 2 台のマシンの通信のみをサポートします。デフォルトでは、RoCE v2 を使用できます。これは、ネットワーク層 (Layer 3) で機能します。RoCE v2 は、複数のイーサネットとの接続を提供するパケットルーティングをサポートしています。

26.4.2. デフォルトの RoCE バージョンを一時的に変更する

クライアントで RoCE v2 プロトコルを使用し、サーバーで RoCE v1 を使用することはサポートされていません。サーバーのハードウェアが RoCE v1 のみをサポートしている場合は、サーバーと通信できるようにクライアントを RoCE v1 用に設定します。たとえば、RoCE v1 のみをサポートする Mellanox ConnectX-5 InfiniBand デバイス用には、mlx5_0 ドライバーを使用するクライアントを設定できます。

注記

ここで説明する変更は、ホストを再起動するまで有効です。

前提条件

  • クライアントが、RoCE v2 プロトコルに対応した InfiniBand デバイスを使用している。
  • サーバーが、RoCEv1 のみをサポートする InfiniBand デバイスを使用している。

手順

  1. /sys/kernel/config/rdma_cm/mlx5_0/ ディレクトリーを作成します。

    # mkdir /sys/kernel/config/rdma_cm/mlx5_0/
    Copy to Clipboard Toggle word wrap
  2. デフォルトの RoCE モードを表示します。

    # cat /sys/kernel/config/rdma_cm/mlx5_0/ports/1/default_roce_mode
    
    RoCE v2
    Copy to Clipboard Toggle word wrap
  3. デフォルトの RoCE モードをバージョン 1 に変更します。

    # echo "IB/RoCE v1" > /sys/kernel/config/rdma_cm/mlx5_0/ports/1/default_roce_mode
    Copy to Clipboard Toggle word wrap

26.5. システムでユーザーがピニング (固定) できるメモリーの量を増やす

Remote Direct Memory Access (RDMA) の操作には、物理メモリーのピニングが必要です。これにより、カーネルがスワップ領域にメモリーを書き込むことができなくなります。ユーザーがメモリーを過剰に固定すると、システムのメモリーが不足し、カーネルがプロセスを終了してより多くのメモリーを解放することがあります。したがって、メモリーのピニングは特権が必要な操作です。

root 以外のユーザーが大規模な RDMA アプリケーションを実行する必要がある場合は、プライマリーメモリー内のページを常にピニングしておくために、メモリーの量を増やす必要があります。

手順

  • root ユーザーで、/etc/security/limits.conf ファイルを以下の内容で作成します。

    @rdma soft memlock unlimited
    @rdma hard memlock unlimited
    Copy to Clipboard Toggle word wrap

    詳細は、システム上の limits.conf(5) man ページを参照してください。

検証

  1. /etc/security/limits.conf ファイルの編集後、rdma グループのメンバーとしてログインします。

    Red Hat Enterprise Linux は、ユーザーのログイン時に、更新された ulimit の設定を適用することに注意してください。

  2. ulimit -l コマンドを使用して制限を表示します。

    $ ulimit -l
    unlimited
    Copy to Clipboard Toggle word wrap

    コマンドが unlimited を返す場合、ユーザーはメモリーのピニングを無制限に行うことができます。

26.6. NFS サーバーで NFS over RDMA を有効にする

Remote Direct Memory Access (RDMA) は、クライアントシステムがストレージサーバーのメモリーから自身のメモリーにデータを直接転送できるようにするプロトコルです。これにより、ストレージのスループットが向上し、サーバーとクライアント間のデータ転送の遅延が減少し、両側の CPU 負荷が軽減されます。NFS サーバーとクライアントの両方が RDMA 経由で接続されている場合、クライアントは NFS over RDMA (NFSoRDMA) を使用してエクスポートされたディレクトリーをマウントできます。

前提条件

  • NFS サービスが実行および設定されている。
  • InfiniBand または RDMA over Converged Ethernet (RoCE) デバイスがサーバーにインストールされている。
  • サーバーに IP over InfiniBand (IPoIB) が設定され、InfiniBand デバイスに IP アドレスが割り当てられている。

手順

  1. rdma-core パッケージをインストールします。

    # dnf install rdma-core
    Copy to Clipboard Toggle word wrap
  2. パッケージがすでにインストールされている場合は、/etc/rdma/modules/rdma.conf ファイル内の xprtrdma および svcrdma モジュールのコメントが解除されていることを確認します。

    # NFS over RDMA client support
    xprtrdma
    # NFS over RDMA server support
    svcrdma
    Copy to Clipboard Toggle word wrap
  3. オプション: デフォルトでは、NFS over RDMA はポート 20049 を使用します。別のポートを使用する場合は、/etc/nfs.conf ファイルの [nfsd] セクションで rdma-port 設定を指定します。

    rdma-port=<port>
    Copy to Clipboard Toggle word wrap
  4. firewalld で NFSoRDMA ポートを開きます。

    # firewall-cmd --permanent --add-port={20049/tcp,20049/udp}
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

    20049 以外のポートを設定する場合は、ポート番号を変更します。

  5. nfs-server サービスを再起動します。

    # systemctl restart nfs-server
    Copy to Clipboard Toggle word wrap

検証

  1. InfiniBand ハードウェアを搭載したクライアントで、次の手順を実行します。

    1. 以下のパッケージをインストールします。

      # dnf install nfs-utils rdma-core
      Copy to Clipboard Toggle word wrap
    2. エクスポートされた NFS 共有を RDMA 経由でマウントします。

      # mount -o rdma server.example.com:/nfs/projects/ /mnt/
      Copy to Clipboard Toggle word wrap

      デフォルト (20049) 以外のポート番号を設定する場合は、コマンドに port=<port_number> を渡します。

      # mount -o rdma,port=<port_number> server.example.com:/nfs/projects/ /mnt/
      Copy to Clipboard Toggle word wrap
    3. rdma オプションを使用して共有がマウントされたことを確認します。

      # mount | grep "/mnt"
      server.example.com:/nfs/projects/ on /mnt type nfs (...,proto=rdma,...)
      Copy to Clipboard Toggle word wrap

26.7. InfiniBand サブネットマネージャー

すべての InfiniBand ネットワークでは、ネットワークが機能するために、サブネットマネージャーが実行されている必要があります。これは、2 台のマシンがスイッチなしで直接接続されている場合にも当てはまります。

複数のサブネットマネージャーを使用することもできます。その場合、1 つのサブネットマネージャーはコントローラーとして、もう 1 つはポートとして機能します。ポートは、マスターサブネットマネージャーに障害が発生した場合に引き継ぎます。

Red Hat Enterprise Linux は、InfiniBand サブネットマネージャーの実装である OpenSM を提供します。ただし、OpenSM は機能が限られており、アップストリームの開発が活発に行われていません。通常、InfiniBand スイッチに組み込まれているサブネットマネージャーのほうが、より多くの機能を備えており、最新の InfiniBand ハードウェアをサポートしています。詳細は、Installing and configuring the OpenSM InfiniBand subnet manager を参照してください。

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat