Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Ubuntu EC2 インスタンスでセカンダリネットワークインターフェイスを動作させる方法を教えてください。
Ubuntu Amazon Elastic Compute Cloud (Amazon EC2) インスタンスでセカンダリネットワークインターフェイスを動作させたいです。
簡単な説明
**警告:**セカンダリエラスティックネットワークインターフェイスの使用は、上級ユーザーが意図されています。この解決策は、次のユースケースにのみ使用してください。 単一のネットワークインターフェースは使用できません。同じサブネットの 2 つのネットワークインターフェイスを単一のインスタンスにアタッチする必要があります。非対称ルーティングの問題を回避するには、単一のエラスティックネットワークインターフェイスを使用するか、重複しないサブネットに重複するエラスティックネットワークインターフェイスを配置します。または、Ubuntu 24.04 LTS 以降を使用します。
Amazon Linux EC2 インスタンス以外のインスタンスにセカンダリネットワークインターフェイスを追加すると、トラフィックフローの問題が発生します。これらの問題は、プライマリネットワークインターフェイスとセカンダリネットワークインターフェイスが同じサブネットにあり、ルーティングテーブルとゲートウェイが 1 つずつあるために発生します。セカンダリネットワークインターフェイスに入ってくるトラフィックは、プライマリネットワークインターフェイスを使用してインスタンスを離れます。セカンダリ IP アドレスはプライマリネットワークインターフェイスの MAC アドレスに属していないため、セカンダリインターフェイスは動作しません。
**注:**以下の手順は Ubuntu 24.04 では必要ありません。Ubuntu 24.04では、この高度な設定が自動的に処理されます。
作成後にセカンダリインターフェイスを動作させるには、次の手順を実行します。
- ルーティングテーブルを設定します。
- セカンダリインターフェイスのトラフィックが新しいルーティングテーブルを使用するように、カスタムルーティングテーブルポリシーデータベースにルールを設定します。
始める前に、Amazon EC2 インスタンスは AWS クラウド内にあるため、複数のインターフェイスを使用することで、すべてのユースケースでメリットが得られるわけではないことに注意してください。次の例は、セカンダリネットワークインターフェイスを使用する必要がない場合を示しています。
- ネットワークスループットを向上させるには 制限はインスタンスのタイプとサイズに基づいて設定されるため、ネットワークスループットは向上しません。詳細については、「Amazon EC2 インスタンスタイプ」を参照してください。
- Elastic IP アドレスを増やす方法を次に示します。 ほとんどのアプリケーションは DNS で正常に動作するため、インスタンスに Elastic IP アドレスを追加する必要はありません。例えば、Apache は名前ベースの仮想ホストを使用できます。詳細については、Apache のウェブサイトで「名前ベースのバーチャルホストのサポート」を参照してください。
**注:**セカンダリネットワークインターフェイスを追加する手順は、次の Ubuntu バージョンごとに異なります。
- Ubuntu 14.04
- Ubuntu 16.04
- Ubuntu 18.04
- Ubuntu 20.04
- Ubuntu 22.04
解決策
注: 以下の解決策の手順は、記載されている Linux バージョンでテストされていますが、構成のカスタム設定を変更する必要がある場合があります。すべてのプロシージャは、ルートユーザーのアクセス許可で実行する必要があります。sudo-i でルートユーザーになるか、sudo ですべてのコマンドを実行します。
Ubuntu 14.04 または 16.04 の設定
1 つのファイルを使用してセカンダリインターフェイス設定ファイルを作成し、ルーティングテーブルを設定してから Ubuntu のルーティングポリシールールを設定できます。
Ubuntu 14.04 または 16.04 を設定するには、以下の手順を実行してください。
-
プライマリネットワークインターフェイスの名前を取得するには、次のコマンドを実行します。
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**重要:**前の例では、プライマリインターフェイスに eth0、eth1 などの名前が付けられています。ただし、m4 や m5 ファミリタイプなどの拡張ネットワーキングをサポートするインスタンスでは、名前が一致しないことがあります。例えば、セカンダリの名前が eth0 の場合、プライマリは ens3 という名前になります。この名前の不一致は、インスタンスの実行中にセカンダリインターフェイスを追加した場合に発生します。名前の不一致を避けるには、起動時にインターフェイスを追加するか、インスタンスを再起動します。または、インターフェイスが実行中の場合は、次のコマンドを使用して名前を変更します。
ip link set eth0 name ens4 ip link set ens4 up ip link show ens4 --->verify -
セカンダリインターフェイス用の設定ファイルを作成します。
vi /etc/network/interfaces.d/51-eth1.cfg**注:**セカンダリインターフェイス名と一致するように eth1 を変更します。
次のコマンドは、単一の IP アドレスが 172.31.21.115 で、セカンダリインターフェイスのゲートウェイが 172.31.16.1 である場合の例です。
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 アドレスである必要があります。
次のコマンドは、複数の IP アドレスの例です。この例では、IP アドレスが 172.31.21.115 と 172.31.18.46 で、ゲートウェイが 172.31.16.1です。
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**注:**例の IP アドレスとゲートウェイは、ご自身の情報に置き換えてください。
-
restrict-default-gw ファイルを作成して、デフォルトのゲートウェイがメインテーブルで上書きされないようにします。
vi /etc/dhcp/dhclient-enter-hooks.d/restrict-default-gw -
restrict-default-gw ファイルに次の行を追加します。
case ${interface} in eth0) ;; *) unset new_routers ;; esac**注:**eth0 は、プライマリインターフェイスの名前に置き換えてください。
-
ネットワークを再起動します。
Ubuntu 14.04 の場合は、以下のコマンドを実行します。
(ifdown eth1 && ifup eth1)Ubuntu 16.04 の場合は、以下のコマンドを実行します。
systemctl restart networking
Ubuntu 18.04、20.04、22.04 を設定する
Ubuntu 18.04、20.04、22.04 は、Netplan のネットワーク設定を使用しています。Netplan は YAML 形式を使用していることに注意してください。この形式ではインデントが重要です。次の Netplan の例では、2 スペースインデントを使用しています。
Ubuntu 18.04、20.04、22.04を設定するには、次の手順を実行してください。
-
セカンダリインターフェイス用の設定ファイルを作成します。
vi /etc/netplan/51-eth1.yaml -
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 範囲を確認するには、次の手順を実行します。
- Amazon EC2 コンソールを開き、[インスタンス] を選択してインスタンスを選択します。
- [ネットワーキング] タブで [ネットワークインターフェイス] までスクロールし、セカンダリネットワークインターフェイスのサブネット ID を書き留めます。
- Amazon Virtual Private Cloud (Amazon VPC) コンソールを開いて [サブネット] を選択し、サブネット ID にリストされている IPv4 CIDR 範囲を書き留めます。
- ネットワーク設定を適用するには、次のコマンドを実行します。
netplan --debug apply

