Ubuntu EC2 インスタンスでセカンダリネットワークインターフェイスを動作させるにはどうすればよいですか?

所要時間3分
0

Ubuntu Amazon Elastic Compute Cloud (Amazon EC2) インスタンスでセカンダリネットワークインターフェイスを動作させたいと考えています。

簡単な説明

警告: 2 つ目の Elastic Network Interface の使用は、上級ユーザーを対象としたものです。この手順は、単一のネットワークインターフェイスを使用できず、同じサブネットからの 2 つのネットワークインターフェイスを 1 つのインスタンスにアタッチする必要がある場合以外は実行しないでください。非対称ルーティングの問題を回避するには、単一の Elastic Network Interface を使用するか、オーバーラップしないサブネットに重複する Elastic Network Interface を設定してください。

Amazon Linux EC2 インスタンス以外のインスタンスに、セカンダリネットワークインターフェイスを追加すると、トラフィックフローの問題が発生します。これらの問題が発生するのは、プライマリとセカンダリのネットワークインターフェイスが同じサブネットにあり、ルーティングテーブルとゲートウェイが、それぞれ 1 つしかないためです。セカンダリネットワークインターフェイスに入ったトラフィックは、インスタンスの通過に、プライマリネットワークインターフェイスを使用します。ただし、セカンダリ IP アドレスがプライマリネットワークインターフェイスの MAC アドレスに属していないため、これは許可されていません。

セカンダリインターフェイスを作成後に動作させるには、以下の手順を実行します。

1.    ルーティングテーブルを設定します。

2.    カスタムルーティングテーブルポリシーデータベースにルールを設定して、セカンダリインターフェイスのトラフィックが新しいルーティングテーブルを使用するようにします。

手順を開始する前に、Amazon EC2 インスタンスが AWS クラウド内にあることに注意してください。これは、すべてのユースケースが複数のインターフェイスからメリットを得られるわけではないことを意味します。以下は、セカンダリネットワークインターフェイスを使用する必要がない可能性がある状況を示す例です。

  • ネットワークスループットの向上: 制限はインスタンスのタイプとサイズに基づいて設定されるため、ネットワークスループットは向上しません。詳細については、「Amazon EC2 インスタンスタイプ」を参照してください。
  • Elastic IP アドレスの増加: インターフェイスあたりの Elastic IP アドレスの数が少ない場合でも、Elastic IP アドレスを増やすためにインターフェイスを追加する必要はない可能性があります。ほとんどのアプリケーションは、ドメインネームシステムでうまく動作します。例えば、Apache は名前ベースのバーチャルホスト (Apache ウェブサイト上) を使用できます。

注意: セカンダリネットワークインターフェイスを追加する手順は、以下の Ubuntu バージョンごとに異なります。

  • Ubuntu 14.04
  • Ubuntu 16.04
  • Ubuntu 18.04
  • Ubuntu 20.04

解決方法

注意: 以下の解決方法の手順は、リストされている Linux バージョンでテストされたものですが、構成のカスタム設定に応じて若干の変更が必要になる場合があります。

Ubuntu 14.04 または 16.04 の設定

単一のファイルを使用して、セカンダリインターフェイス設定ファイルの作成、ルーティングテーブルの設定、および Ubuntu のルーティングポリシールールの設定を実行することができます。

すべての手順は、ルートユーザー権限を用いて実行する必要があります。sudo -i でルートユーザー権限を獲得するか、sudo ですべてのコマンドを実行してください。

1.     プライマリネットワークインターフェイスの名前を取得するには、以下のコマンドを実行します。

ip a | grep ^[[:digit:]]

以下のメッセージに似た出力を受け取ります。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

重要: この例では、プライマリインターフェイスが eth0eth1 といった順序で命名されていますが、m4 および m5 ファミリータイプなどの拡張ネットワークをサポートするインスタンスでは、名前に整合性がない場合があります。例えば、セカンダリの名前が eth0 の場合にプライマリの名前が ens3 になっていることがあります。この名前の非整合性は、インスタンスの実行中にセカンダリインターフェイスを追加する場合に発生します。

名前の非整合性を回避するには、起動時にインターフェイスを追加するか、インスタンスを再起動します。または、インターフェイスが実行中の場合には、以下のコマンドを使用して名前を変更することができます。

ip link set eth0 name ens4 && ip link set ens4 up

2.    セカンダリインターフェイスの設定ファイルを作成します。以下の例では、eth1 を、ステップ 1 で取得したセカンダリインターフェイス名と一致するように変更してください。

vi /etc/network/interfaces.d/51-eth1.cfg

以下のコマンドは、セカンダリインターフェイスの単一の IP アドレスが 172.31.21.115、ゲートウェイが 172.31.16.1 になっている例です。この例の IP アドレスとゲートウェイは、独自の IP アドレスとゲートウェイに置き換えてください。また、ゲートウェイがサブネット内の最初の有効な IP アドレスである必要があることにも注意してください。

auto eth1
iface eth1 inet static 
address 172.31.21.115
netmask 255.255.240.0

# Gateway configuration
up ip route add default via 172.31.16.1 dev eth1 table 1000

# Routes and rules
up ip route add 172.31.21.115 dev eth1 table 1000
up ip rule add from 172.31.21.115 lookup 1000

以下のコマンドは、複数の IP アドレスの例です。この例では、IP アドレスが 172.31.21.115 と 172.31.18.46 で、ゲートウェイが 172.31.16.1 です。この例の IP アドレスとゲートウェイは、独自の IP アドレスとゲートウェイに置き換えてください。

auto eth1

# Enter one or more IP settings
iface eth1 inet static
address 172.31.21.115
netmask 255.255.240.0

iface eth1 inet static
address 172.31.18.46
netmask 255.255.240.0

# Default gateway for eth1
up ip route add default via 172.31.16.1 dev eth1 table 1000

# A route for every IP
up ip route add 172.31.21.115 dev eth1 table 1000
up ip route add 172.31.18.46 dev eth1 table 1000

# A policy rule for every IP
up ip rule add from 172.31.21.115 lookup 1000
up ip rule add from 172.31.18.46 lookup 1000

3.    デフォルトゲートウェイがメインテーブルに上書きされないようにするには、restrict-default-gw ファイルを作成します。

vi /etc/dhcp/dhclient-enter-hooks.d/restrict-default-gw

4.    restrict-default-gw ファイルに以下の行を追加します。eth0 は、ステップ 1 で取得したプライマリインターフェイス名に変更するようにしてください。

case ${interface} in
  eth0)
    ;;
  *)
    unset new_routers
    ;;
esac

5.    ネットワークを再起動します。

Ubuntu 14.04 については、以下のコマンドを参照してください。

(ifdown eth1 && ifup eth1)

Ubuntu 16.04 については、以下のコマンドを参照してください。

systemctl restart networking

Ubuntu 18.04 と 20.04 の設定

Ubuntu 18.04 および 20.04 は、Netplan ネットワーク設定を使用します。Netplan は YAML 形式を使用することに注意してください。これは、インデントがきわめて重要になることを意味します。以下の Netplan 例は、2 スペースのインデントを使用しています。

注意: すべてのコマンドは、ルートユーザー権限を用いて実行してください。sudo -i でルートユーザーになるか、sudo ですべてのコマンドを実行してください。

1.    セカンダリインターフェイスの設定ファイルを作成します。

vi /etc/netplan/51-eth1.yaml

2.    51-eth1.yaml ファイルに次の行を追加します。以下の例は、ユースケースに合わせて編集するようにしてください。

network:
  version: 2
  renderer: networkd
  ethernets:
    eth1:
      addresses:
       - 172.31.24.153/20
       - 172.31.28.195/20
      dhcp4: no
      routes:
       - to: 0.0.0.0/0
         via: 172.31.16.1 # Default gateway
         table: 1000
       - to: 172.31.24.153
         via: 0.0.0.0
         scope: link
         table: 1000
       - to: 172.31.28.195
         via: 0.0.0.0
         scope: link
         table: 1000
      routing-policy:
        - from: 172.31.24.153
          table: 1000
        - from: 172.31.28.195
          table: 1000

この YAML ファイル例は、セカンダリインターフェイス (eth1) に 2 つの IP アドレスを設定します。

注意: YAML ファイルで使用する CIDR 範囲を見つけるには、以下の手順を実行します。

1.    Amazon EC2 コンソールを開き、[Instances] (インスタンス) をクリックしてから、対象のインスタンスを選択します。

2.    [Networking] (ネットワーキング) タブで [Network interfaces] (ネットワークインターフェイス) までスクロールし、セカンダリネットワークインターフェイスのサブネット ID をメモします。

3.    Amazon Virtual Private Cloud (Amazon VPC) コンソールを開き、[Subnets] (サブネット) を選択してから、サブネット ID にリストされている IPv4 CIDR 範囲をメモします。

4.    ネットワーク設定を適用します。

netplan --debug apply

関連情報

Configure route tables (ルートテーブルを設定する)

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ