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


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

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

ポリシー説明名前の例

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

    インターフェイスの 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

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

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

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

    # reboot
    Copy to Clipboard
  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

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

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

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

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

    # nmcli connection up example_profile
    Copy to Clipboard

検証

  • ネットワークインターフェイスの 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

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

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

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

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

    # cat /sys/class/net/enp1s0/type
    1
    Copy to Clipboard
  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
    重要

    ブートプロセス中に一貫したデバイス名が必要な場合は、ファイル名として 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
  4. オプション: initrd RAM ディスクイメージを再生成します。

    # dracut -f
    Copy to Clipboard

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

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

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

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

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

    # reboot
    Copy to Clipboard
  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
  10. 新しいインターフェイス名のみと一致するように接続プロファイルを設定します。

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

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

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

    # nmcli connection up example_profile
    Copy to Clipboard

第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

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

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

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

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

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

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

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

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

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

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

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

      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
  6. IPv6 設定を行います。

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

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

      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
  7. プロファイルの他の設定をカスタマイズするには、次のコマンドを使用します。

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

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

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

    # nmcli connection up Internal-LAN
    Copy to Clipboard

検証

  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
  2. IPv4 デフォルトゲートウェイを表示します。

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

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

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

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

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

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

トラブルシューティング

  • ネットワークケーブルがホストとスイッチに差し込まれていることを確認します。
  • リンク障害がこのホストだけに存在するか、同じスイッチに接続された他のホストにも存在するかを確認します。
  • ネットワークケーブルとネットワークインターフェイスが予想どおりに機能していることを確認します。ハードウェア診断手順を実行し、不具合のあるケーブルとネットワークインターフェイスカードを交換します。
  • ディスクの設定がデバイスの設定と一致しない場合は、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
  2. nmtui を開始します。

    # nmtui
    Copy to Clipboard
  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 アドレス設定によるイーサネット接続の例

    nmtui ethernet static 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
  2. IPv4 デフォルトゲートウェイを表示します。

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

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

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

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

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

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

トラブルシューティング

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

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

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

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

前提条件

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

手順

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

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

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

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

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

      IP 設定 gnome 設定
  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
  2. IPv4 デフォルトゲートウェイを表示します。

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

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

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

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

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

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

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

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

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

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

    これらの設定では、次の設定を使用して 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
  3. 設定をシステムに適用します。

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

検証

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

    # nmstatectl show enp1s0
    Copy to Clipboard
  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
  3. IPv4 デフォルトゲートウェイを表示します。

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

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

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

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

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

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

2.5. network RHEL システムロールとインターフェイス名を使用した静的 IP アドレスでのイーサネット接続の設定

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
  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

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

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

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

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

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

  4. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  • 管理対象ノードの 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

2.6. network RHEL システムロールとデバイスパスを使用した静的 IP アドレスでのイーサネット接続の設定

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

    サンプル 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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  • 管理対象ノードの 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

2.7. 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

    これらの設定では、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
  3. 設定をシステムに適用します。

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

検証

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

    # nmstatectl show enp1s0
    Copy to Clipboard
  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
  3. IPv4 デフォルトゲートウェイを表示します。

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

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

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

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

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

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

2.8. network RHEL システムロールとインターフェイス名を使用した動的 IP アドレスでのイーサネット接続の設定

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

    サンプル 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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  • 管理対象ノードの 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

2.9. network RHEL システムロールとデバイスパスを使用した動的 IP アドレスでのイーサネット接続の設定

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

    サンプル 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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  • 管理対象ノードの 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

2.10. インターフェイス名による単一の接続プロファイルを使用した複数のイーサネットインターフェイスの設定

ほとんどの場合、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

検証

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

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

    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

2.11. 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
  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

検証

  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
  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

    この接続プロファイルは、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. ボンディングモードに応じたアップストリームのスイッチ設定

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

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

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

    このコマンドは、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
  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

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

    • 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

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

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

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

        # nmcli connection modify bridge0 controller bond0
        # nmcli connection modify bridge1 controller bond0
        Copy to Clipboard

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

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

        # nmcli connection up bridge0
        # nmcli connection up bridge1
        Copy to Clipboard
  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
    • 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
    • ステートレスアドレス自動設定 (SLAAC) を使用する場合、アクションは必要ありません。
    • このボンディングデバイスを他のデバイスのポートとして使用する予定の場合は、何もする必要はありません。
  6. オプション: ボンディングポートにパラメーターを設定する場合は、次のコマンドを使用します。

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

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

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

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

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

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

      # nmcli connection up bond0
      Copy to Clipboard

検証

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

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

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

    # cat /proc/net/bonding/bond0
    Copy to Clipboard

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 セクションで設定します。

      ボンディングブリッジ vlan.ipv4
    7. Apply をクリックします。

検証

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

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

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

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

    # cat /proc/net/bonding/bond0
    Copy to Clipboard

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
  2. nmtui を開始します。

    # nmtui
    Copy to Clipboard
  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 イーサネットデバイスをポートとしてボンドに追加する

      nmtui bond add port
    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 アドレス設定によるボンド接続例

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

検証

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

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

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

    # cat /proc/net/bonding/bond0
    Copy to Clipboard

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

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

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

前提条件

  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。
  • 物理または仮想のイーサネットデバイスをサーバーにインストールしてボンディングでポートとしてイーサネットデバイスを使用する。
  • ポート リストでインターフェイス名を設定し、対応するインターフェイスを定義して、ボンディングのポートとしてチーム、ブリッジ、または VLAN デバイスを使用する。
  • 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

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

    • ボンドのネットワークインターフェイス: 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

検証

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

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    bond0       bond      connected  bond0
    Copy to Clipboard
  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
  3. 接続設定を YAML 形式で表示します。

    # nmstatectl show bond0
    Copy to Clipboard

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

    サンプル 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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  • ネットワークデバイスの 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 を提供します。このモードの設定の詳細は、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 です。

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

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

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 アドレスを使用する他の複数システムとの間に発生している場合

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

ボンディングが複数のコンテナーまたは仮想マシン (VM) からのネットワークトラフィックを伝送し、それらの MAC アドレスをブリッジネットワークなどの外部ネットワークに直接公開し、モード 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
  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

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

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

    # nmcli connection modify vlan10 ethernet.mtu 2000
    Copy to Clipboard
  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
    • 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
    • ステートレスアドレス自動設定 (SLAAC) を使用する場合、アクションは必要ありません。
    • この VLAN デバイスを他のデバイスのポートとして使用する予定の場合は、何もする必要はありません。
  6. 接続をアクティベートします。

    # nmcli connection up vlan10
    Copy to Clipboard

検証

  • 設定を確認します。

    # 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

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
  2. ベース VLAN インターフェイスを作成します。たとえば、enp1s0 を親インターフェイスとして使用し、パケットに VLAN ID 10 のタグを付ける vlan10 という名前のベース VLAN インターフェイスを作成するには、次のように実行します。

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

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

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

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

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

    このコマンドは、親 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
  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
  7. プロファイルをアクティブ化します。

    # nmcli connection up vlan10.20
    Copy to Clipboard

検証

  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

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 デバイスの名前を入力するか、自動生成された名前のままにします。

    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 セクションで設定します。

      ボンディングブリッジ vlan.ipv4
    7. Apply をクリックします。

検証

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

    VLAN 検証

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
  2. nmtui を開始します。

    # nmtui
    Copy to Clipboard
  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 接続例

    nmtui vlan static IP
  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

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

    これらの設定では、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

検証

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

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    vlan10      vlan      connected  vlan10
    Copy to Clipboard
  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
  3. 接続設定を YAML 形式で表示します。

    # nmstatectl show vlan10
    Copy to Clipboard

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

    サンプル 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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  • 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

第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

    このコマンドにより 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

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

    • 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

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

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

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

        # nmcli connection modify bond0 master bridge0
        # nmcli connection modify bond1 master bridge0
        Copy to Clipboard

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

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

        # nmcli connection up bond0
        # nmcli connection up bond1
        Copy to Clipboard
  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
    • 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
    • ステートレスアドレス自動設定 (SLAAC) を使用する場合、アクションは必要ありません。
    • このブリッジデバイスを他のデバイスのポートとして使用する予定の場合は、特に必要な操作はありません。
  6. 必要に応じて、ブリッジのその他のプロパティーを設定します。たとえば、bridge0 の STP (Spanning Tree Protocol) の優先度を 16384 に設定するには、次のコマンドを実行します。

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

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

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

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

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

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

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

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

      # nmcli connection up bridge0
      Copy to Clipboard

検証

  • 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
  • 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

    特定のイーサネットデバイスのステータスを表示するには、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 セクションで設定します。

      ボンディングブリッジ vlan.ipv4
    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
  2. nmtui を開始します。

    # nmtui
    Copy to Clipboard
  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 イーサネットデバイスをポートとしてブリッジに追加する

      nmtui bridge add port
    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 アドレス設定なしのブリッジ接続例

    nmtui bridge no 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
  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

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

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

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

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

前提条件

  • サーバーに、2 つ以上の物理ネットワークデバイスまたは仮想ネットワークデバイスがインストールされている。
  • 物理または仮想のイーサネットデバイスをサーバーにインストールし、ブリッジでイーサネットデバイスをポートとして使用する。
  • ポート リストでインターフェイス名を設定し、対応するインターフェイスを定義して、ブリッジのポートとしてチーム、ボンディング、または VLAN デバイスを使用する。
  • 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

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

    • ブリッジのネットワークインターフェイス: 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

検証

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

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    bridge0     bridge    connected  bridge0
    Copy to Clipboard
  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
  3. 接続設定を YAML 形式で表示します。

    # nmstatectl show bridge0
    Copy to Clipboard

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

    サンプル 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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  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
  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

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

仮想プライベートネットワーク (VPN) は、インターネット経由でローカルネットワークに接続する方法です。Libreswan により提供される IPsec は、VPN を作成するための望ましい方法です。Libreswan は、VPN のユーザー空間 IPsec 実装です。VPN は、インターネットなどの中間ネットワークにトンネルを設定して、使用中の LAN と別のリモート LAN との間の通信を可能にします。セキュリティー上の理由から、VPN トンネルは常に認証と暗号化を使用します。暗号化操作では、LibreswanNSS ライブラリーを使用します。

6.1. IPsec VPN 実装としての Libreswan

RHEL では、IPsec プロトコルを使用して仮想プライベートネットワーク (VPN) を設定できます。これは、Libreswan アプリケーションによりサポートされます。Libreswan は、Openswan アプリケーションの延長であり、Openswan ドキュメントの多くの例は Libreswan でも利用できます。

VPN の IPsec プロトコルは、IKE (Internet Key Exchange) プロトコルを使用して設定されます。IPsec と IKE は同義語です。IPsec VPN は、IKE VPN、IKEv2 VPN、XAUTH VPN、Cisco VPN、または IKE/IPsec VPN とも呼ばれます。

Libreswan は、オープンソースのユーザー空間の IKE 実装です。IKE v1 および v2 は、ユーザーレベルのデーモンとして実装されます。IKE プロトコルも暗号化されています。IPsec プロトコルは Linux カーネルで実装され、Libreswan は、VPN トンネル設定を追加および削除するようにカーネルを設定します。

IKE プロトコルは、UDP ポート 500 および 4500 を使用します。IPsec プロトコルは、以下の 2 つのプロトコルで構成されます。

  • 暗号セキュリティーペイロード (ESP) (プロトコル番号が 50)
  • 認証ヘッダー (AH) (プロトコル番号 51)

AH プロトコルの使用は推奨されていません。AH のユーザーは、null 暗号化で ESP に移行することが推奨されます。

IPsec プロトコルは、以下の 2 つの操作モードを提供します。

  • トンネルモード (デフォルト)
  • トランスポートモード

IKE を使用せずに IPsec を使用してカーネルを設定できます。これは、手動キーリング と呼ばれます。また、ip xfrm コマンドを使用して手動キーを設定できますが、これはセキュリティー上の理由からは強く推奨されません。Libreswan は、Netlink インターフェイスを使用して Linux カーネルと通信します。カーネルはパケットの暗号化と復号化を実行します。

Libreswan は、ネットワークセキュリティーサービス (NSS) 暗号化ライブラリーを使用します。

重要

Libreswan および Linux カーネルが実装する IKE/IPsec の VPN は、RHEL で使用することが推奨される唯一の VPN 技術です。その他の VPN 技術は、そのリスクを理解せずに使用しないでください。

RHEL では、Libreswan はデフォルトで システム全体の暗号化ポリシー に従います。これにより、Libreswan は、デフォルトのプロトコルとして IKEv2 を含む現在の脅威モデルに対して安全な設定を使用するようになります。詳細は、システム全体の暗号化ポリシーの使用 を参照してください。

IKE/IPsec はピアツーピアプロトコルであるため、Libreswan では、"ソース" および "宛先"、または "サーバー" および "クライアント" という用語を使用しません。終了点 (ホスト) を参照する場合は、代わりに "左" と "右" という用語を使用します。これにより、ほとんどの場合、両方の終了点で同じ設定も使用できます。ただし、管理者は通常、ローカルホストに "左" を使用し、リモートホストに "右" を使用します。

leftidrightid オプションは、認証プロセス内の各ホストの識別として機能します。詳細は、man ページの ipsec.conf(5) を参照してください。

6.2. Libreswan の認証方法

Libreswan は複数の認証方法をサポートしますが、それぞれは異なるシナリオとなっています。

事前共有キー (PSK)

事前共有キー (PSK) は、最も簡単な認証メソッドです。セキュリティー上の理由から、PSK は 64 文字未満は使用しないでください。FIPS モードでは、PSK は、使用される整合性アルゴリズムに応じて、最低強度の要件に準拠する必要があります。authby=secret 接続を使用して PSK を設定できます。

Raw RSA 鍵

Raw RSA 鍵 は、静的なホスト間またはサブネット間の IPsec 設定で一般的に使用されます。各ホストは、他のすべてのホストのパブリック RSA 鍵を使用して手動で設定され、Libreswan はホストの各ペア間で IPsec トンネルを設定します。この方法は、多数のホストでは適切にスケーリングされません。

ipsec newhostkey コマンドを使用して、ホストで Raw RSA 鍵を生成できます。ipsec showhostkey コマンドを使用して、生成された鍵をリスト表示できます。leftrsasigkey= の行は、CKA ID キーを使用する接続設定に必要です。Raw RSA 鍵に authby=rsasig 接続オプションを使用します。

X.509 証明書

X.509 証明書 は、共通の IPsec ゲートウェイに接続するホストが含まれる大規模なデプロイメントに一般的に使用されます。中央の 認証局 (CA) は、ホストまたはユーザーの RSA 証明書に署名します。この中央 CA は、個別のホストまたはユーザーの取り消しを含む、信頼のリレーを行います。

たとえば、openssl コマンドおよび NSS certutil コマンドを使用して X.509 証明書を生成できます。Libreswan は、leftcert= 設定オプションの証明書のニックネームを使用して NSS データベースからユーザー証明書を読み取るため、証明書の作成時にニックネームを指定します。

カスタム CA 証明書を使用する場合は、これを Network Security Services(NSS) データベースにインポートする必要があります。ipsec import コマンドを使用して、PKCS #12 形式の証明書を Libreswan NSS データベースにインポートできます。

警告

Libreswan は、section 3.1 of RFC 4945 で説明されているように、すべてのピア証明書のサブジェクト代替名 (SAN) としてインターネット鍵 Exchange(IKE) ピア ID を必要とします。require-id-on-certificate=no 接続オプションを設定してこのチェックを無効にすると、システムが中間者攻撃に対して脆弱になる可能性があります。

SHA-2 で RSA を使用した X.509 証明書に基づく認証に authby=rsasig 接続オプションを使用します。authby=ecdsa に設定し、authby=rsa-sha2 を介した SHA-2 による RSA Probabilistic Signature Scheme (RSASSA-PSS) デジタル署名ベースの認証を設定することにより、SHA-2 を使用する ECDSA デジタル署名に対してさらに制限することができます。IKEv2 ピア認証のデフォルト値は authby=rsasig,ecdsa です。

証明書と authby= 署名メソッドが一致する必要があります。これにより、相互運用性が向上し、1 つのデジタル署名システムでの認証が維持されます。

NULL 認証

NULL 認証 は、認証なしでメッシュ暗号化を実現するために使用されます。これは、パッシブ攻撃は防ぎますが、アクティブ攻撃は防ぎません。ただし、IKEv2 は非対称認証メソッドを許可するため、NULL 認証はインターネットスケールのオポチュニスティック IPsec にも使用できます。このモデルでは、クライアントはサーバーを認証しますが、サーバーはクライアントを認証しません。このモデルは、TLS を使用して Web サイトのセキュリティーを保護するのと似ています。NULL 認証に authby=null を使用します。

量子コンピューターに対する保護

上記の認証方法に加えて、Post-quantum Pre-shared Key (PPK) メソッドを使用して、量子コンピューターによる潜在的な攻撃から保護することができます。個々のクライアントまたはクライアントグループは、帯域外で設定された事前共有鍵に対応する PPK ID を指定することにより、独自の PPK を使用できます。

事前共有キーで IKEv1 を使用すると、量子攻撃者から保護されます。IKEv2 の再設計は、この保護をネイティブに提供しません。Libreswan は、Post-quantum Pre-shared Key (PPK) を使用して、量子攻撃から IKEv2 接続を保護します。

任意の PPK 対応を有効にする場合は、接続定義に ppk=yes を追加します。PPK が必要な場合は ppk=insist を追加します。次に、各クライアントには、帯域外で通信する (および可能であれば量子攻撃に対して安全な) シークレット値を持つ PPK ID を付与できます。PPK はランダム性において非常に強力で、辞書の単語に基づいていません。PPK ID と PPK データは、次のように ipsec.secrets ファイルに保存されます。

@west @east : PPKS "user1" "thestringismeanttobearandomstr"
Copy to Clipboard

PPKS オプションは、静的な PPK を参照します。実験的な関数は、ワンタイムパッドに基づいた動的 PPK を使用します。各接続では、ワンタイムパッドの新しい部分が PPK として使用されます。これを使用すると、ファイル内の動的な PPK の部分がゼロで上書きされ、再利用を防ぐことができます。複数のタイムパッドマテリアルが残っていないと、接続は失敗します。詳細は、man ページの ipsec.secrets(5) を参照してください。

6.3. Libreswan のインストール

Libreswan IPsec/IKE 実装を通じて VPN を設定する前に、対応するパッケージをインストールし、ipsec サービスを開始して、ファイアウォールでサービスを許可する必要があります。

前提条件

  • AppStream リポジトリーが有効になっている。

手順

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

    # dnf install libreswan
    Copy to Clipboard
  2. Libreswan を再インストールする場合は、古いデータベースファイルを削除し、新しいデータベースを作成します。

    # systemctl stop ipsec
    # rm /var/lib/ipsec/nss/*db
    # ipsec initnss
    Copy to Clipboard
  3. ipsec サービスを開始して有効にし、システムの起動時にサービスを自動的に開始できるようにします。

    # systemctl enable ipsec --now
    Copy to Clipboard
  4. ファイアウォールで、ipsec サービスを追加して、IKE プロトコル、ESP プロトコル、および AH プロトコルの 500/UDP ポートおよび 4500/UDP ポートを許可するように設定します。

    # firewall-cmd --add-service="ipsec"
    # firewall-cmd --runtime-to-permanent
    Copy to Clipboard

6.4. ホスト間の VPN の作成

raw RSA キーによる認証を使用して、 および と呼ばれる 2 つのホスト間に、ホストツーホスト IPsec VPN を作成するように Libreswan を設定できます。

前提条件

  • Libreswan がインストールされ、ipsec サービスが各ノードで開始している。

手順

  1. 各ホストで Raw RSA 鍵ペアを生成します。

    # ipsec newhostkey
    Copy to Clipboard
  2. 前の手順で生成した鍵の ckaid を返します。 で次のコマンドを実行して、その ckaid を使用します。以下に例を示します。

    # ipsec showhostkey --left --ckaid 2d3ea57b61c9419dfd6cf43a1eb6cb306c0e857d
    Copy to Clipboard

    上のコマンドの出力により、設定に必要な leftrsasigkey= 行が生成されます。次のホスト () でも同じ操作を行います。

    # ipsec showhostkey --right --ckaid a9e1f6ce9ecd3608c24e8f701318383f41798f03
    Copy to Clipboard
  3. /etc/ipsec.d/ ディレクトリーで、新しい my_host-to-host.conf ファイルを作成します。上の手順の ipsec showhostkey コマンドの出力から、RSA ホストの鍵を新規ファイルに書き込みます。以下に例を示します。

    conn mytunnel
        leftid=@west
        left=192.1.2.23
        leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ==
        rightid=@east
        right=192.1.2.45
        rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ==
        authby=rsasig
    Copy to Clipboard
  4. 鍵をインポートしたら、ipsec サービスを再起動します。

    # systemctl restart ipsec
    Copy to Clipboard
  5. 接続を読み込みます。

    # ipsec add mytunnel
    Copy to Clipboard
  6. トンネルを確立します。

    # ipsec up mytunnel
    Copy to Clipboard
  7. ipsec サービスの開始時に自動的にトンネルを開始するには、以下の行を接続定義に追加します。

    auto=start
    Copy to Clipboard
  8. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

6.5. サイト間 VPN の設定

2 つのネットワークを結合してサイト間の IPsec VPN を作成する場合は、その 2 つのホスト間の IPsec トンネルが作成されます。これにより、ホストは終了点として動作し、1 つまたは複数のサブネットからのトラフィックが通過できるように設定されます。したがって、ホストを、ネットワークのリモート部分にゲートウェイとして見なすことができます。

サイト間の VPN の設定は、設定ファイル内で複数のネットワークまたはサブネットを指定する必要がある点のみが、ホスト間の VPN とは異なります。

前提条件

手順

  1. ホスト間の VPN の設定が含まれるファイルを、新規ファイルにコピーします。以下に例を示します。

    # cp /etc/ipsec.d/my_host-to-host.conf /etc/ipsec.d/my_site-to-site.conf
    Copy to Clipboard
  2. 上の手順で作成したファイルに、サブネット設定を追加します。以下に例を示します。

    conn mysubnet
         also=mytunnel
         leftsubnet=192.0.1.0/24
         rightsubnet=192.0.2.0/24
         auto=start
    
    conn mysubnet6
         also=mytunnel
         leftsubnet=2001:db8:0:1::/64
         rightsubnet=2001:db8:0:2::/64
         auto=start
    
    # the following part of the configuration file is the same for both host-to-host and site-to-site connections:
    
    conn mytunnel
        leftid=@west
        left=192.1.2.23
        leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ==
        rightid=@east
        right=192.1.2.45
        rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ==
        authby=rsasig
    Copy to Clipboard
  3. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

6.6. リモートアクセスの VPN の設定

ロードウォーリアーとは、モバイルクライアントと動的に割り当てられた IP アドレスを使用する移動するユーザーのことです。モバイルクライアントは、X.509 証明書を使用して認証します。

以下の例では、IKEv2 の設定を示しています。IKEv1 XAUTH プロトコルは使用していません。

サーバー上では以下の設定になります。

conn roadwarriors
    keyexchange=ikev2
    # support (roaming) MOBIKE clients (RFC 4555)
    mobike=yes
    fragmentation=yes
    left=1.2.3.4
    # if access to the LAN is given, enable this, otherwise use 0.0.0.0/0
    # leftsubnet=10.10.0.0/16
    leftsubnet=0.0.0.0/0
    leftcert=gw.example.com
    leftid=%fromcert
    leftxauthserver=yes
    leftmodecfgserver=yes
    right=%any
    # trust our own Certificate Agency
    rightca=%same
    # pick an IP address pool to assign to remote users
    # 100.64.0.0/16 prevents RFC1918 clashes when remote users are behind NAT
    rightaddresspool=100.64.13.100-100.64.13.254
    # if you want remote clients to use some local DNS zones and servers
    modecfgdns="1.2.3.4, 5.6.7.8"
    modecfgdomains="internal.company.com, corp"
    rightxauthclient=yes
    rightmodecfgclient=yes
    authby=rsasig
    # optionally, run the client X.509 ID through pam to allow or deny client
    # pam-authorize=yes
    # load connection, do not initiate
    auto=add
    # kill vanished roadwarriors
Copy to Clipboard

ロードウォーリアーのデバイスであるモバイルクライアントでは、上記の設定に多少変更を加えて使用します。

conn to-vpn-server
    keyexchange=ikev2
    # pick up our dynamic IP
    left=%defaultroute
    leftsubnet=0.0.0.0/0
    leftcert=myname.example.com
    leftid=%fromcert
    leftmodecfgclient=yes
    # right can also be a DNS hostname
    right=1.2.3.4
    # if access to the remote LAN is required, enable this, otherwise use 0.0.0.0/0
    # rightsubnet=10.10.0.0/16
    rightsubnet=0.0.0.0/0
    fragmentation=yes
    # trust our own Certificate Agency
    rightca=%same
    authby=rsasig
    # allow narrowing to the server's suggested assigned IP and remote subnet
    narrowing=yes
    # support (roaming) MOBIKE clients (RFC 4555)
    mobike=yes
    # initiate connection
    auto=start
Copy to Clipboard

6.7. メッシュ VPN の設定

any-to-any VPN とも呼ばれるメッシュ VPN ネットワークは、全ノードが IPsec を使用して通信するネットワークです。この設定では、IPsec を使用できないノードの例外が許可されます。メッシュの VPN ネットワークは、以下のいずれかの方法で設定できます。

  • IPSec を必要とする。
  • IPsec を優先するが、平文通信へのフォールバックを可能にする。

ノード間の認証は、X.509 証明書または DNSSEC (DNS Security Extensions) を基にできます。

これらの接続は通常の Libreswan 設定であるため、オポチュニスティック IPsec に通常の IKEv2 認証方法を使用できます。ただし、right=%opportunisticgroup エントリーで定義されるオポチュニスティック IPsec を除きます。一般的な認証方法は、一般に共有される認証局 (CA) を使用して、X.509 証明書に基づいてホストを相互に認証させる方法です。クラウドデプロイメントでは通常、標準の手順の一部として、クラウド内の各ノードに証明書を発行します。

重要

1 つのホストが侵害されると、グループの PSK シークレットも侵害されるため、PreSharedKey (PSK) 認証は使用しないでください。

NULL 認証を使用すると、認証なしでノード間に暗号化をデプロイできます。これを使用した場合、受動的な攻撃者からのみ保護されます。

以下の手順では、X.509 証明書を使用します。この証明書は、Dogtag Certificate System などの任意の種類の CA 管理システムを使用して生成できます。Dogtag は、各ノードの証明書が PKCS #12 形式 (.p12 ファイル) で利用可能であることを前提としています。これには、秘密鍵、ノード証明書、およびその他のノードの X.509 証明書を検証するのに使用されるルート CA 証明書が含まれます。

各ノードでは、その X.509 証明書を除いて、同じ設定を使用します。これにより、ネットワーク内で既存ノードを再設定せずに、新規ノードを追加できます。PKCS #12 ファイルには "分かりやすい名前" が必要であるため、名前には "node" を使用します。これにより、すべてのノードに対して、この名前を参照する設定ファイルが同一になります。

前提条件

  • Libreswan がインストールされ、ipsec サービスが各ノードで開始している。
  • 新しい NSS データベースが初期化されている。

    1. すでに古い NSS データベースがある場合は、古いデータベースファイルを削除します。

      # systemctl stop ipsec
      # rm /var/lib/ipsec/nss/*db
      Copy to Clipboard
    2. 次のコマンドを使用して、新しいデータベースを初期化できます。

      # ipsec initnss
      Copy to Clipboard

手順

  1. 各ノードで PKCS #12 ファイルをインポートします。この手順では、PKCS #12 ファイルの生成に使用するパスワードが必要になります。

    # ipsec import nodeXXX.p12
    Copy to Clipboard
  2. IPsec required (private)、IPsec optional (private-or-clear)、および No IPsec (clear) プロファイルに、以下のような 3 つの接続定義を作成します。

    # cat /etc/ipsec.d/mesh.conf
    conn clear
    	auto=ondemand 
    1
    
    	type=passthrough
    	authby=never
    	left=%defaultroute
    	right=%group
    
    conn private
    	auto=ondemand
    	type=transport
    	authby=rsasig
    	failureshunt=drop
    	negotiationshunt=drop
    	keyexchange=ikev2
    	left=%defaultroute
    	leftcert=nodeXXXX
    	leftid=%fromcert 
    2
    
    	rightid=%fromcert
    	right=%opportunisticgroup
    
    conn private-or-clear
    	auto=ondemand
    	type=transport
    	authby=rsasig
    	failureshunt=passthrough
    	negotiationshunt=passthrough
    	# left
    	left=%defaultroute
    	leftcert=nodeXXXX 
    3
    
    	leftid=%fromcert
    	leftrsasigkey=%cert
    	# right
    	rightrsasigkey=%cert
    	rightid=%fromcert
    	right=%opportunisticgroup
    Copy to Clipboard
    1
    auto 変数にはいくつかのオプションがあります。

    ondemand 接続オプションは、IPsec 接続を開始するオポチュニスティック IPsec や、常にアクティブにする必要のない明示的に設定した接続に使用できます。このオプションは、カーネル内にトラップ XFRM ポリシーを設定し、そのポリシーに一致する最初のパケットを受信したときに IPsec 接続を開始できるようにします。

    オポチュニスティック IPsec を使用する場合も、明示的に設定した接続を使用する場合も、次のオプションを使用すると、IPsec 接続を効果的に設定および管理できます。

    add オプション
    接続設定をロードし、リモート開始に応答できるように準備します。ただし、接続はローカル側から自動的に開始されません。コマンド ipsec up を使用して、IPsec 接続を手動で開始できます。
    start オプション
    接続設定をロードし、リモート開始に応答できるように準備します。さらに、リモートピアへの接続を即座に開始します。このオプションは、永続的かつ常にアクティブな接続に使用できます。
    2
    leftid 変数と rightid 変数は、IPsec トンネル接続の右チャネルと左チャネルを指定します。これらの変数を使用して、ローカル IP アドレスの値、またはローカル証明書のサブジェクト DN を取得できます (設定している場合)。
    3
    leftcert 変数は、使用する NSS データベースのニックネームを定義します。
  3. ネットワークの IP アドレスを対応するカテゴリーに追加します。たとえば、すべてのノードが 10.15.0.0/16 ネットワーク内に存在し、すべてのノードで IPsec 暗号化を使用する必要がある場合は、次のコマンドを実行します。

    # echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
    Copy to Clipboard
  4. 特定のノード (10.15.34.0/24 など) を IPsec の有無にかかわらず機能させるには、そのノードを private-or-clear グループに追加します。

    # echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
    Copy to Clipboard
  5. ホストを、10.15.1.2 など、IPsec の機能がない clear グループに定義する場合は、次のコマンドを実行します。

    # echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear
    Copy to Clipboard

    /etc/ipsec.d/policies ディレクトリーのファイルは、各新規ノードのテンプレートから作成することも、Puppet または Ansible を使用してプロビジョニングすることもできます。

    すべてのノードでは、例外のリストが同じか、異なるトラフィックフローが期待される点に注意してください。したがって、あるノードで IPsec が必要になり、別のノードで IPsec を使用できないために、ノード間の通信ができない場合もあります。

  6. ノードを再起動して、設定したメッシュに追加します。

    # systemctl restart ipsec
    Copy to Clipboard
  7. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. ping コマンドを使用して IPsec トンネルを開きます。

    # ping <nodeYYY>
    Copy to Clipboard
  2. インポートされた証明書を含む NSS データベースを表示します。

    # certutil -L -d sql:/var/lib/ipsec/nss/
    
    Certificate Nickname    Trust Attributes
                            SSL,S/MIME,JAR/XPI
    
    west                    u,u,u
    ca                      CT,,
    Copy to Clipboard
  3. ノード上の開いているトンネルを確認します。

    # ipsec trafficstatus
    006 #2: "private#10.15.0.0/16"[1] ...<nodeYYY>, type=ESP, add_time=1691399301, inBytes=512, outBytes=512, maxBytes=2^63B, id='C=US, ST=NC, O=Example Organization, CN=east'
    Copy to Clipboard

6.8. FIPS 準拠の IPsec VPN のデプロイ

Libreswan を使用して、FIPS 準拠の IPsec VPN ソリューションをデプロイできます。これを行うには、FIPS モードの Libreswan で使用できる暗号化アルゴリズムと無効になっている暗号化アルゴリズムを特定します。

前提条件

  • AppStream リポジトリーが有効になっている。
  • システムは FIPS モードでインストールされている。

手順

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

    # dnf install libreswan
    Copy to Clipboard
  2. Libreswan を再インストールする場合は、古い NSS データベースを削除します。

    # systemctl stop ipsec
    # rm /var/lib/ipsec/nss/*db
    Copy to Clipboard
  3. ipsec サービスを開始して有効にし、システムの起動時にサービスを自動的に開始できるようにします。

    # systemctl enable ipsec --now
    Copy to Clipboard
  4. ファイアウォールで、ipsec サービスを追加して、IKE プロトコル、ESP プロトコル、および AH プロトコルの 500 および 4500 UDP ポートを許可するように設定します。

    # firewall-cmd --add-service="ipsec"
    # firewall-cmd --runtime-to-permanent
    Copy to Clipboard

検証

  1. Libreswan が FIPS モードで実行されていることを確認します。

    # ipsec whack --fipsstatus
    FIPS mode enabled
    Copy to Clipboard
  2. または、systemd ジャーナルで ipsec ユニットのエントリーを確認します。

    $ journalctl -u ipsec
    ...
    Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Mode: ON
    Copy to Clipboard
  3. FIPS モードで使用可能なアルゴリズムを表示するには、次のコマンドを実行します。

    # ipsec pluto --selftest 2>&1 | head -6
    Initializing NSS using read-only database "sql:/var/lib/ipsec/nss"
    FIPS Mode: ON
    NSS crypto library initialized
    FIPS mode enabled for pluto daemon
    NSS library is running in FIPS mode
    FIPS HMAC integrity support [not required]
    Copy to Clipboard
  4. FIPS モードで無効化されたアルゴリズムをクエリーするには、次のコマンドを実行します。

    # ipsec pluto --selftest 2>&1 | grep disabled
    Encryption algorithm CAMELLIA_CTR disabled; not FIPS compliant
    Encryption algorithm CAMELLIA_CBC disabled; not FIPS compliant
    Encryption algorithm NULL disabled; not FIPS compliant
    Encryption algorithm CHACHA20_POLY1305 disabled; not FIPS compliant
    Hash algorithm MD5 disabled; not FIPS compliant
    PRF algorithm HMAC_MD5 disabled; not FIPS compliant
    PRF algorithm AES_XCBC disabled; not FIPS compliant
    Integrity algorithm HMAC_MD5_96 disabled; not FIPS compliant
    Integrity algorithm HMAC_SHA2_256_TRUNCBUG disabled; not FIPS compliant
    Integrity algorithm AES_XCBC_96 disabled; not FIPS compliant
    DH algorithm MODP1536 disabled; not FIPS compliant
    DH algorithm DH31 disabled; not FIPS compliant
    Copy to Clipboard
  5. FIPS モードで許可されているすべてのアルゴリズムと暗号のリストを表示するには、次のコマンドを実行します。

    # ipsec pluto --selftest 2>&1 | grep ESP | grep FIPS | sed "s/^.*FIPS//"
    aes_ccm, aes_ccm_c
    aes_ccm_b
    aes_ccm_a
    NSS(CBC)  3des
    NSS(GCM)  aes_gcm, aes_gcm_c
    NSS(GCM)  aes_gcm_b
    NSS(GCM)  aes_gcm_a
    NSS(CTR)  aesctr
    NSS(CBC)  aes
    aes_gmac
    NSS       sha, sha1, sha1_96, hmac_sha1
    NSS       sha512, sha2_512, sha2_512_256, hmac_sha2_512
    NSS       sha384, sha2_384, sha2_384_192, hmac_sha2_384
    NSS       sha2, sha256, sha2_256, sha2_256_128, hmac_sha2_256
    aes_cmac
    null
    NSS(MODP) null, dh0
    NSS(MODP) dh14
    NSS(MODP) dh15
    NSS(MODP) dh16
    NSS(MODP) dh17
    NSS(MODP) dh18
    NSS(ECP)  ecp_256, ecp256
    NSS(ECP)  ecp_384, ecp384
    NSS(ECP)  ecp_521, ecp521
    Copy to Clipboard

6.9. パスワードによる IPsec NSS データベースの保護

デフォルトでは、IPsec サービスは、初回起動時に空のパスワードを使用して Network Security Services (NSS) データベースを作成します。セキュリティーを強化するために、パスワード保護を追加できます。

前提条件

  • /var/lib/ipsec/nss/ ディレクトリーには NSS データベースファイルが含まれます。

手順

  1. Libreswan の NSS データベースのパスワード保護を有効にします。

    # certutil -N -d sql:/var/lib/ipsec/nss
    Enter Password or Pin for "NSS Certificate DB":
    Enter a password which will be used to encrypt your keys.
    The password should be at least 8 characters long,
    and should contain at least one non-alphabetic character.
    
    Enter new password:
    Copy to Clipboard
  2. 前の手順で設定したパスワードを含む /etc/ipsec.d/nsspassword ファイルを作成します。以下はその例です。

    # cat /etc/ipsec.d/nsspassword
    NSS Certificate DB:<password>
    Copy to Clipboard

    nsspassword ファイルは次の構文を使用します。

    <token_1>:<password1>
    <token_2>:<password2>
    Copy to Clipboard

    デフォルトの NSS ソフトウェアトークンは NSS Certificate DB です。システムが FIPS モードで実行し場合は、トークンの名前が NSS FIPS 140-2 Certificate DB になります。

  3. 選択したシナリオに応じて、nsspassword ファイルの完了後に ipsec サービスを起動または再起動します。

    # systemctl restart ipsec
    Copy to Clipboard

検証

  1. NSS データベースに空でないパスワードを追加した後に、ipsec サービスが実行中であることを確認します。

    # systemctl status ipsec
    ● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
       Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disable>
       Active: active (running)…
    Copy to Clipboard

検証

  • Journal ログに初期化が成功したことを確認するエントリーが含まれていることを確認します。

    # journalctl -u ipsec
    …
    pluto[6214]: Initializing NSS using read-only database "sql:/var/lib/ipsec/nss"
    pluto[6214]: NSS Password from file "/etc/ipsec.d/nsspassword" for token "NSS Certificate DB" with length 20 passed to NSS
    pluto[6214]: NSS crypto library initialized
    …
    Copy to Clipboard

6.10. TCP を使用するように IPsec VPN を設定

Libreswan は、RFC 8229 で説明されているように、IKE パケットおよび IPsec パケットの TCP カプセル化に対応します。この機能により、UDP 経由でトラフィックが転送されないように、IPsec VPN をネットワークに確立し、セキュリティーのペイロード (ESP) を強化できます。フォールバックまたはメインの VPN トランスポートプロトコルとして TCP を使用するように VPN サーバーおよびクライアントを設定できます。TCP カプセル化にはパフォーマンスコストが大きくなるため、UDP がシナリオで永続的にブロックされている場合に限り、TCP を主な VPN プロトコルとして使用してください。

前提条件

手順

  1. config setup セクションの /etc/ipsec.conf ファイルに以下のオプションを追加します。

    listen-tcp=yes
    Copy to Clipboard
  2. UDP で最初の試行に失敗した場合に TCP カプセル化をフォールバックオプションとして使用するには、クライアントの接続定義に以下の 2 つのオプションを追加します。

    enable-tcp=fallback
    tcp-remoteport=4500
    Copy to Clipboard

    または、UDP を永続的にブロックしている場合は、クライアントの接続設定で以下のオプションを使用します。

    enable-tcp=yes
    tcp-remoteport=4500
    Copy to Clipboard

6.11. RHEL システムロールを使用した VPN 接続の設定

VPN は、信頼できないネットワーク経由でトラフィックをセキュアに送信するための暗号化接続です。vpn RHEL システムロールを使用すると、VPN 設定の作成プロセスを自動化できます。

注記

vpn RHEL システムロールは、VPN プロバイダーとして、IPsec 実装である Libreswan のみをサポートしています。

6.11.1. vpn RHEL システムロールを使用して PSK 認証によるホスト間 IPsec VPN を作成する

IPsec を使用すると、VPN を介してホストを相互に直接接続できます。ホストは事前共有鍵 (PSK) を使用して相互に認証できます。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

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

    hosts: <list>

    VPN を設定するホストを含む YAML ディクショナリーを定義します。エントリーが Ansible 管理対象ノードでない場合は、hostname パラメーターに完全修飾ドメイン名 (FQDN) または IP アドレスを指定する必要があります。次に例を示します。

              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1
    Copy to Clipboard

    このロールは、各管理対象ノード上の VPN 接続を設定します。接続の名前は <host_A>-to-<host_B> です (例: managed-node-01.example.com-to-managed-node-02.example.com)。このロールは外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなホストでは手動で設定を作成する必要があります。

    auth_method: psk
    ホスト間の PSK 認証を有効にします。ロールはコントロールノードで openssl を使用して PSK を作成します。
    auto: <start-up_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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  • 接続が正常に開始されたことを確認します。次に例を示します。

    # 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

    このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の auto 変数を start 以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。

6.11.2. vpn RHEL システムロールを使用して、個別のデータプレーンとコントロールプレーンおよび PSK 認証によるホスト間 IPsec VPN を作成する

IPsec を使用すると、VPN を介してホストを相互に直接接続できます。たとえば、制御メッセージの傍受や妨害のリスクを最小限に抑えてセキュリティーを強化するために、データトラフィックと制御トラフィックの両方に個別の接続を設定できます。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

    サンプル 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: <start-up_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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  • 接続が正常に開始されたことを確認します。次に例を示します。

    # 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

    このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の auto 変数を start 以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。

6.11.3. vpn RHEL システムロールを使用して、証明書ベースの認証による複数ホスト間の IPsec メッシュ VPN を作成する

Libreswan はオポチュニスティックメッシュの作成をサポートしています。これは、各ホストで 1 つの設定を使用して、多数のホスト間で IPsec 接続を確立するためのものです。メッシュにホストを追加する場合、既存のホストの設定を更新する必要はありません。セキュリティーを強化するには、Libreswan で証明書ベースの認証を使用します。

vpn RHEL システムロールを使用すると、証明書ベースの認証による管理対象ノード間の VPN メッシュの設定を自動化できます。

前提条件

  • コントロールノードと管理対象ノードの準備が完了している。
  • 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
  • 管理対象ノードへの接続に使用するアカウントに、そのノードに対する sudo 権限がある。
  • 各管理対象ノード用に PKCS #12 ファイルを用意した。

    • 各ファイルには次のものを含めます。

      • 認証局 (CA) 証明書
      • ノードの秘密鍵
      • ノードのクライアント証明書
    • ファイル名は <managed_node_name_as_in_the_inventory>.p12 とします。
    • ファイルは Playbook と同じディレクトリーに保存します。

手順

  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

    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
    2. ansible-vault create コマンドでエディターが開いたら、機密データを <key>: <value> 形式で入力します。

      pkcs12_pwd: <password>
      Copy to Clipboard
    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: Remove IPsec NSS database files
          ansible.builtin.file:
            path: "{{ item.path }}"
            state: absent
          loop: "{{ db_files.files }}"
          when: db_files.matched > 0
    
        - name: Initialize IPsec NSS database
          ansible.builtin.command:
            cmd: ipsec initnss
    
        - 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

    サンプル 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

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

  5. Playbook を実行します。

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

検証

  1. メッシュ内のノードで、別のノードに ping を送信して接続をアクティブ化します。

    [root@managed-node-01]# ping managed-node-02.example.com
    Copy to Clipboard
  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

6.12. システム全体の暗号化ポリシーをオプトアウトする IPsec 接続の設定

接続向けのシステム全体の暗号化ポリシーのオーバーライド

RHEL のシステム全体の暗号化ポリシーでは、%default と呼ばれる特別な接続が作成されます。この接続には、ikev2 オプション、esp オプション、および ike オプションのデフォルト値が含まれます。ただし、接続設定ファイルに上記のオプションを指定すると、デフォルト値を上書きできます。

たとえば、次の設定では、AES および SHA-1 または SHA-2 で IKEv1 を使用し、AES-GCM または AES-CBC で IPsec (ESP) を使用する接続が可能です。

conn MyExample
  ...
  keyexchange=ikev1
  ike=aes-sha2,aes-sha1;modp2048
  esp=aes_gcm,aes-sha2,aes-sha1
  ...
Copy to Clipboard

AES-GCM は IPsec (ESP) および IKEv2 で利用できますが、IKEv1 では利用できません。

全接続向けのシステム全体の暗号化ポリシーの無効化

すべての IPsec 接続のシステム全体の暗号化ポリシーを無効にするには、/etc/ipsec.conf ファイルで次の行をコメントアウトします。

include /etc/crypto-policies/back-ends/libreswan.config
Copy to Clipboard

次に、接続設定ファイルに keyexchange=ikev1 オプションを追加します。

6.13. IPsec VPN 設定のトラブルシューティング

IPsec VPN 設定に関連する問題は主に、一般的な理由が原因で発生する可能性が高くなっています。このような問題が発生した場合は、問題の原因が以下のシナリオのいずれかに該当するかを確認して、対応するソリューションを適用します。

基本的な接続のトラブルシューティング

VPN 接続関連の問題の多くは、管理者が不適当な設定オプションを指定してエンドポイントを設定した新しいデプロイメントで発生します。また、互換性のない値が新たに実装された場合に、機能していた設定が突然動作が停止する可能性があります。管理者が設定を変更した場合など、このような結果になることがあります。また、管理者が暗号化アルゴリズムなど、特定のオプションに異なるデフォルト値を使用して、ファームウェアまたはパッケージの更新をインストールした場合などです。

IPsec VPN 接続が確立されていることを確認するには、次のコマンドを実行します。

# 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=100.64.13.5/32
Copy to Clipboard

出力が空の場合や、エントリーで接続名が表示されない場合など、トンネルが破損します。

接続に問題があることを確認するには、以下を実行します。

  1. vpn.example.com 接続をもう一度読み込みます。

    # ipsec add vpn.example.com
    002 added connection description "vpn.example.com"
    Copy to Clipboard
  2. 次に、VPN 接続を開始します。

    # ipsec up vpn.example.com
    Copy to Clipboard

ファイアウォール関連の問題

最も一般的な問題は、IPSec エンドポイントの 1 つ、またはエンドポイント間にあるルーターにあるファイアウォールで Internet Key Exchange (IKE) パケットがドロップされるという点が挙げられます。

  • IKEv2 の場合には、以下の例のような出力は、ファイアウォールに問題があることを示しています。

    # ipsec up vpn.example.com
    181 "vpn.example.com"[1] 192.0.2.2 #15: initiating IKEv2 IKE SA
    181 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: sent v2I1, expected v2R1
    010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 0.5 seconds for response
    010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 1 seconds for response
    010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 2 seconds for
    ...
    Copy to Clipboard
  • IKEv1 の場合は、最初のコマンドの出力は以下のようになります。

    # ipsec up vpn.example.com
    002 "vpn.example.com" #9: initiating Main Mode
    102 "vpn.example.com" #9: STATE_MAIN_I1: sent MI1, expecting MR1
    010 "vpn.example.com" #9: STATE_MAIN_I1: retransmission; will wait 0.5 seconds for response
    010 "vpn.example.com" #9: STATE_MAIN_I1: retransmission; will wait 1 seconds for response
    010 "vpn.example.com" #9: STATE_MAIN_I1: retransmission; will wait 2 seconds for response
    ...
    Copy to Clipboard

IPsec の設定に使用される IKE プロトコルは暗号化されているため、tcpdump ツールを使用して、トラブルシューティングできるサブセットは一部のみです。ファイアウォールが IKE パケットまたは IPsec パケットをドロップしている場合は、tcpdump ユーティリティーを使用して原因を見つけることができます。ただし、tcpdump は IPsec VPN 接続に関する他の問題を診断できません。

  • eth0 インターフェイスで VPN および暗号化データすべてのネゴシエーションを取得するには、次のコマンドを実行します。

    # tcpdump -i eth0 -n -n esp or udp port 500 or udp port 4500 or tcp port 4500
    Copy to Clipboard

アルゴリズム、プロトコル、およびポリシーが一致しない場合

VPN 接続では、エンドポイントが IKE アルゴリズム、IPsec アルゴリズム、および IP アドレス範囲に一致する必要があります。不一致が発生した場合には接続は失敗します。以下の方法のいずれかを使用して不一致を特定した場合は、アルゴリズム、プロトコル、またはポリシーを調整して修正します。

  • リモートエンドポイントが 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
  • IKE アルゴリズムが一致しない例:

    # 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
  • IPsec アルゴリズムが一致しない例:

    # 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

    また、IKE バージョンが一致しないと、リモートエンドポイントが応答なしの状態でリクエストをドロップする可能性がありました。これは、すべての IKE パケットをドロップするファイアウォールと同じです。

  • IKEv2 (Traffic Selectors - TS) の IP アドレス範囲が一致しない例:

    # 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
  • IKEv1 の IP アドレス範囲で一致しない例:

    # 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
  • IKEv1 で PreSharedKeys (PSK) を使用する場合には、どちらでも同じ PSK に配置されなければ、IKE メッセージ全体の読み込みができなくなります。

    # 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
  • IKEv2 では、mismatched-PSK エラーが原因で AUTHENTICATION_FAILED メッセージが表示されます。

    # ipsec up vpn.example.com
    ...
    002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
    Copy to Clipboard

最大伝送単位 (MTU)

ファイアウォールが IKE または IPSec パケットをブロックする以外で、ネットワークの問題の原因として、暗号化パケットのパケットサイズの増加が最も一般的です。ネットワークハードウェアは、最大伝送単位 (MTU) を超えるパケットを 1500 バイトなどのサイズに断片化します。多くの場合、断片化されたパケットは失われ、パケットの再アセンブルに失敗します。これにより、小さいサイズのパケットを使用する ping テスト時には機能し、他のトラフィックでは失敗するなど、断続的な問題が発生します。このような場合に、SSH セッションを確立できますが、リモートホストに 'ls -al /usr' コマンドに入力した場合など、すぐにターミナルがフリーズします。

この問題を回避するには、トンネル設定ファイルに mtu=1400 のオプションを追加して、MTU サイズを縮小します。

または、TCP 接続の場合は、MSS 値を変更する iptables ルールを有効にします。

# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Copy to Clipboard

各シナリオで上記のコマンドを使用して問題が解決されない場合は、set-mss パラメーターで直接サイズを指定します。

# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380
Copy to Clipboard

ネットワークアドレス変換 (NAT)

IPsec ホストが NAT ルーターとしても機能すると、誤ってパケットが再マッピングされる可能性があります。以下の設定例はこの問題を示しています。

conn myvpn
    left=172.16.0.1
    leftsubnet=10.0.2.0/24
    right=172.16.0.2
    rightsubnet=192.168.0.0/16
…
Copy to Clipboard

アドレスが 172.16.0.1 のシステムには NAT ルールが 1 つあります。

iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
Copy to Clipboard

アドレスが 10.0.2.33 のシステムがパケットを 192.168.0.1 に送信する場合に、ルーターは IPsec 暗号化を適用する前にソースを 10.0.2.33 から 172.16.0.1 に変換します。

次に、ソースアドレスが 10.0.2.33 のパケットは conn myvpn 設定と一致しなくなるので、IPsec ではこのパケットが暗号化されません。

この問題を解決するには、ルーターのターゲット IPsec サブネット範囲の NAT を除外するルールを挿入します。以下に例を示します。

iptables -t nat -I POSTROUTING -s 10.0.2.0/24 -d 192.168.0.0/16 -j RETURN
Copy to Clipboard

カーネル IPsec サブシステムのバグ

たとえば、バグが原因で IKE ユーザー空間と IPsec カーネルの同期が解除される場合など、カーネル IPsec サブシステムに問題が発生する可能性があります。このような問題がないかを確認するには、以下を実行します。

$ cat /proc/net/xfrm_stat
XfrmInError                 0
XfrmInBufferError           0
...
Copy to Clipboard

上記のコマンドの出力でゼロ以外の値が表示されると、問題があることを示しています。この問題が発生した場合は、新しい サポートケース を作成し、1 つ前のコマンドの出力と対応する IKE ログを添付してください。

Libreswan のログ

デフォルトでは、Libreswan は syslog プロトコルを使用してログに記録します。journalctl コマンドを使用して、IPsec に関連するログエントリーを検索できます。ログへの対応するエントリーは pluto IKE デーモンにより送信されるため、以下のように、キーワード "pluto" を検索します。

$ journalctl -b | grep pluto
Copy to Clipboard

ipsec サービスのライブログを表示するには、次のコマンドを実行します。

$ journalctl -f -u ipsec
Copy to Clipboard

ロギングのデフォルトレベルで設定問題が解決しない場合は、/etc/ipsec.conf ファイルの config setup セクションに plutodebug=all オプションを追加してデバッグログを有効にします。

デバッグロギングは多くのエントリーを生成し、journald サービスまたは syslogd サービスレートのいずれかが syslog メッセージを制限する可能性があることに注意してください。完全なログを取得するには、ロギングをファイルにリダイレクトします。/etc/ipsec.conf を編集し、config setup セクションに logfile=/var/log/pluto.log を追加します。

6.14. control-center による VPN 接続の確立

グラフィカルインターフェイスで Red Hat Enterprise Linux を使用する場合は、この VPN 接続を GNOME control-center で設定できます。

前提条件

  • NetworkManager-libreswan-gnome パッケージがインストールされている。

手順

  1. Super キーを押して Settings と入力し、Enter を押して control-center アプリケーションを開きます。
  2. 左側の Network エントリーを選択します。
  3. + アイコンをクリックします。
  4. VPN を選択します。
  5. Identity メニューエントリーを選択して、基本的な設定オプションを表示します。

    全般

    Gateway - リモート VPN ゲートウェイの名前または IP アドレスです。

    認証

    Type

    • IKEv2 (証明書)- クライアントは、証明書により認証されます。これはより安全です (デフォルト)。
    • IKEv1(XAUTH): クライアントは、ユーザー名とパスワード、または事前共有キー (PSK) で認証されます。

      Advanced セクションでは、以下の設定が可能です。

      警告

      gnome-control-center アプリケーションを使用して IPsec ベースの VPN 接続を設定すると、Advanced ダイアログには設定が表示されますが、変更することはできません。したがって、詳細な IPsec オプションを変更できません。nm-connection-editor ツールまたは nmcli ツールを使用して、詳細なプロパティーの設定を実行します。

      識別

    • Domain - 必要な場合は、ドメイン名を入力します。

      セキュリティー

    • Phase1 Algorithms - Libreswan パラメーター ike に対応します。暗号化チャネルの認証およびセットアップに使用するアルゴリズムを入力します。
    • Phase2 Algorithms - Libreswan パラメーター esp に対応します。IPsec ネゴシエーションに使用するアルゴリズムを入力します。

      Disable PFS フィールドで PFS (Perfect Forward Secrecy) を無効にし、PFS に対応していない古いサーバーとの互換性があることを確認します。

    • Phase1 Lifetime - Libreswan パラメーター ikelifetime に対応します。このパラメーターは、トラフィックの暗号化に使用される鍵がどのぐらい有効であるかどうかを示します。
    • Phase2 Lifetime - Libreswan パラメーター salifetime に対応します。このパラメーターは、接続の特定インスタンスが期限切れになるまでの持続時間を指定します。

      セキュリティー上の理由から、暗号化キーは定期的に変更する必要があります。

    • Remote network - Libreswan パラメーター rightsubnet に対応します。このパラメーターは、VPN から到達できる宛先のプライベートリモートネットワークです。

      絞り込むことのできる narrowing フィールドを確認します。これは IKEv2 ネゴシエーションの場合にのみ有効であることに注意してください。

    • Enable fragmentation - Libreswan パラメーターの fragmentation に対応します。IKE 断片化を許可するかどうかを指定します。有効な値は、yes (デフォルト) または no です。
    • Enable Mobike - Libreswan パラメーター mobike に対応します。最初から接続を再起動しなくても、接続がエンドポイントを移行することを Mobility and Multihoming Protocol (MOBIKE, RFC 4555) が許可するかどうかを設定します。これは、有線、無線、またはモバイルデータの接続の切り替えを行うモバイルデバイスで使用されます。値は、no (デフォルト) または yes です。
  6. IPv4 メニューエントリーを選択します。

    IPv4 Method

    • Automatic (DHCP) - 接続しているネットワークが動的 IP アドレスの割り当てに DHCP サーバーを使用する場合は、このオプションを選択します。
    • Link-Local Only - 接続しているネットワークに DHCP サーバーがなく、IP アドレスを手動で割り当てない場合は、このオプションを選択します。接頭辞 169.254/16 付きのランダムなアドレスが、RFC 3927 に従って割り当てられます。
    • Manual - IP アドレスを手動で割り当てたい場合は、このオプションを選択します。
    • Disable - この接続では IPv4 は無効化されています。

      DNS

      DNS セクションでは、AutomaticON になっているときに、これを OFF に切り替えて、使用する DNS サーバーの IP アドレスを入力します。IP アドレスはコンマで区切ります。

      Routes

      Routes セクションでは、AutomaticON になっている場合は、DHCP からのルートが使用されますが、他の静的ルートを追加することもできることに注意してください。OFF の場合は、静的ルートだけが使用されます。

    • Address - リモートネットワークまたはホストの IP アドレスを入力します。
    • Netmask - 上記で入力した IP アドレスのネットマスクまた接頭辞長。
    • Gateway - 上記で入力したリモートネットワーク、またはホストにつながるゲートウェイの IP アドレス。
    • Metric - このルートに与える優先値であるネットワークコスト。数値が低い方が優先されます。

      Use this connection only for resources on its network (この接続はネットワーク上のリソースのためだけに使用)

      このチェックボックスを選択すると、この接続はデフォルトルートになりません。このオプションを選択すると、この接続で自動的に学習したルートを使用することが明確なトラフィックか、手動で入力したトラフィックのみがこの接続を経由します。

  7. VPN 接続の IPv6 設定を設定するには、IPv6 メニューエントリーを選択します。

    IPv6 Method

    • Automatic - IPv6 ステートレスアドレス自動設定 (SLAAC) を使用して、ハードウェアのアドレスとルーター通知 (RA) に基づくステートレスの自動設定を作成するには、このオプションを選択します。
    • Automatic, DHCP only - RA を使用しないで、DHCPv6 からの情報を直接要求してステートフルな設定を作成する場合は、このオプションを選択します。
    • Link-Local Only - 接続しているネットワークに DHCP サーバーがなく、IP アドレスを手動で割り当てない場合は、このオプションを選択します。接頭辞 FE80::0 付きのランダムなアドレスが、RFC 4862 に従って割り当てられます。
    • Manual - IP アドレスを手動で割り当てたい場合は、このオプションを選択します。
    • Disable - この接続では IPv6 は無効化されています。

      DNSRoutesUse this connection only for resources on its network が、一般的な IPv4 設定となることに注意してください。

  8. VPN 接続の編集が終了したら、追加 ボタンをクリックして設定をカスタマイズするか、適用 ボタンをクリックして、既存の接続に保存します。
  9. プロファイルを ON に切り替え、VPN 接続をアクティブにします。
  10. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

6.15. nmstatectl を使用して IPsec ベースの VPN 接続を設定する

IPsec (Internet Protocol Security) は、VPN の実装用に Libreswan によって提供されるセキュリティープロトコルスイートです。IPsec には、接続の確立時に認証を開始し、データ転送中にキーを管理するプロトコルが組み込まれています。アプリケーションがネットワークにデプロイされていて、IP プロトコルを使用して通信する場合、IPsec はデータ通信を保護できます。

VPN 接続を認証するための IPsec ベースの設定を管理するには、nmstatectl ユーティリティーを使用できます。このユーティリティーは、ホストネットワーク管理用の宣言型 API へのコマンドラインアクセスを提供します。host-to-subnet および host-to-host 通信モードの認証タイプを以下に示します。

  • ホスト/サブネット間 PKI 認証
  • ホスト/サブネット間 RSA 認証
  • ホスト/サブネット間 PSK 認証
  • ホスト間トンネルモード認証
  • ホスト間トランスポートモード認証

6.15.1. nmstatectl を使用して PKI 認証とトンネルモードによるホスト/サブネット間 IPSec VPN を設定する

信頼できるエンティティー認証に基づく暗号化を IPsec で使用する必要がある場合、公開鍵基盤 (PKI) により、2 つのホスト間で暗号化キーを使用することで、セキュアな通信が実現します。通信する両方のホストが秘密鍵と公開鍵を生成します。各ホストは信頼できるエンティティーの認証局 (CA) と公開鍵を共有することで秘密鍵を維持します。CA は信頼性を検証した後、デジタル証明書を生成します。暗号化と復号を行う場合、ホストは暗号化に秘密鍵を使用し、復号化に公開鍵を使用します。

ネットワーク管理用の宣言型 API である Nmstate を使用すると、PKI 認証ベースの IPsec 接続を設定できます。設定すると、Nmstate API によって結果と設定ファイルが一致することが確認されます。何らかの障害が発生した場合、nmstate は自動的に変更をロールバックし、システムが正しくない状態になるのを回避します。

host-to-subnet 設定で暗号化された通信を確立するために、リモート IPsec エンドがパラメーター dhcp: true を使用してホストに別の IP を提供します。nmstate で IPsec のシステムを定義する場合、left という名前を持つシステムがローカルホストであり、right という名前を持つシステムがリモートホストです。

NetworkManager-libreswan プラグインの設計により、一方では nmstatectl を使用できますが、もう一方では IPsec を手動で設定する必要があることに注意してください。

前提条件

  • パスワードを使用して、証明書と暗号化キーを保存する PKCS #12 ファイルを生成した。

手順

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

    # dnf install nmstate libreswan NetworkManager-libreswan
    Copy to Clipboard
  2. NetworkManager サービスを再起動します。

    # systemctl restart NetworkManager
    Copy to Clipboard
  3. Libreswan がすでにインストールされている場合は、古いデータベースファイルを削除して再作成します。

    # systemctl stop ipsec
    # rm /var/lib/ipsec/nss/*db
    # ipsec initnss
    Copy to Clipboard
  4. ipsec サービスを有効にして起動します。

    # systemctl enable --now ipsec
    Copy to Clipboard
  5. PKCS#12 ファイルをインポートします。

    # ipsec import node-example.p12
    Copy to Clipboard

    PKCS#12 ファイルをインポートするときは、ファイルの作成に使用したパスワードを入力します。

  6. 次の内容を含む YAML ファイル (例: ~/create-pki-authentication.yml) を作成します。

    ---
    interfaces:
    - name: 'example_ipsec_conn1'            
    1
    
      type: ipsec
      ipv4:
        enabled: true
        dhcp: true
      libreswan:
        ipsec-interface: 'yes'               
    2
    
        left: '192.0.2.150'                  
    3
    
        leftid: '%fromcert'                  
    4
    
        leftcert: 'local-host.example.com'   
    5
    
        right: '192.0.2.250'                 
    6
    
        rightid: '%fromcert'                 
    7
    
        ikev2: 'insist'                      
    8
    
        ikelifetime: '24h'                   
    9
    
        salifetime: '24h'                    
    10
    Copy to Clipboard

    YAML ファイルで次の設定を定義します。

    1
    IPsec 接続名
    2
    値が yes の場合、libreswan が IPsec xfrm 仮想インターフェイス ipsec<number> を作成し、利用可能な次の番号を自動的に検出します。
    3
    ローカルホストのパブリックネットワークインターフェイスの静的 IPv4 アドレス
    4
    %fromcert 値は、ローカルホストで、ロードされた証明書から取得された識別名 (DN) に ID を設定します。
    5
    ローカルホストの公開鍵の識別名 (DN)
    6
    リモートホストのパブリックネットワークインターフェイスの静的 IPv4 アドレス
    7
    %fromcert 値は、リモートホストで、ロードされた証明書から取得された識別名 (DN) に ID を設定します。
    8
    insist 値は、Internet Key Exchange (IKEv2) プロトコルのみを受け入れて受信します。
    9
    IKE プロトコルの存続時間
    10
    IPsec セキュリティーアソシエーション (SA) の存続期間
  7. 設定をシステムに適用します。

    # nmstatectl apply ~/create-pki-authentication.yml
    Copy to Clipboard
  8. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. IPsec のステータスを確認します。

    # ip xfrm state
    Copy to Clipboard
  2. IPsec のポリシーを確認します。

    # ip xfrm policy
    Copy to Clipboard

6.15.2. nmstatectl を使用して RSA 認証とトンネルモードによるホスト/サブネット間 IPSec VPN を設定する

IPsec で非対称暗号化ベースのキー認証を使用する必要がある場合、RSA アルゴリズムにより、2 つのホスト間の暗号化および復号に秘密鍵と公開鍵のいずれかを使用することで、セキュアな通信が実現します。この方法では、暗号化に秘密鍵を使用し、復号に公開鍵を使用します。

ネットワーク管理用の宣言型 API である Nmstate を使用すると、RSA ベースの IPsec 認証を設定できます。設定すると、Nmstate API によって結果と設定ファイルが一致することが確認されます。何らかの障害が発生した場合、nmstate は自動的に変更をロールバックし、システムが正しくない状態になるのを回避します。

host-to-subnet 設定で暗号化された通信を確立するために、リモート IPsec エンドがパラメーター dhcp: true を使用してホストに別の IP を提供します。nmstate で IPsec のシステムを定義する場合、left という名前を持つシステムがローカルホストであり、right という名前を持つシステムがリモートホストです。

NetworkManager-libreswan プラグインの設計により、一方では nmstatectl を使用できますが、もう一方では IPsec を手動で設定する必要があることに注意してください。

手順

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

    # dnf install nmstate libreswan NetworkManager-libreswan
    Copy to Clipboard
  2. NetworkManager サービスを再起動します。

    # systemctl restart NetworkManager
    Copy to Clipboard
  3. Libreswan がすでにインストールされている場合は、古いデータベースファイルを削除して再作成します。

    # systemctl stop ipsec
    # rm /var/lib/ipsec/nss/*db
    # ipsec initnss
    Copy to Clipboard
  4. 各ホストで RSA 鍵ペアを生成します。

    # ipsec newhostkey
    Copy to Clipboard
  5. 前のステップで、生成された鍵 ckaid が返されます。その ckaid を、left 側で次のコマンドで使用します。次に例を示します。

    # ipsec showhostkey --left --ckaid <0sAwEAAesFfVZqFzRA9F>
    Copy to Clipboard
  6. 上のコマンドの出力により、設定に必要な leftrsasigkey= 行が生成されます。2 番目のホスト (right 側) でも同じ操作を実行します。

    # ipsec showhostkey --right --ckaid <0sAwEAAesFfVZqFzRA9E>
    Copy to Clipboard
  7. 起動時に ipsec サービスを自動的に起動するように有効にします。

    # systemctl enable --now ipsec
    Copy to Clipboard
  8. 次の内容を含む YAML ファイル (例: ~/create-rsa-authentication.yml) を作成します。

    ---
    interfaces:
    - name: 'example_ipsec_conn1'               
    1
    
      type: ipsec                               
    2
    
      ipv4:
        enabled: true
        dhcp: true
      libreswan:
        ipsec-interface: '99'                   
    3
    
        leftrsasigkey: '0sAwEAAesFfVZqFzRA9F'   
    4
    
        left: '192.0.2.150'                     
    5
    
        leftid: 'local-host-rsa.example.com'    
    6
    
        right: '192.0.2.250'                    
    7
    
        rightrsasigkey: '0sAwEAAesFfVZqFzRA9E'  
    8
    
        rightid: 'remote-host-rsa.example.com'  
    9
    
        ikev2: 'insist'                         
    10
    Copy to Clipboard

    YAML ファイルで次の設定を定義します。

    1
    IPsec 接続名
    2
    インターフェイス名
    3
    値が 99 の場合、libreswan が IPsec xfrm 仮想インターフェイス ipsec<number> を作成し、利用可能な次の番号を自動的に検出します。
    4
    ローカルホストの RSA 公開鍵
    5
    ローカルホストのパブリックネットワークインターフェイスの静的 IPv4 アドレス
    6
    ローカルホストの識別名 (DN)
    7
    リモートホストの RSA 公開鍵
    8
    リモートホストのパブリックネットワークインターフェイスの静的 IPv4 アドレス
    9
    リモートホストの識別名 (DN)
    10
    insist 値は、Internet Key Exchange (IKEv2) プロトコルのみを受け入れて受信します。
  9. 設定をシステムに適用します。

    # nmstatectl apply ~/create-rsa-authentication.yml
    Copy to Clipboard
  10. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

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

    # ip addr show <device_name>
    Copy to Clipboard
  2. IPsec のステータスを確認します。

    # ip xfrm state
    Copy to Clipboard
  3. IPsec のポリシーを確認します。

    # ip xfrm policy
    Copy to Clipboard

6.15.3. nmstatectl を使用して PSK 認証とトンネルモードによるホスト/サブネット間 IPSec VPN を設定する

IPsec で相互認証に基づく暗号化を使用する必要がある場合、事前共有鍵 (PSK) 方式により、2 つのホスト間で秘密鍵を使用することで、セキュアな通信が実現します。ファイルに秘密鍵が保存され、その秘密鍵でトンネルを通過するデータが暗号化されます。

ネットワーク管理用の宣言型 API である Nmstate を使用すると、PSK ベースの IPsec 認証を設定できます。設定すると、Nmstate API によって結果と設定ファイルが一致することが確認されます。何らかの障害が発生した場合、nmstate は自動的に変更をロールバックし、システムが正しくない状態になるのを回避します。

host-to-subnet 設定で暗号化された通信を確立するために、リモート IPsec エンドがパラメーター dhcp: true を使用してホストに別の IP を提供します。nmstate で IPsec のシステムを定義する場合、left という名前を持つシステムがローカルホストであり、right という名前を持つシステムがリモートホストです。

NetworkManager-libreswan プラグインの設計により、一方では nmstatectl を使用できますが、もう一方では IPsec を手動で設定する必要があることに注意してください。

注記

この方式は、認証と暗号化に静的文字列を使用するため、テスト/開発目的でのみ使用してください。

手順

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

    # dnf install nmstate libreswan NetworkManager-libreswan
    Copy to Clipboard
  2. NetworkManager サービスを再起動します。

    # systemctl restart NetworkManager
    Copy to Clipboard
  3. Libreswan がすでにインストールされている場合は、古いデータベースファイルを削除して再作成します。

    # systemctl stop ipsec
    # rm /var/lib/ipsec/nss/*db
    # ipsec initnss
    Copy to Clipboard
  4. 起動時に ipsec サービスを自動的に起動するように有効にします。

    # systemctl enable --now ipsec
    Copy to Clipboard
  5. 次の内容を含む YAML ファイル (例: ~/create-pks-authentication.yml) を作成します。

    ---
    interfaces:
    - name: 'example_ipsec_conn1'           
    1
    
      type: ipsec
      ipv4:
        enabled: true
        dhcp: true
      libreswan:
        ipsec-interface: 'no'               
    2
    
        right: '192.0.2.150'                
    3
    
        rightid: 'remote-host.example.org'  
    4
    
        left: '192.0.2.250'                 
    5
    
        leftid: 'local-host.example.org'    
    6
    
        psk: "example_password"
        ikev2: 'insist'                     
    7
    Copy to Clipboard

    YAML ファイルで次の設定を定義します。

    1
    IPsec 接続名
    2
    値を no に設定すると、libreswanxfrm ポリシーのみを作成し、仮想 xfrm インターフェイスを作成しません。
    3
    リモートホストのパブリックネットワークインターフェイスの静的 IPv4 アドレス
    4
    リモートホストの識別名 (DN)
    5
    ローカルホストのパブリックネットワークインターフェイスの静的 IPv4 アドレス
    6
    ローカルホストの識別名 (DN)
    7
    insist 値は、Internet Key Exchange (IKEv2) プロトコルのみを受け入れて受信します。
  6. 設定をシステムに適用します。

    # nmstatectl apply ~/create-pks-authentication.yml
    Copy to Clipboard
  7. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

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

    # ip addr show <device_name>
    Copy to Clipboard
  2. IPsec のステータスを確認します。

    # ip xfrm state
    Copy to Clipboard
  3. IPsec のポリシーを確認します。

    # ip xfrm policy
    Copy to Clipboard

6.15.4. nmstatectl を使用して PKI 認証とトンネルモードによるホスト間 IPSec VPN を設定する

IPsec (Internet Protocol Security) は、ネットワークおよびデバイス内の IP 通信を認証および暗号化するためのセキュリティープロトコルスイートです。Libreswan ソフトウェアが VPN 用の IPsec 実装を提供します。

トンネルモードでは、通信の送信元および宛先 IP アドレスが IPsec トンネル内で暗号化されます。外部のネットワークスニファーが取得できるのは、left の IP と right の IP だけです。一般に、トンネルモードでは、host-to-hosthost-to-host、および subnet-to-subnet がサポートされます。このモードでは、新しい IP パケットが既存のパケットをそのペイロードとヘッダーとともにカプセル化します。このモードのカプセル化により、セキュアでないネットワーク上の IP データ、送信元ヘッダー、および宛先ヘッダーが保護されます。このモードは、subnet-to-subnet、リモートアクセス接続、および信頼できないネットワーク (オープンなパブリック Wi-Fi ネットワークなど) でデータを転送する場合に役立ちます。デフォルトでは、IPsec はトンネルモードで 2 つのサイト間にセキュアなチャネルを確立します。後述の設定を使用すると、host-to-host アーキテクチャーとして VPN 接続を確立できます。

ネットワーク管理用の宣言型 API である Nmstate を使用すると、IPsec VPN 接続を設定できます。設定すると、Nmstate API によって結果と設定ファイルが一致することが確認されます。何らかの障害が発生した場合、nmstate は自動的に変更をロールバックし、システムが正しくない状態になるのを回避します。

host-to-host の設定では、leftmodecfgclient: no (値として no ) を設定して、サーバーからネットワーク設定を受信できないようにする必要があります。nmstate で IPsec のシステムを定義する場合、left という名前を持つシステムがローカルホストであり、right という名前を持つシステムがリモートホストです。

NetworkManager-libreswan プラグインの設計により、一方では nmstatectl を使用できますが、もう一方では IPsec を手動で設定する必要があることに注意してください。

前提条件

  • パスワードを使用して、証明書と暗号化キーを保存する PKCS #12 ファイルを生成した。

手順

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

    # dnf install nmstate libreswan NetworkManager-libreswan
    Copy to Clipboard
  2. NetworkManager サービスを再起動します。

    # systemctl restart NetworkManager
    Copy to Clipboard
  3. Libreswan がすでにインストールされている場合は、古いデータベースファイルを削除して再作成します。

    # systemctl stop ipsec
    # rm /var/lib/ipsec/nss/*db
    # ipsec initnss
    Copy to Clipboard
  4. PKCS#12 ファイルをインポートします。

    # ipsec import node-example.p12
    Copy to Clipboard

    PKCS#12 ファイルをインポートするときは、ファイルの生成に使用したパスワードを入力します。

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

    # systemctl enable --now ipsec
    Copy to Clipboard
  6. 次の内容を含む YAML ファイル (例: ~/create-p2p-vpn-authentication.yml) を作成します。

    ---
    interfaces:
    - name: 'example_ipsec_conn1'             
    1
    
      type: ipsec
      libreswan:
        left: '192.0.2.150'                   
    2
    
        leftid:  'local-host.example.com'     
    3
    
        leftcert: 'local-host.example.com'    
    4
    
        leftmodecfgclient: no                 
    5
    
        right: '192.0.2.250'                  
    6
    
        rightid: 'remote-host.example.com'    
    7
    
        rightsubnet: '192.0.2.150/32'         
    8
    
        ikev2: 'insist'                       
    9
    Copy to Clipboard

    YAML ファイルで次の設定を定義します。

    1
    IPsec 接続名
    2
    ローカルホストのパブリックネットワークインターフェイスの静的 IPv4 アドレス
    3
    ローカルホストの識別名 (DN)
    4
    ローカルホストにインストールされた証明書名
    5
    リモートホストからクライアント設定を取得しないための値
    6
    リモートホストのパブリックネットワークインターフェイスの静的 IPv4 アドレス
    7
    リモートホストの識別名 (DN)
    8
    リモートホストのサブネット範囲 - 192.0.2.15032 個の IPv4 アドレス
    9
    Internet Key Exchange (IKEv2) プロトコルのみを受け入れて受信するための値
  7. 設定をシステムに適用します。

    # nmstatectl apply ~/create-p2p-vpn-authentication.yml
    Copy to Clipboard
  8. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. 作成された P2P ポリシーを表示します。

    # ip xfrm policy
    Copy to Clipboard
  2. IPsec のステータスを確認します。

    # ip xfrm state
    Copy to Clipboard

6.15.5. nmstatectl を使用して PKI 認証とトランスポートモードを備えたホスト間 IPsec VPN を設定する

IPsec (Internet Protocol Security) は、ネットワークおよびデバイス内の IP 通信を認証および暗号化するためのセキュリティープロトコルスイートです。Libreswan ユーティリティーが VPN 用の IPsec ベースの実装を提供します。

トランスポートモードでは、IP パケットのペイロードに対してのみ暗号化が機能します。また、元の IP ヘッダーがそのまま維持され、新しい IPsec ヘッダーが IP パケットに追加されます。トランスポートモードでは、通信の送信元 IP と宛先 IP は暗号化されず、外部 IP ヘッダーにコピーされます。したがって、ネットワーク上の IP データのみが暗号化によって保護されます。このモードは、ネットワークの host-to-host 接続でデータを転送する場合に便利です。このモードは、20 バイト (IP ヘッダー) のオーバーヘッドを節約するために、GRE トンネルと一緒に使用されることがよくあります。デフォルトでは、IPsec ユーティリティーはトンネルモードを使用します。トランスポートモードを使用するには、host-to-host 接続データ転送に type: transport を設定します。

ネットワーク管理用の宣言型 API である Nmstate を使用すると、IPsec VPN 接続を設定できます。設定すると、Nmstate API によって結果と設定ファイルが一致することが確認されます。何らかの障害が発生した場合、nmstate は自動的に変更をロールバックし、システムが正しくない状態になるのを回避します。デフォルトの tunnel モードをオーバーライドするには、transport モードを指定します。

nmstate で IPsec のシステムを定義する場合、left という名前を持つシステムがローカルホストであり、right という名前を持つシステムがリモートホストです。

NetworkManager-libreswan プラグインの設計により、一方では nmstatectl を使用できますが、もう一方では IPsec を手動で設定する必要があることに注意してください。

前提条件

  • パスワードを使用して、証明書と暗号化キーを保存する PKCS #12 ファイルを生成した。

手順

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

    # dnf install nmstate libreswan NetworkManager-libreswan
    Copy to Clipboard
  2. NetworkManager サービスを再起動します。

    # systemctl restart NetworkManager
    Copy to Clipboard
  3. Libreswan がすでにインストールされている場合は、古いデータベースファイルを削除して再作成します。

    # systemctl stop ipsec
    # rm /var/lib/ipsec/nss/*db
    # ipsec initnss
    Copy to Clipboard
  4. PKCS#12 ファイルをインポートします。

    # ipsec import node-example.p12
    Copy to Clipboard

    PKCS#12 ファイルをインポートするときは、ファイルの作成に使用したパスワードを入力します。

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

    # systemctl enable --now ipsec
    Copy to Clipboard
  6. 次の内容を含む YAML ファイル (例: ~/create-p2p-transport-authentication.yml) を作成します。

    ---
    interfaces:
    - name: 'example_ipsec_conn1'           
    1
    
      type: ipsec
      libreswan:
        type: 'transport'                   
    2
    
        ipsec-interface: '99'               
    3
    
        left: '192.0.2.150'                 
    4
    
        leftid: '%fromcert'                 
    5
    
        leftcert: 'local-host.example.org'  
    6
    
        right: '192.0.2.250'                
    7
    
        prefix-length: '32'                 
    8
    
        rightid: '%fromcert'                
    9
    
        ikev2: 'insist'                     
    10
    
        ikelifetime: '24h'                  
    11
    
        salifetime: '24h'                   
    12
    Copy to Clipboard

    YAML ファイルで次の設定を定義します。

    1
    IPsec 接続名
    2
    IPsec モード
    3
    値が 99 の場合、libreswan が IPsec xfrm 仮想インターフェイス ipsec<number> を作成し、利用可能な次の番号を自動的に検出します。
    4
    ローカルホストのパブリックネットワークインターフェイスの静的 IPv4 アドレス
    5
    %fromcert 値は、ローカルホストで、ロードされた証明書から取得された識別名 (DN) に ID を設定します。
    6
    ローカルホストの公開鍵の識別名 (DN)
    7
    リモートホストのパブリックネットワークインターフェイスの静的 IPv4 アドレス
    8
    ローカルホストの静的 IPv4 アドレスのサブネットマスク
    9
    %fromcert 値は、リモートホストで、ロードされた証明書から取得された識別名 (DN) に ID を設定します。
    10
    Internet Key Exchange (IKEv2) プロトコルのみを受け入れて受信するための値
    11
    IKE プロトコルの存続時間
    12
    IPsec セキュリティーアソシエーション (SA) の存続期間
  7. 設定をシステムに適用します。

    # nmstatectl apply ~/create-p2p-transport-authentication.yml
    Copy to Clipboard
  8. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. IPsec のステータスを確認します。

    # ip xfrm state
    Copy to Clipboard
  2. IPsec のポリシーを確認します。

    # ip xfrm policy
    Copy to Clipboard

6.16. 接続がトンネルを回避しないように 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
  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

    優先度の値は 1 - 32766 の範囲で指定できます。値が低いほど、優先度が高くなります。

  4. VPN 接続を再接続します。

    # nmcli connection down <vpn_connection_profile>
    # nmcli connection up <vpn_connection_profile>
    Copy to Clipboard

検証

  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

    この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 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

    この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 75 に割り当てられており、すべてのトラフィックがトンネルを介してルーティングされることを確認できます。VPN 接続プロファイルで ipv6.never-default true を設定すると、デフォルトルートが作成されず、この出力には表示されません。

第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

7.2. WireGuard がトンネル IP アドレス、公開鍵、およびリモートエンドポイントを使用する方法

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
  2. ホストの秘密鍵と、対応する公開鍵を作成します。

    # wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key
    Copy to Clipboard

    キーファイルの内容は必要ですが、ファイル自体は必要ありません。ただし、Red Hat では、将来的に鍵を覚えておく必要がある場合に備え、ファイルを保持することを推奨しています。

  3. キーファイルにセキュアなパーミッションを設定します。

    # chmod 600 /etc/wireguard/$HOSTNAME.private.key /etc/wireguard/$HOSTNAME.public.key
    Copy to Clipboard
  4. 秘密鍵を表示します。

    # cat /etc/wireguard/$HOSTNAME.private.key
    YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
    Copy to Clipboard

    ローカルホストで WireGuard 接続を設定するには、秘密鍵が必要です。秘密鍵を共有しないでください。

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

    # cat /etc/wireguard/$HOSTNAME.public.key
    UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    Copy to Clipboard

    リモートホストで 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

    このコマンドは、server-wg0 という名前のプロファイルを作成し、それに仮想インターフェイス wg0 を割り当てます。設定を確定せずに接続を追加した後、接続が自動的に開始しないようにするには、autoconnect パラメーターを無効にします。

  2. サーバーのトンネル IPv4 アドレスおよびサブネットマスクを設定します。

    # nmcli connection modify server-wg0 ipv4.method manual ipv4.addresses 192.0.2.1/24
    Copy to Clipboard
  3. サーバーのトンネル IPv6 アドレスおよびサブネットマスクを設定します。

    # nmcli connection modify server-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::1/32
    Copy to Clipboard
  4. サーバーの秘密鍵を接続プロファイルに追加します。

    # nmcli connection modify server-wg0 wireguard.private-key "YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg="
    Copy to Clipboard
  5. 着信 WireGuard 接続のポートを設定します。

    # nmcli connection modify server-wg0 wireguard.listen-port 51820
    Copy to Clipboard

    着信 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
      • [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
  7. 必要に応じて、自動的に起動するように接続を設定し、次のコマンドを実行します。

    # nmcli connection modify server-wg0 autoconnect yes
    Copy to Clipboard
  8. server-wg0 接続を再アクティブ化します。

    # nmcli connection up server-wg0
    Copy to Clipboard
  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

    出力に秘密鍵を表示するには、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

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
  2. Edit a connection 選択し、Enter を押します。
  3. Add を選択し、Enter を押します。
  4. リストから WireGuard 接続タイプを選択し、Enter を押します。
  5. Edit connection ウィンドウで:

    1. NetworkManager が接続に割り当てる仮想インターフェイス (wg0 など) の接続名を入力します。
    2. サーバーの秘密鍵を入力します。
    3. 着信 WireGuard 接続のリッスンポート番号 (51820 など) を設定します。

      着信 WireGuard 接続を受信するホストでは、常に固定ポート番号を設定してください。ポートを設定しないと、WireGuard はインターフェイスをアクティブにするたびにランダムな空きポートを使用します。

      nmtui WireGuard サーバー全般
    4. Peers ペインの横にある Add をクリックします。

      1. クライアントの公開鍵を入力します。
      2. Allowed IPs フィールドを、このサーバーへのデータ送信が許可されているクライアントのトンネル IP アドレスに設定します。
      3. OK を選択し、Enter を押します。

        nmtui WireGuard サーバーのピア設定
    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 を押します

      nmtui WireGuard サーバーの IP 設定
  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

    出力に秘密鍵を表示するには、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

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 アドレスを設定します。
    WireGuard サーバー設定
  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

    出力に秘密鍵を表示するには、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

7.8. コマンドラインを使用した WireGuard サーバーでの firewalld の設定

クライアントからの着信接続を許可するには、WireGuard サーバーで firewalld サービスを設定する必要があります。また、クライアントが WireGuard サーバーをデフォルトゲートウェイとして使用し、すべてのトラフィックをトンネル経由でルーティングできるようにするには、マスカレードを有効にする必要があります。

手順

  1. firewalld サービスで着信接続用の WireGuard ポートを開きます。

    # firewall-cmd --permanent --add-port=51820/udp --zone=public
    Copy to Clipboard
  2. クライアントがすべてのトラフィックをトンネル経由でルーティングし、WireGuard サーバーをデフォルトゲートウェイとして使用する場合は、public ゾーンのマスカレードを有効にします。

    # firewall-cmd --permanent --zone=public --add-masquerade
    Copy to Clipboard
  3. firewalld ルールをリロードします。

    # firewall-cmd --reload
    Copy to Clipboard

検証

  • public ゾーンの設定を表示します。

    # firewall-cmd --list-all
    public (active)
      ...
      ports: 51820/udp
      masquerade: yes
      ...
    Copy to Clipboard

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 エントリーを選択します。

    WireGuard サーバーの firewalld 設定
  6. Add services をクリックします。
  7. クライアントがすべてのトラフィックをトンネル経由でルーティングし、WireGuard サーバーをデフォルトゲートウェイとして使用する場合は、public ゾーンのマスカレードを有効にします。

    # firewall-cmd --permanent --zone=public --add-masquerade
    # firewall-cmd --reload
    Copy to Clipboard

    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

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

    client-wg0 という名前のプロファイルを作成し、そのプロファイルに仮想インターフェイス wg0 を割り当てます。

  2. オプション: NetworkManager が client-wg 接続を自動的に起動しないように設定します。

    # nmcli connection modify client-wg0 autoconnect no
    Copy to Clipboard
  3. クライアントのトンネル IPv4 アドレスとサブネットマスクを設定します。

    # nmcli connection modify client-wg0 ipv4.method manual ipv4.addresses 192.0.2.2/24
    Copy to Clipboard
  4. クライアントのトンネル IPv6 アドレスとサブネットマスクを設定します。

    # nmcli connection modify client-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::2/32
    Copy to Clipboard
  5. すべてのトラフィックをトンネル経由でルーティングする場合は、サーバーのトンネル IP アドレスをデフォルトゲートウェイとして設定します。

    # nmcli connection modify client-wg0 ipv4.gateway 192.0.2.1 ipv6.gateway 2001:db8:1::1
    Copy to Clipboard

    すべてのトラフィックをトンネル経由でルーティングするには、後の手順で、このクライアントの allowed-ips0.0.0.0/0;::/0 に設定する必要があります。

    すべてのトラフィックをトンネル経由でルーティングすると、サーバーのルーティングとファイアウォールの設定によっては他のホストへの接続に影響が及ぶ可能性があることに注意してください。

  6. クライアントの秘密鍵を接続プロファイルに追加します。

    # nmcli connection modify client-wg0 wireguard.private-key "aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A="
    Copy to Clipboard
  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
      • [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
  8. client-wg0 接続を再アクティブ化します。

    # nmcli connection up client-wg0
    Copy to Clipboard
  9. DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。

検証

  1. サーバーの IP アドレスの ping を実行します。

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
    Copy to Clipboard
  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

    出力に秘密鍵を表示するには、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

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
  2. Edit a connection 選択し、Enter を押します。
  3. Add を選択し、Enter を押します。
  4. リストから WireGuard 接続タイプを選択し、Enter を押します。
  5. Edit connection ウィンドウで:

    1. NetworkManager が接続に割り当てる仮想インターフェイス (wg0 など) の接続名を入力します。
    2. クライアントの秘密鍵を入力します。

      nmtui WireGuard クライアント全般
    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 を押します。

        nmtui WireGuard クライアントピア設定
    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 を押します

      nmtui WireGuard クライアントの IP 設定
  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
  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

    出力に秘密鍵を表示するには、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

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 サーバーをデフォルトゲートウェイとして使用します。
    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

    トンネル経由でトラフィックを送信しようとすると、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

    出力に秘密鍵を表示するには、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

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
  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

    優先度の値は 1 - 32766 の範囲で指定できます。値が低いほど、優先度が高くなります。

  4. VPN 接続を再接続します。

    # nmcli connection down <vpn_connection_profile>
    # nmcli connection up <vpn_connection_profile>
    Copy to Clipboard

検証

  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

    この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 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

    この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 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 つの内部サブネットに接続できます。

IPIP トンネル

前提条件

  • 各 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

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

    2. IPv4 アドレスを tun0 デバイスに設定します。

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'
      Copy to Clipboard

      トンネルには、2 つの使用可能な IP アドレスを持つ /30 サブネットで十分であることに注意してください。

    3. IPv4 設定を使用するように手動で tun0 接続を設定します。

      # nmcli connection modify tun0 ipv4.method manual
      Copy to Clipboard
    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
    5. tun0 接続を有効にします。

      # nmcli connection up tun0
      Copy to Clipboard
    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
  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

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

    2. IPv4 アドレスを tun0 デバイスに設定します。

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
      Copy to Clipboard
    3. IPv4 設定を使用するように手動で tun0 接続を設定します。

      # nmcli connection modify tun0 ipv4.method manual
      Copy to Clipboard
    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
    5. tun0 接続を有効にします。

      # nmcli connection up tun0
      Copy to Clipboard
    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

検証

  • 各 RHEL ルーターから、他のルーターの内部インターフェイスの IP アドレスに ping します。

    1. ルーター A で 172.16.0.1 に ping します。

      # ping 172.16.0.1
      Copy to Clipboard
    2. ルーター B で 192.0.2.1 に ping します。

      # ping 192.0.2.1
      Copy to Clipboard

8.2. レイヤー 3 トラフィックを IPv4 パケットにカプセル化するための GRE トンネルの設定

Generic Routing Encapsulation (GRE) トンネルは、RFC 2784 で説明されているように、レイヤー 3 トラフィックを IPv4 パケットにカプセル化します。GRE トンネルは、有効なイーサネットタイプで任意のレイヤー 3 プロトコルをカプセル化できます。

重要

GRE トンネルを介して送信されるデータは暗号化されません。セキュリティー上の理由から、すでに暗号化されたデータにはトンネルを使用してください (HTTPS などの他のプロトコル)。

たとえば、以下の図に示すように、2 つの RHEL ルーター間で GRE トンネルを作成し、インターネット経由で 2 つの内部サブネットに接続できます。

GRE トンネル

前提条件

  • 各 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

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

      重要

      gre0 デバイス名は予約されています。デバイスに gre1 または別の名前を使用します。

    2. IPv4 アドレスを gre1 デバイスに設定します。

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'
      Copy to Clipboard

      トンネルには、2 つの使用可能な IP アドレスを持つ /30 サブネットで十分であることに注意してください。

    3. 手動の IPv4 設定を使用するように gre1 接続を設定します。

      # nmcli connection modify gre1 ipv4.method manual
      Copy to Clipboard
    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
    5. gre1 コネクションを有効にします。

      # nmcli connection up gre1
      Copy to Clipboard
    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
  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

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

    2. IPv4 アドレスを gre1 デバイスに設定します。

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
      Copy to Clipboard
    3. 手動の IPv4 設定を使用するように gre1 接続を設定します。

      # nmcli connection modify gre1 ipv4.method manual
      Copy to Clipboard
    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
    5. gre1 コネクションを有効にします。

      # nmcli connection up gre1
      Copy to Clipboard
    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

検証

  1. 各 RHEL ルーターから、他のルーターの内部インターフェイスの IP アドレスに ping します。

    1. ルーター A で 172.16.0.1 に ping します。

      # ping 172.16.0.1
      Copy to Clipboard
    2. ルーター B で 192.0.2.1 に ping します。

      # ping 192.0.2.1
      Copy to Clipboard

8.3. IPv4 でイーサネットフレームを転送するための GRETAP トンネルの設定

GRETAP (Generic Routing Encapsulation Terminal Access Point) トンネルは OSI レベル 2 で動作し、RFC 2784 で説明されているように IPv4 パケットのイーサネットトラフィックをカプセル化します。

重要

GRETAP トンネルを介して送信されるデータは暗号化されません。セキュリティー上の理由から、VPN または別の暗号化された接続にトンネルを確立します。

たとえば、以下の図に示すように、2 つの RHEL ルーター間で GRETAP トンネルを作成し、ブリッジを使用して 2 つのネットワークに接続します。

GRETAP トンネル

前提条件

  • 各 RHEL ルーターには、ローカルネットワークに接続されたネットワークインターフェイスがあり、IP 設定は割り当てられません。
  • 各 RHEL ルーターには、インターネットに接続しているネットワークインターフェイスがあります。

手順

  1. ネットワーク A の RHEL ルーターで、次のコマンドを実行します。

    1. bridge0 という名前のブリッジインターフェイスを作成します。

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
      Copy to Clipboard
    2. ブリッジの IP 設定を設定します。

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bridge0 ipv4.method manual
      Copy to Clipboard
    3. ローカルネットワークに接続されたインターフェイス用の新しい接続プロファイルをブリッジに追加します。

      # nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
      Copy to Clipboard
    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

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

      重要

      gretap0 デバイス名が予約されています。デバイスに gretap1 または別の名前を使用します。

    5. 必要に応じて、STP (Spanning Tree Protocol) を無効にする必要がない場合は、これを無効にします。

      # nmcli connection modify bridge0 bridge.stp no
      Copy to Clipboard

      デフォルトでは、STP は有効になり、接続を使用する前に遅延が生じます。

    6. bridge0 接続がアクティベートするように、ブリッジのポートが自動的にアクティブになるようにします。

      # nmcli connection modify bridge0 connection.autoconnect-ports 1
      Copy to Clipboard
    7. bridge0 接続をアクティブにします。

      # nmcli connection up bridge0
      Copy to Clipboard
  2. ネットワーク B の RHEL ルーターで、次のコマンドを実行します。

    1. bridge0 という名前のブリッジインターフェイスを作成します。

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
      Copy to Clipboard
    2. ブリッジの IP 設定を設定します。

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24'
      # nmcli connection modify bridge0 ipv4.method manual
      Copy to Clipboard
    3. ローカルネットワークに接続されたインターフェイス用の新しい接続プロファイルをブリッジに追加します。

      # nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
      Copy to Clipboard
    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

      remote パラメーターおよび local パラメーターは、リモートルーターおよびローカルルーターのパブリック IP アドレスを設定します。

    5. 必要に応じて、STP (Spanning Tree Protocol) を無効にする必要がない場合は、これを無効にします。

      # nmcli connection modify bridge0 bridge.stp no
      Copy to Clipboard
    6. bridge0 接続がアクティベートするように、ブリッジのポートが自動的にアクティブになるようにします。

      # nmcli connection modify bridge0 connection.autoconnect-ports 1
      Copy to Clipboard
    7. bridge0 接続をアクティブにします。

      # nmcli connection up bridge0
      Copy to Clipboard

検証

  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
  2. 各 RHEL ルーターから、他のルーターの内部インターフェイスの IP アドレスに ping します。

    1. ルーター A で 192.0.2.2 に ping します。

      # ping 192.0.2.2
      Copy to Clipboard
    2. ルーター B で 192.0.2.1 に ping します。

      # ping 192.0.2.1
      Copy to Clipboard

第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
  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

    サービスセット識別子 (SSID) 列には、ネットワークの名前が含まれています。列に -- が表示されている場合、このネットワークのアクセスポイントは SSID をブロードキャストしていません。

  3. Wi-Fi ネットワークに接続します。

    # nmcli device wifi connect Office --ask
    Password: wifi-password
    Copy to Clipboard

    対話的に入力するのではなく、コマンドでパスワードを設定する場合は、コマンドで --ask の代わりに password <Wi-Fi_password> オプションを使用します。

    # nmcli device wifi connect Office password <wifi_password>
    Copy to Clipboard

    ネットワークが静的 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
    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
  5. 接続を再度有効にします。

    # nmcli connection up Office
    Copy to Clipboard

検証

  1. アクティブな接続を表示します。

    # nmcli connection show --active
    NAME    ID                                    TYPE  DEVICE
    Office  2501eb7e-7b16-4dc6-97ef-7cc460139a58  wifi  wlp0s20f3
    Copy to Clipboard

    作成した Wi-Fi 接続が出力にリストされている場合、その接続はアクティブです。

  2. ホスト名または IP アドレスに ping を実行します。

    # ping -c 3 example.com
    Copy to Clipboard

9.3. GNOME 設定アプリケーションを使用した Wi-Fi ネットワークへの接続

gnome-control-center という名前の GNOME settings アプリケーションを使用して、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 ネットワークが接続されていることを確認します。

    gnome wifi connected

    ネットワークがリストに表示されていれば、接続されています。

  2. ホスト名または IP アドレスに ping を実行します。

    # ping -c 3 example.com
    Copy to Clipboard

9.4. nmtui を使用した Wi-Fi 接続の設定

nmtui アプリケーションは、NetworkManager 用のテキストベースのユーザーインターフェイスを提供します。nmtui を使用して Wi-Fi ネットワークに接続できます。

注記

nmtui で以下を行います。

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

手順

  1. nmtui を開始します。

    # nmtui
    Copy to Clipboard
  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 ボタンを押して、新しい接続を作成し、自動的にアクティブにします。

    nmtui wi fi dynamic IP
  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

    作成した Wi-Fi 接続が出力にリストされている場合、その接続はアクティブです。

  2. ホスト名または IP アドレスに ping を実行します。

    # ping -c 3 example.com
    Copy to Clipboard

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

    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
    重要

    デフォルトでは、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
    注記

    セキュリティー上の理由から、クライアントでオーセンティケーターの証明書を検証することを推奨します。

  4. 接続プロファイルをアクティベートします。

    # nmcli connection up wlp1s0
    Copy to Clipboard

検証

  • ネットワーク認証が必要なネットワーク上のリソースにアクセスします。

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
    2. ansible-vault create コマンドでエディターが開いたら、機密データを <key>: <value> 形式で入力します。

      pwd: <password>
      Copy to Clipboard
    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

    サンプル 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

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

  4. Playbook を実行します。

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

9.7. ワイヤレス規制ドメインの手動設定

RHEL では、udev ルールが setregdomain ユーティリティーを実行してワイヤレス規制ドメインを設定します。次に、ユーティリティーはこの情報をカーネルに提供します。

デフォルトでは、setregdomain は国コードを自動的に決定しようとします。これが失敗する場合は、ワイヤレス規制ドメインの設定が間違っている可能性があります。この問題を回避するには、国コードを手動で設定します。

重要

規制ドメインを手動で設定すると、自動検出が無効になります。そのため、後で別の国でコンピューターを使用すると、以前に設定された設定が正しくなくなる可能性があります。この場合、/etc/sysconfig/regdomain ファイルを削除して自動検出に戻すか、以下の手順を使用して規制ドメイン設定を手動で再度更新します。

前提条件

  • Wi-Fi デバイスのドライバーが、規制ドメインの変更をサポートしている。

手順

  1. オプション: 現在の規制ドメイン設定を表示します。

    # iw reg get
    global
    country US: DFS-FCC
    ...
    Copy to Clipboard
  2. 次の内容で /etc/sysconfig/regdomain ファイルを作成します。

    COUNTRY=<country_code>
    Copy to Clipboard

    COUNTRY 変数を ISO 3166-1 alpha2 国コード (ドイツの場合は DE、アメリカ合衆国の場合は US など) に設定します。

  3. 規制ドメインを設定します。

    # setregdomain
    Copy to Clipboard

検証

  • 規制ドメインの設定を表示します。

    # iw reg get
    global
    country DE: DFS-ETSI
    ...
    Copy to Clipboard

第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
      2. 32 バイトの 16 進 CKN を作成します。

        # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
        f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
        Copy to Clipboard
  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

    前の手順で生成された 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
    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
  5. 接続をアクティベートします。

    # nmcli connection up macsec0
    Copy to Clipboard

検証

  1. トラフィックが暗号化されていることを確認します。

    # tcpdump -nn -i enp1s0
    Copy to Clipboard
  2. オプション: 暗号化されていないトラフィックを表示します。

    # tcpdump -nn -i macsec0
    Copy to Clipboard
  3. MACsec の統計を表示します。

    # ip macsec show
    Copy to Clipboard
  4. integrity-only (encrypt off) および encryption (encrypt on) の各タイプの保護に対して個々のカウンターを表示します。

    # ip -s macsec show
    Copy to Clipboard

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
    2. 32 バイトの 16 進 CKN を作成します。

      # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
      f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
      Copy to Clipboard
  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
    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

検証

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

    # nmstatectl show macsec0
    Copy to Clipboard
  2. トラフィックが暗号化されていることを確認します。

    # tcpdump -nn -i enp0s1
    Copy to Clipboard
  3. オプション: 暗号化されていないトラフィックを表示します。

    # tcpdump -nn -i macsec0
    Copy to Clipboard
  4. MACsec の統計を表示します。

    # ip macsec show
    Copy to Clipboard
  5. integrity-only (encrypt off) および encryption (encrypt on) の各タイプの保護に対して個々のカウンターを表示します。

    # ip -s macsec show
    Copy to Clipboard

第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
  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
    • 特定の MAC アドレスを管理対象外として設定するには、以下を追加します。

      [device-mac525400747956-unmanaged]
      match-device=mac:52:54:00:74:79:56
      managed=0
      Copy to Clipboard
    • 特定のタイプのすべてのデバイスを管理対象外として設定するには、以下を追加します。

      [device-ethernet-unmanaged]
      match-device=type:ethernet
      managed=0
      Copy to Clipboard
    • 複数のデバイスを管理対象外に設定するには、unmanaged-devices パラメーターのエントリーをセミコロンで区切ります。以下に例を示します。

      [device-multiple-devices-unmanaged]
      match-device=interface-name:enp1s0;interface-name:enp7s0
      managed=0
      Copy to Clipboard

      または、このファイルにデバイスごとに個別のセクションを追加したり、/etc/NetworkManager/conf.d/ ディレクトリーに追加の *.conf ファイルを作成したりすることもできます。

  4. ホストシステムを再起動します。

    # reboot
    Copy to Clipboard

検証

  • デバイスのリストを表示します。

    # nmcli device status
    DEVICE  TYPE      STATE      CONNECTION
    enp1s0  ethernet  unmanaged  --
    ...
    Copy to Clipboard

    enp1s0 デバイスの横の unmanaged 状態は、NetworkManager がこのデバイスを管理していないことを示しています。

トラブルシューティング

  • nmcli device status コマンドの出力にデバイスが unmanaged としてリストされていない場合は、NetworkManager 設定を表示します。

    # NetworkManager --print-config
    ...
    [device-enp1s0-unmanaged]
    match-device=interface-name:enp1s0
    managed=0
    ...
    Copy to Clipboard

    指定した設定と出力が一致しない場合は、より優先度が高い設定ファイルによって設定がオーバーライドされていないことを確認してください。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
  2. enp1s0 デバイスを unmanaged の状態に設定します。

    # nmcli device set enp1s0 managed no
    Copy to Clipboard

検証

  • デバイスのリストを表示します。

    # nmcli device status
    DEVICE  TYPE      STATE      CONNECTION
    enp1s0  ethernet  unmanaged  --
    ...
    Copy to Clipboard

    enp1s0 デバイスの横の unmanaged 状態は、NetworkManager がこのデバイスを管理していないことを示しています。

11.3. NetworkManager が特定のネットワークデバイスを管理しない理由を特定する

NetworkManager は、各ネットワークデバイスのステータスに加えて、デバイスが現在のステータスになっている理由も追跡します。この機能を使用すると、NetworkManager が特定のデバイスを管理しない理由を特定できます。

手順

  • すべてのネットワークデバイスのステータスとその理由を表示します。

    # nmcli -f GENERAL.DEVICE,GENERAL.STATE,GENERAL.REASON device show
    Copy to Clipboard

    コマンドにデバイス名を渡すと、指定したデバイスの出力のみを表示できます。

    出力例:

    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
    注記

    このコマンドは、管理対象か管理対象外かに関係なく、すべてのデバイスのステータスを返すことに注意してください。

第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

    IPv6 デフォルトゲートウェイを設定するには、次のように実行します。

    # nmcli connection modify <connection_name> ipv6.gateway "<IPv6_gateway_address>"
    Copy to Clipboard
  2. ネットワーク接続を再起動して、変更を有効にします。

    # nmcli connection up <connection_name>
    Copy to Clipboard
    警告

    このネットワーク接続を現在使用しているすべての接続が、再起動時に一時的に中断されます。

検証

  • ルートがアクティブであることを確認します。

    1. IPv4 デフォルトゲートウェイを表示するには、次のように実行します。

      # ip -4 route
      default via 192.0.2.1 dev example proto static metric 100
      Copy to Clipboard
    2. IPv6 デフォルトゲートウェイを表示するには、次のように実行します。

      # ip -6 route
      default via 2001:db8:1::1 dev example proto static metric 100 pref medium
      Copy to Clipboard

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

    これらの設定では、192.0.2.1 をデフォルトゲートウェイとして定義します。デフォルトゲートウェイは enp1s0 インターフェイス経由で到達可能です。

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

    # nmstatectl apply ~/set-default-gateway.yml
    Copy to Clipboard

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

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

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

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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  • 管理対象ノードの 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

12.4. NetworkManager が複数のデフォルトゲートウェイを管理する方法

フォールバック上の理由で特定の状況では、ホストに複数のデフォルトゲートウェイを設定します。ただし、非同期ルーティングの問題を回避するために、同じプロトコルの各デフォルトゲートウェイには別のメトリック値が必要です。RHEL は、最も低いメトリックセットを持つデフォルトゲートウェイへの接続のみを使用することに注意してください。

以下のコマンドを使用して、接続の IPv4 ゲートウェイと IPv6 ゲートウェイの両方にメトリックを設定できます。

# nmcli connection modify <connection_name> ipv4.route-metric <value> ipv6.route-metric <value>
Copy to Clipboard
重要

ルーティングの問題を回避するために、複数の接続プロファイルで同じプロトコルに同じメトリック値を設定しないでください。

メトリック値なしでデフォルトのゲートウェイを設定すると、NetworkManager は、インターフェイスタイプに基づいてメトリック値を自動的に設定します。このため、NetworkManager は、アクティブな最初の接続に、このネットワークタイプのデフォルト値を割り当て、そのネットワークタイプがアクティベートされる順序で、同じタイプの他の接続にインクリメントした値を設定します。たとえば、デフォルトゲートウェイを持つ 2 つのイーサネット接続が存在する場合、NetworkManager は、ルートに 100 のメトリックを、最初にアクティブにしている接続のデフォルトゲートウェイに設定します。2 つ目の接続では、NetworkManager は 101 を設定します。

以下は、よく使用されるネットワークタイプと、そのデフォルトのメトリックの概要です。

接続タイプデフォルトのメトリック値

VPN

50

イーサネット

100

MACsec

125

InfiniBand

150

Bond

300

VLAN

400

ブリッジ

425

TUN

450

Wi-Fi

600

IP トンネル

675

12.5. 特定のプロファイルでのデフォルトゲートウェイの指定を防ぐための NetworkManager の設定

NetworkManager が特定のプロファイルを使用してデフォルトゲートウェイを指定しないようにすることができます。デフォルトゲートウェイに接続されていない接続プロファイルには、以下の手順に従います。

前提条件

  • デフォルトゲートウェイに接続されていない接続の NetworkManager 接続プロファイルが存在する。

手順

  1. 接続で動的 IP 設定を使用する場合は、NetworkManager が、対応する IP タイプのデフォルト接続としてこの接続を使用しないように設定します。つまり、NetworkManager がデフォルトのルートをこの接続に割り当てないようにします。

    # nmcli connection modify <connection_name> ipv4.never-default yes ipv6.never-default yes
    Copy to Clipboard

    ipv4.never-default および ipv6.never-defaultyes に設定すると、対応するプロトコルのデフォルトのゲートウェイ IP アドレスが、接続プロファイルから削除されることに注意してください。

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

    # nmcli connection up <connection_name>
    Copy to Clipboard

検証

  • 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
    • 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

    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

    この例では、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

    ipv4.never-default および ipv6.never-defaultyes に設定すると、対応するプロトコルのデフォルトのゲートウェイ IP アドレスが、接続プロファイルから削除されることに注意してください。

  4. Corporate-LAN 接続をアクティブにします。

    # nmcli connection up Corporate-LAN
    Copy to Clipboard

検証

  • IPv4 および IPv6 ルーティングテーブルを表示し、プロトコルごとに 1 つのデフォルトゲートウェイのみが利用可能であることを確認します。

    • IPv4 の場合は、次のコマンドを実行します。

      # ip -4 route
      default via 198.51.100.1 dev enp7s0 proto dhcp metric 102
      ...
      Copy to Clipboard
    • IPv6 の場合は、次のコマンドを実行します。

      # ip -6 route
      default via 2001:db8:2::1 dev enp7s0 proto ra metric 102 pref medium
      ...
      Copy to Clipboard

第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

このコマンドは、次のルート属性に対応します。

  • 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
  • 特定のルートを削除するには、次のように実行します。

    $ nmcli connection modify connection_name -ipv4.routes "<route>"
    Copy to Clipboard

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

    一度に複数のルートを設定するには、個々のルートをコンマで区切ってコマンドに渡します。

    # 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
  2. LAN 接続プロファイルに静的 IPv6 ルートを追加します。

    # nmcli connection modify LAN +ipv6.routes "2001:db8:2::/64 2001:db8:1::10"
    Copy to Clipboard
  3. 接続を再度有効にします。

    # nmcli connection up LAN
    Copy to Clipboard

検証

  1. IPv4 ルートを表示します。

    # ip -4 route
    ...
    198.51.100.0/24 via 192.0.2.10 dev enp1s0
    Copy to Clipboard
  2. IPv6 ルートを表示します。

    # ip -6 route
    ...
    2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
    Copy to Clipboard

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
  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 メトリックのない静的ルートの例

      nmtui add static route
  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

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

    これらの設定では、次の静的ルートを定義します。

    • リモート 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

検証

  1. IPv4 ルートを表示します。

    # ip -4 route
    ...
    198.51.100.0/24 via 192.0.2.10 dev enp1s0
    Copy to Clipboard
  2. IPv6 ルートを表示します。

    # ip -6 route
    ...
    2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
    Copy to Clipboard

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

    この手順では、すでに存在するかどうかに応じて、以下の設定で 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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  1. 管理対象ノードで以下を行います。

    1. IPv4 ルートを表示します。

      # ip -4 route
      ...
      198.51.100.0/24 via 192.0.2.10 dev enp7s0
      Copy to Clipboard
    2. IPv6 ルートを表示します。

      # ip -6 route
      ...
      2001:db8:2::/64 via 2001:db8:1::10 dev enp7s0 metric 1024 pref medium
      Copy to Clipboard

第14章 代替ルートを定義するポリシーベースのルーティングの設定

デフォルトでは、RHEL のカーネルは、ルーティングテーブルを使用して宛先アドレスに基づいてネットワークパケットを転送する場所を決定します。ポリシーベースのルーティングにより、複雑なルーティングシナリオを設定できます。たとえば、送信元アドレス、パケットメタデータ、プロトコルなどのさまざまな基準に基づいてパケットをルーティングできます。

14.1. nmcli を使用して、特定のサブネットから別のデフォルトゲートウェイにトラフィックをルーティングする

ポリシーベースのルーティングを使用して、特定のサブネットからのトラフィックに対して別のデフォルトゲートウェイを設定できます。たとえば、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

    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

    このコマンドは、デフォルトゲートウェイを設定する 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

    このコマンドは、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

検証

  1. 内部ワークステーションサブネットの RHEL ホストで、以下を行います。

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

      # dnf install traceroute
      Copy to Clipboard
    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

      コマンドの出力には、ルーターがプロバイダー B のネットワークである 192.0.2.1 経由でパケットを送信することが表示されます。

  2. サーバーのサブネットの RHEL ホストで、以下を行います。

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

      # dnf install traceroute
      Copy to Clipboard
    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

      コマンドの出力には、ルーターがプロバイダー 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

    デフォルトでは、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
  3. インターフェイスとファイアウォールゾーンを表示します。

    # firewall-cmd --get-active-zones
    external
      interfaces: enp1s0 enp7s0
    trusted
      interfaces: enp8s0 enp9s0
    Copy to Clipboard
  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

14.2. network RHEL システムロールを使用して、特定のサブネットから別のデフォルトゲートウェイにトラフィックをルーティングする

ポリシーベースのルーティングを使用して、特定のサブネットからのトラフィックに対して別のデフォルトゲートウェイを設定できます。たとえば、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
  2. Playbook の構文を検証します。

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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  1. 内部ワークステーションサブネットの RHEL ホストで、以下を行います。

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

      # dnf install traceroute
      Copy to Clipboard
    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

      コマンドの出力には、ルーターがプロバイダー B のネットワークである 192.0.2.1 経由でパケットを送信することが表示されます。

  2. サーバーのサブネットの RHEL ホストで、以下を行います。

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

      # dnf install traceroute
      Copy to Clipboard
    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

      コマンドの出力には、ルーターがプロバイダー 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

      デフォルトでは、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
    3. インターフェイスとファイアウォールゾーンを表示します。

      # firewall-cmd --get-active-zones
      external
        interfaces: enp1s0 enp7s0
      trusted
        interfaces: enp8s0 enp9s0
      Copy to Clipboard
    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

第15章 hostnamectl を使用したホスト名の変更

hostnamectl ユーティリティーを使用してホスト名を更新できます。デフォルトでは、このユーティリティーは以下のホスト名タイプを設定します。

  • 静的ホスト名: /etc/hostname ファイルに保存されます。通常、サービスはこの名前をホスト名として使用します。
  • Pretty hostname: Proxy server in data center A などの説明的な名前。
  • 一時的なホスト名: 通常ネットワーク設定から受信されるフォールバック値。

手順

  1. オプション: 現在のホスト名設定を表示します。

    # hostnamectl status --static
    old-hostname.example.com
    Copy to Clipboard
  2. 新しいホスト名を設定します。

    # hostnamectl set-hostname new-hostname.example.com
    Copy to Clipboard

    このコマンドは、static と transient のホスト名を新しい値に設定します。特定のタイプのみを設定するには、--static オプション、--pretty オプション、または --transient オプションをコマンドに渡します。

  3. hostnamectl ユーティリティーは、systemd-hostnamed を自動的に再起動して、新しい名前をアクティブにします。変更を有効にするには、ホストを再起動します。

    # reboot
    Copy to Clipboard

    あるいは、そのホスト名を使用するサービスがわかっている場合は、次のようにします。

    1. サービスの起動時にホスト名のみを読み取るすべてのサービスを再起動します。

      # systemctl restart <service_name>
      Copy to Clipboard
    2. 変更を反映するには、アクティブなシェルユーザーを再ログインする必要があります。

検証

  • ホスト名を表示します。

    # hostnamectl status --static
    new-hostname.example.com
    Copy to Clipboard

第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

    パラメーターを infinity に設定すると、成功するまで NetworkManager が IP アドレスのリクエストおよび更新を停止しないようにします。

  2. 必要に応じて、タイムアウト前に NetworkManager が IPv4 アドレスを受信しない場合にこの動作を設定します。

    # nmcli connection modify <connection_name> ipv4.may-fail <value>
    Copy to Clipboard

    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

第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 優先度パラメーターのデフォルト値 を参照してください。

    • 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 サーバーへ転送します。

DNS 優先度パラメーターのデフォルト値

NetworkManager は、接続に以下のデフォルト値を使用します。

  • VPN 接続の場合は 50
  • 他の接続の場合は 100
有効な DNS 優先度の値:

グローバルのデフォルトおよび接続固有の 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
    2. [connection] セクションにカスタムのデフォルト値を追加します。たとえば、IPv4 と IPv6 の両方で新しいデフォルトを 200 に設定するには、以下を追加します。

      ipv4.dns-priority=200
      ipv6.dns-priority=200
      Copy to Clipboard

      パラメーターは、-2147483647 から 2147483647 までの値に設定できます。パラメーターを 0 に設定すると、組み込みのデフォルト (VPN 接続の場合は 50、他の接続の場合は 100) が有効になります。

  2. NetworkManager サービスを再読み込みします。

    # systemctl reload NetworkManager
    Copy to Clipboard

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
  2. ipv4.dns-priority パラメーターおよび ipv6.dns-priority パラメーターを設定します。たとえば、両方のパラメーターを 10 に設定するには、次のように入力します。

    # nmcli connection modify <connection_name> ipv4.dns-priority 10 ipv6.dns-priority 10
    Copy to Clipboard
  3. 必要に応じて、他のコネクションに対しても 1 つ前の手順を繰り返します。
  4. 更新した接続を再度アクティブにします。

    # nmcli connection up <connection_name>
    Copy to Clipboard

検証

  • /etc/resolv.conf ファイルの内容を表示して、DNS サーバーの順序が正しいことを確認します。

    # cat /etc/resolv.conf
    Copy to Clipboard

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
    2. 接続プロファイル 2 の場合は、次のように入力します。

      # nmcli connection modify <example-connection-2> ipv4.routed-dns yes
      Copy to Clipboard
  2. 接続を再度有効にします。

    # nmcli connection up <example-connection-1>
    
    # nmcli connection up <example-connection-2>
    Copy to Clipboard

検証

  • 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

    このコマンドは、ネームサーバーに正しいインターフェイス経由でアクセスしているかどうかを確認し、DNS サーバーのすべてのルートを特別なルーティングテーブル 20053 に配置するポリシールーティングメソッドを使用します。

第18章 NetworkManager で dnsmasq を使用して、特定のドメインの DNS リクエストを選択した DNS サーバーに送信する

デフォルトでは、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 サーバーおよび検索ドメインは、特定のドメインを解決する NetworkManager 接続プロファイルで設定されます。

    たとえば、VPN 接続で指定された DNS サーバーが example.com ドメインのクエリーを解決するようにするには、VPN 接続プロファイルに以下の設定が含まれている必要があります。

    • example.com を解決できる DNS サーバー
    • ipv4.dns-search および ipv6.dns-search パラメーターで example.com に設定された検索ドメイン
  • dnsmasq サービスが実行されていないか、localhost とは異なるインターフェイスでリッスンするように設定されています。

手順

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

    # dnf install dnsmasq
    Copy to Clipboard
  2. /etc/NetworkManager/NetworkManager.conf ファイルを編集し、[main] セクションに以下のエントリーを設定します。

    dns=dnsmasq
    Copy to Clipboard
  3. NetworkManager サービスを再読み込みします。

    # systemctl reload NetworkManager
    Copy to Clipboard

検証

  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
  2. tcpdump パケットスニファを使用して、DNS 要求の正しいルートを確認します。

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

      # dnf install tcpdump
      Copy to Clipboard
    2. 1 つのターミナルで tcpdump を起動し、すべてのインターフェイスで DNS トラフィックを取得します。

      # tcpdump -i any port 53
      Copy to Clipboard
    3. 別のターミナルで、例外が存在するドメインと別のドメインのホスト名を解決します。次に例を示します。

      # host -t A www.example.com
      # host -t A www.redhat.com
      Copy to Clipboard
    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

      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

    エントリーがない場合は、/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

    サービスが 127.0.0.1:53 をリッスンしていない場合は、NetworkManager ユニットのジャーナルエントリーを確認します。

    # journalctl -u NetworkManager
    Copy to Clipboard

第19章 ファイルシステムに保存されている証明書で 802.1X 標準を使用したネットワークへの RHEL クライアントの認証

管理者は、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

    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
  3. 証明書で使用するユーザーの ID を設定します。

    # nmcli connection modify enp1s0 802-1x.identity user@example.com
    Copy to Clipboard
  4. オプション: 設定にパスワードを保存します。

    # nmcli connection modify enp1s0 802-1x.private-key-password password
    Copy to Clipboard
    重要

    デフォルトでは、NetworkManager はディスク上の接続プロファイルにパスワードをクリアテキストで保存します。このファイルを読み取ることができるのは root ユーザーだけです。ただし、設定ファイルのクリアテキストパスワードはセキュリティーリスクとなる可能性があります。

    セキュリティーを強化するには、802-1x.password-flags パラメーターを agent-owned に設定します。この設定では、GNOME デスクトップ環境または nm-applet が実行中のサーバーで、NetworkManager はキーリングのロックを解除してから、これらのサービスからパスワードを取得します。その他の場合は、NetworkManager によりパスワードの入力が求められます。

  5. 接続プロファイルをアクティベートします。

    # nmcli connection up enp1s0
    Copy to Clipboard

検証

  • ネットワーク認証が必要なネットワーク上のリソースにアクセスします。

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

    これらの設定では、次の設定を使用して 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

検証

  • ネットワーク認証が必要なネットワーク上のリソースにアクセスします。

19.3. network RHEL システムロールを使用した 802.1X ネットワーク認証による静的イーサネット接続の設定

ネットワークアクセス制御 (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
    2. ansible-vault create コマンドでエディターが開いたら、機密データを <key>: <value> 形式で入力します。

      pwd: <password>
      Copy to Clipboard
    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

    サンプル 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

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

  4. Playbook を実行します。

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

検証

  • ネットワーク認証が必要なネットワーク上のリソースにアクセスします。

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
    2. ansible-vault create コマンドでエディターが開いたら、機密データを <key>: <value> 形式で入力します。

      pwd: <password>
      Copy to Clipboard
    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

    サンプル 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

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

  4. Playbook を実行します。

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard

第20章 hostapd と FreeRADIUS バックエンドを使用した LAN クライアント用の 802.1x ネットワーク認証サービスのセットアップ

IEEE 802.1X 標準では、許可されていないクライアントからネットワークを保護するためのセキュアな認証および認可方法を定義しています。hostapd サービスと FreeRADIUS を使用すると、ネットワークにネットワークアクセス制御 (NAC) を提供できます。

注記

Red Hat では、認証のバックエンドソースとして Red Hat Identity Management (IdM) を使用した FreeRADIUS のみをサポートしています。

このドキュメントでは、RHEL ホストは、さまざまなクライアントを既存のネットワークに接続するためのブリッジとして機能します。ただし、RHEL ホストは、認証されたクライアントのみにネットワークへのアクセスを許可します。

rhel オーセンティケーター 8021x

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
  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
  3. ブリッジが拡張認証プロトコル over LAN (EAPOL) パケットを転送できるようにします。

    # nmcli connection modify br0 group-forward-mask 8
    Copy to Clipboard
  4. ブリッジデバイスで Spanning Tree Protocol (STP) を無効にします。

    # *nmcli connection modify br0 stp off"
    Copy to Clipboard
  5. ポートを自動的にアクティブ化するように接続を設定します。

    # nmcli connection modify br0 connection.autoconnect-ports 1
    Copy to Clipboard
  6. 接続をアクティベートします。

    # nmcli connection up br0
    Copy to Clipboard

検証

  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
  2. EAPOL パケットの転送が br0 デバイスで有効になっているかどうかを確認します。

    # cat /sys/class/net/br0/bridge/group_fwd_mask
    0x8
    Copy to Clipboard

    コマンドが 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

    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
  3. Diffie-Hellman (DH) パラメーターを使用して /etc/raddb/certs/dh ファイルを作成します。たとえば、2048 ビットの素数を持つ DH ファイルを作成するには、次のように実行します。

    # openssl dhparam -out /etc/raddb/certs/dh 2048
    Copy to Clipboard

    セキュリティー上の理由から、素数が 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
    2. eap ディレクティブの default_eap_type パラメーターを ttls に設定します。

      eap {
          ...
          default_eap_type = ttls
          ...
      }
      Copy to Clipboard
    3. 安全でない EAP-MD5 認証方式を無効にするには、md5 ディレクティブをコメントアウトします。

      eap {
          ...
          # md5 {
          # }
          ...
      }
      Copy to Clipboard

      デフォルトの設定ファイルでは、他の安全でない 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

    これにより、外部認証で 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
    2. authenticate ディレクティブ内の LDAP 認証タイプのコメントを解除します。

      authenticate {
          Auth-Type LDAP {
              ldap
          }
      }
      Copy to Clipboard
  7. ldap モジュールを有効にします。

    # ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
    Copy to Clipboard
  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

      FreeRADIUS ホストと IdM サーバー間で TLS 暗号化接続を使用するには、サーバー URL に ldaps プロトコルを指定します。

    2. ldap ディレクティブで、IdM LDAP サーバーの TLS 証明書検証を有効にします。

      tls {
          ...
              require_cert = 'demand'
          ...
      }
      Copy to Clipboard
  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
    2. ネットワークオーセンティケーターのクライアントディレクティブを追加します。

      client hostapd.example.org {
          ipaddr = 192.0.2.2/32
          secret = hostapd_client_password
      }
      Copy to Clipboard
    3. オプション: 他のホストも FreeRADIUS サービスにアクセスできるようにするには、それらのホストにもクライアントディレクティブを追加します。以下に例を示します。

      client <hostname_or_description> {
          ipaddr = <IP_address_or_range>
          secret = <client_password>
      }
      Copy to Clipboard

      ipaddr パラメーターは IPv4 および IPv6 アドレスを受け入れ、オプションのクラスレスドメイン間ルーティング (CIDR) 表記を使用して範囲を指定できます。ただし、このパラメーターに設定できる値は 1 つだけです。たとえば、IPv4 アドレスと IPv6 アドレスの両方へのアクセスを許可するには、2 つのクライアントディレクティブを追加する必要があります。

      ホスト名や IP 範囲が使用される場所を説明する単語など、クライアントディレクティブのわかりやすい名前を使用します。

  10. 設定ファイルを確認します。

    # radiusd -XC
    ...
    Configuration appears to be OK
    Copy to Clipboard
  11. firewalld サービスで RADIUS ポートを開きます。

    # firewall-cmd --permanent --add-service=radius
    # firewall-cmd --reload
    Copy to Clipboard
  12. radiusd サービスを有効にして開始します。

    # systemctl enable --now radiusd
    Copy to Clipboard

トラブルシューティング

  • radiusd サービスの起動に失敗した場合は、IdM サーバーのホスト名を解決できることを確認します。

    # host -v idm_server.idm.example.com
    Copy to Clipboard
  • その他の問題が発生した場合は、radiusd をデバッグモードで実行します。

    1. radiusd サービスを停止します。

      # systemctl stop radiusd
      Copy to Clipboard
    2. デバッグモードでサービスを開始します。

      # radiusd -X
      ...
      Ready to process requests
      Copy to Clipboard
    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

    この設定で使用されるパラメーターの詳細は、/usr/share/doc/hostapd/hostapd.conf サンプル設定ファイルの説明を参照してください。

  2. hostapd サービスを有効にして開始します。

    # systemctl enable --now hostapd
    Copy to Clipboard

トラブルシューティング

  • hostapd サービスの起動に失敗した場合は、/etc/hostapd/hostapd.conf ファイルで使用するブリッジインターフェイスがシステム上に存在することを確認します。

    # ip link show br0
    Copy to Clipboard
  • その他の問題が発生した場合は、hostapd をデバッグモードで実行します。

    1. hostapd サービスを停止します。

      # systemctl stop hostapd
      Copy to Clipboard
    2. デバッグモードでサービスを開始します。

      # hostapd -d /etc/hostapd/hostapd.conf
      Copy to Clipboard
    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
  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
  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

      -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

      -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
  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
  3. systemd を再ロードします。

    # systemctl daemon-reload
    Copy to Clipboard
  4. hostapd がリッスンしているインターフェイス名で 802-1x-tr-mgmt サービスを有効にして開始します。

    # systemctl enable --now 802-1x-tr-mgmt@br0.service
    Copy to Clipboard

検証

第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
警告

パラメーターの入力や配置を誤ると、予期しない動作が発生する可能性があります。したがって、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
    注記

    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
  3. NetworkManager 接続をリロードします。

    # nmcli connection reload
    Copy to Clipboard
  4. プロファイルの autoconnect 変数を false に設定した場合は、コネクションをアクティブにします。

    # nmcli connection up Example-Connection
    Copy to Clipboard

検証

  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
  2. NetworkManager が設定ファイルからプロファイルを読み込めることを確認します。

    # nmcli -f TYPE,FILENAME,NAME connection
    TYPE      FILENAME                                                     NAME
    ethernet  /etc/NetworkManager/system-connections/example.nmconnection  Example-Connection
    ...
    Copy to Clipboard

    新しく作成された接続が出力に表示されない場合は、使用したキーファイルのパーミッションと構文が正しいことを確認してください。

  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

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
    注記

    ファイル名には、.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
  3. 接続プロファイルを再読み込みします。

    # nmcli connection reload
    Copy to Clipboard
  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

    このコマンドで、新しく追加した接続が表示されない場合は、ファイルの権限と、ファイルで使用した構文が正しいことを確認します。

  5. プロファイルの autoconnect 変数を false に設定した場合は、コネクションをアクティブにします。

    # nmcli connection up Example-Connection
    Copy to Clipboard

検証

  • 接続プロファイルを表示します。

    # nmcli connection show Example-Connection
    Copy to Clipboard

第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: アクティベーションを遅延します。

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
  2. 以下を入力し、変更を保存します。

    [Unit]
    After=network-online.target
    Copy to Clipboard
  3. systemd サービスを再度読み込みます。

    # systemctl daemon-reload
    Copy to Clipboard

22.4. アクティブなネットワーク接続を確保するために IP アドレスの ping ターゲットを設定する

システムの起動後に 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
    注記

    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

    ipv4.may-fail 属性を no に設定すると、確実に IPv4 設定が正常に完了します。

  3. 接続を再度有効にします。

    # nmcli connection up enp1s0
    Copy to Clipboard

第23章 Nmstate の概要

nmstate は宣言型のネットワークマネージャー API です。Nmstate を使用する場合、YAML または JSON 形式の命令を使用して想定されるネットワーク状態を記述します。

Nmstate には多くの利点があります。たとえば、以下のようになります。

  • 安定性と拡張可能なインターフェイスを提供して RHEL ネットワーク機能を管理する。
  • ホストおよびクラスターレベルでのアトミックおよびトランザクション操作をサポートする。
  • ほとんどのプロパティーの部分編集をサポートし、この手順で指定されていない既存の設定を保持する。

Nmstate は次のパッケージで構成されています。

パッケージ内容

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

このライブラリーを使用するには、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

23.2. nmstatectl を使用した現在のネットワーク設定の更新

nmstatectl ユーティリティーを使用して、1 つまたはすべてのインターフェイスの現在のネットワーク設定をファイルに保存できます。このファイルを使用して、以下を行うことができます。

  • 設定を変更し、同じシステムに適用します。
  • 別のホストにファイルをコピーし、同じまたは変更された設定でホストを設定します。

たとえば、enp1s0 インターフェイスの設定をファイルにエクスポートして、設定を変更し、その設定をホストに適用することができます。

前提条件

  • nmstate パッケージがインストールされている。

手順

  1. enp1s0 インターフェイスの設定を ~/network-config.yml ファイルにエクスポートします。

    # nmstatectl show enp1s0 > ~/network-config.yml
    Copy to Clipboard

    このコマンドにより、enp1s0 の設定が YAML 形式で保存されます。JSON 形式で出力を保存するには、--json オプションをコマンドに渡します。

    インターフェイス名を指定しない場合、nmstatectl はすべてのインターフェイスの設定をエクスポートします。

  2. テキストエディターで ~/network-config.yml ファイルを変更して、設定を更新します。
  3. ~/network-config.yml ファイルからの設定を適用します。

    # nmstatectl apply ~/network-config.yml
    Copy to Clipboard

    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

詳細およびその他の設定オプションについては、システムの 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 ブロックを使用します。

状態設定を含む 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
vars:
  network_connections:
    - name: enp7s0
      interface_name: enp7s0
      type: ethernet
      autoconnect: yes
      ip:
        dhcp4: yes
        auto6: yes
      state: up
Copy to Clipboard

たとえば、上記のように作成した動的 IP アドレス設定の接続ステータスのみを変更するには、Playbook で次の vars ブロックを使用します。

状態設定を含む Playbook

通常の Playbook

vars:
  network_state:
    interfaces:
    - name: enp7s0
      type: ethernet
      state: down
Copy to Clipboard
vars:
  network_connections:
    - name: enp7s0
      interface_name: enp7s0
      type: ethernet
      autoconnect: yes
      ip:
        dhcp4: yes
        auto6: yes
      state: down
Copy to Clipboard

第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
  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

      ワンショット ユニットは、各ブートプロセス中にネットワーク (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
  3. 接続のアグリゲーションに使用するすべての接続プロファイルで MPTCP を有効にします。

    # nmcli connection modify <profile_name> connection.mptcp-flags signal,subflow,also-without-default-route
    Copy to Clipboard

    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
  2. デフォルトでは不足する場合に備えて、サブフロー制限を適切に設定していることを確認します。

    # ip mptcp limit show
    add_addr_accepted 2 subflows 3
    Copy to Clipboard
  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

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
  2. mptcpd サービスを有効にして起動します。

    # systemctl enable --now mptcp.service
    Copy to Clipboard
  3. mptcpd サービスを手動で設定するには、/etc/mptcpd/mptcpd.conf 設定ファイルを変更します。

    mptcpd サービスが作成するエンドポイントは、ホストがシャットダウンするまで続くことに注意してください。

検証

  • エンドポイントの作成を確認します。

    # ip mptcp endpoint
    Copy to Clipboard

第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
  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
    • dropped: すべてのキューが満杯であるため、パケットがドロップされる回数
    • overlimits: 設定されたリンク容量が一杯になる回数
    • sent: デキューの数

25.3. デフォルトの qdisc の更新

現在の qdisc でネットワークパケットの損失を確認する場合は、ネットワーク要件に基づいて qdisc を変更できます。

手順

  1. 現在のデフォルト qdisc を表示します。

    # sysctl -a | grep qdisc
    net.core.default_qdisc = fq_codel
    Copy to Clipboard
  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
  3. 既存の qdisc を更新します。

    # sysctl -w net.core.default_qdisc=pfifo_fast
    Copy to Clipboard
  4. 変更を適用するには、ネットワークドライバーを再読み込みします。

    # modprobe -r NETWORKDRIVERNAME
    # modprobe NETWORKDRIVERNAME
    Copy to Clipboard
  5. ネットワークインターフェイスを起動します。

    # ip link set enp0s1 up
    Copy to Clipboard

検証

  • イーサネット接続の 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

25.4. tc ユーティリティーを使用してネットワークインターフェイスの現在の qdisc を一時的に設定する手順

デフォルトの qdisc を変更せずに、現在の qdisc を更新できます。

手順

  1. オプション: 現在の qdisc を表示します。

    # tc -s qdisc show dev enp0s1
    Copy to Clipboard
  2. 現在の qdisc を更新します。

    # tc qdisc replace dev enp0s1 root htb
    Copy to Clipboard

検証

  • 更新された現在の 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

25.5. NetworkManager を使用してネットワークインターフェイスの現在の qdisc を永続的に設定する

NetworkManager 接続の現在の qdisc 値を更新できます。

手順

  1. オプション: 現在の qdisc を表示します。

    # tc qdisc show dev enp0s1
      qdisc fq_codel 0: root refcnt 2
    Copy to Clipboard
  2. 現在の qdisc を更新します。

    # nmcli connection modify enp0s1 tc.qdiscs 'root pfifo_fast'
    Copy to Clipboard
  3. 必要に応じて、既存の qdisc に別の qdisc を追加するには、+tc.qdisc オプションを使用します。

    # nmcli connection modify enp0s1 +tc.qdisc 'ingress handle ffff:'
    Copy to Clipboard
  4. 変更を有効にします。

    # nmcli connection up enp0s1
    Copy to Clipboard

検証

  • ネットワークインターフェイスの現在の 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

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

      このコマンドには次のパラメーターがあります。

      name ifb4eth0
      新しい仮想デバイスインターフェイスを設定します。
      numtxqueues 48
      送信キューの数を設定します。
      numrxqueues 48
      受信キューの数を設定します。
      type ifb
      新しいデバイスのタイプを設定します。
    2. インターフェイスの状態を変更します。

      # ip link set dev ifb4eth0 up
      Copy to Clipboard
    3. 物理ネットワークインターフェイスに qdisc 属性を追加し、それを受信トラフィックに適用します。

      # tc qdisc add dev enp1s0 handle ffff: ingress
      Copy to Clipboard

      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

      このコマンドには次の属性があります。

      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

      このコマンドは、メジャー番号 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

      このコマンドには次のパラメーターがあります。

      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
    8. ファイアウォールマーク (fw) フィルターをインターフェイスに追加します。

      # tc filter add dev ifb4eth0 parent 1:0 protocol ip prio 100 handle 100 fw classid 1:100
      Copy to Clipboard
    9. 接続マーク (CONNMARK) からパケットのメタマークを復元します。

      # nft add rule ip mangle PREROUTING counter meta mark set ct mark
      Copy to Clipboard

      このコマンドでは、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
    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
    12. パケットマークを接続マークに保存します。

      # nft add rule ip mangle PREROUTING counter ct mark set mark
      Copy to Clipboard
    13. -s パラメーターを使用して、iperf3 ユーティリティーをシステム上のサーバーとして実行すると、サーバーはクライアント接続の応答を待ちます。

      # iperf3 -s
      Copy to Clipboard
  2. クライアント上で、iperf3 をクライアントとして実行し、IP アドレス 192.0.2.3 で定期的な HTTP 要求と応答のタイムスタンプをリッスンするサーバーに接続します。

    # iperf3 -c 192.0.2.3 | tee rate
    Copy to Clipboard

    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
  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

検証

  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
  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
  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

25.7. RHEL で利用できる qdiscs

qdisc は、ネットワーク関連の固有の問題に対応します。以下は、RHEL で利用可能な qdiscs のリストです。以下の qdisc を使用して、ネットワーク要件に基づいてネットワークトラフィックを形成できます。

表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

検証

  1. libibverbs-utils および infiniband-diags パッケージをインストールします。

    # dnf install libibverbs-utils infiniband-diags
    Copy to Clipboard
  2. 利用可能な InfiniBand デバイスのリストを表示します。

    # ibv_devices
    
        mlx5_0          	946dae0300418002
        mlx5_1          	946dae0300418003
    Copy to Clipboard
  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
  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
  5. ibping ユーティリティーは、パラメーターを設定することで InfiniBand アドレスに ping を実行し、クライアント/サーバーとして動作します。

    1. ホスト上で InfiniBand チャネルアダプター (CA) 名 -C を指定し、ポート番号 -P でサーバーモード -S を開始します。

      # ibping -S -C mlx5_0 -P 1
      Copy to Clipboard
    2. ホスト上でローカル識別子 (LID) -L および InfiniBand チャネルアダプター (CA) 名 -C を指定し、ポート番号 -P でクライアントモードを開始して、パケット -c をいくつか送信します。

      # ibping -c 50 -C mlx5_0 -P 1 -L 2
      Copy to Clipboard

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
  2. P_Key を設定します。次に例を示します。

    # nmcli connection modify mlx5_ib0 infiniband.p-key 0x8002
    Copy to Clipboard
  3. IPv4 を設定します。

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

      # nmcli connection modify mlx5_ib0 ipv4.method auto
      Copy to Clipboard

      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
  4. IPv6 設定を行います。

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

      # nmcli connection modify mlx5_ib0 ipv6.method auto
      Copy to Clipboard

      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
  5. プロファイルの他の設定をカスタマイズするには、次のコマンドを使用します。

    # nmcli connection modify mlx5_ib0 <setting> <value>
    Copy to Clipboard

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

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

    # nmcli connection up mlx5_ib0
    Copy to Clipboard

検証

  • ping ユーティリティーを使用して、ICMP パケットをリモートホストの InfiniBand アダプターに送信します。次に例を示します。

    # ping -c5 192.0.2.2
    Copy to Clipboard

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

    サンプル 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

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

  3. Playbook を実行します。

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard

検証

  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
  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
  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

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

    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

検証

  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
  2. mlx5_ib0.8002 デバイスのパーティションキー (P_Key) を表示します。

    # cat /sys/class/net/mlx5_ib0.8002/pkey
    0x8002
    Copy to Clipboard
  3. mlx5_ib0.8002 デバイスのモードを表示します。

    # cat /sys/class/net/mlx5_ib0.8002/mode
    datagram
    Copy to Clipboard

26.3.7. IPoIB の設定後に iperf3 を使用して RDMA ネットワークをテストする

次の例では、大きなバッファーサイズを使用して、60 秒のテストを実行し、最大スループットを測定します。iperf3 ユーティリティーを使用して 2 つのホスト間の帯域幅とレイテンシーを十分に使用します。

前提条件

  • 両方のホストで IPoIB を設定している。

手順

  1. iperf3 をシステム上のサーバーとして実行するには、時間の間隔を定義して、定期的な帯域幅の更新 -i を指定し、クライアント接続の応答を待機するサーバー -s としてリッスンします。

    # iperf3 -i 5 -s
    Copy to Clipboard
  2. iperf3 を別のシステムでクライアントとして実行するには、時間の間隔を定義して、定期的な帯域幅の更新 -i を指定し、-t 秒使用して IP アドレス 192.168.2.2 のリスニングサーバー -c に接続します。

    # iperf3 -i 5 -t 60 -c 192.168.2.2
    Copy to Clipboard
  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
    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

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
  2. デフォルトの RoCE モードを表示します。

    # cat /sys/kernel/config/rdma_cm/mlx5_0/ports/1/default_roce_mode
    
    RoCE v2
    Copy to Clipboard
  3. デフォルトの RoCE モードをバージョン 1 に変更します。

    # echo "IB/RoCE v1" > /sys/kernel/config/rdma_cm/mlx5_0/ports/1/default_roce_mode
    Copy to Clipboard

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

検証

  1. /etc/security/limits.conf ファイルの編集後、rdma グループのメンバーとしてログインします。

    Red Hat Enterprise Linux は、ユーザーのログイン時に、更新された ulimit の設定を適用することに注意してください。

  2. ulimit -l コマンドを使用して制限を表示します。

    $ ulimit -l
    unlimited
    Copy to Clipboard

    コマンドが 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
  2. パッケージがすでにインストールされている場合は、/etc/rdma/modules/rdma.conf ファイル内の xprtrdma および svcrdma モジュールのコメントが解除されていることを確認します。

    # NFS over RDMA client support
    xprtrdma
    # NFS over RDMA server support
    svcrdma
    Copy to Clipboard
  3. オプション: デフォルトでは、NFS over RDMA はポート 20049 を使用します。別のポートを使用する場合は、/etc/nfs.conf ファイルの [nfsd] セクションで rdma-port 設定を指定します。

    rdma-port=<port>
    Copy to Clipboard
  4. firewalld で NFSoRDMA ポートを開きます。

    # firewall-cmd --permanent --add-port={20049/tcp,20049/udp}
    # firewall-cmd --reload
    Copy to Clipboard

    20049 以外のポートを設定する場合は、ポート番号を変更します。

  5. nfs-server サービスを再起動します。

    # systemctl restart nfs-server
    Copy to Clipboard

検証

  1. InfiniBand ハードウェアを搭載したクライアントで、次の手順を実行します。

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

      # dnf install nfs-utils rdma-core
      Copy to Clipboard
    2. エクスポートされた NFS 共有を RDMA 経由でマウントします。

      # mount -o rdma server.example.com:/nfs/projects/ /mnt/
      Copy to Clipboard

      デフォルト (20049) 以外のポート番号を設定する場合は、コマンドに port=<port_number> を渡します。

      # mount -o rdma,port=<port_number> server.example.com:/nfs/projects/ /mnt/
      Copy to Clipboard
    3. rdma オプションを使用して共有がマウントされたことを確認します。

      # mount | grep "/mnt"
      server.example.com:/nfs/projects/ on /mnt type nfs (...,proto=rdma,...)
      Copy to Clipboard

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