Ubuntu EC2 インスタンスでセカンダリネットワークインターフェイスを動作させるにはどうすればよいですか?
最終更新日: 2022 年 9 月 9 日
Ubuntu Amazon Elastic Compute Cloud (Amazon EC2) インスタンスでセカンダリネットワークインターフェイスを動作させる方法を教えてください。
簡単な説明
警告: セカンダリの Elastic Network Interface の使用は、上級ユーザーを対象としたものです。セカンダリ Elastic Network Interface は、ネットワークインターフェイスを単独で使用できない場合で、同じサブネットに属する 2 つのネットワークインターフェイスを、1 つのインスタンスにアタッチする必要がある場合にのみ使用してください。非対称ルーティングの問題を回避するには、1 つの Elastic Network Interface を使用するか、2 つの Elastic Network Interface をオーバーラップしないサブネット間に分けて配置します。
Amazon Linux EC2 インスタンス以外のインスタンスに、セカンダリネットワークインターフェイスを追加すると、トラフィックフローの問題が発生します。これらの問題が発生するのは、プライマリとセカンダリのネットワークインターフェイスが同じサブネットにあり、ルーティングテーブルとゲートウェイが、それぞれ 1 つしかないためです。セカンダリネットワークインターフェイスに入ったトラフィックは、インスタンスの通過に、プライマリネットワークインターフェイスを使用します。ただし、セカンダリ IP アドレスがプライマリネットワークインターフェイスの MAC アドレスに属していないため、これは許可されていません。
セカンダリインターフェイスを作成後に動作させるには、次の手順を実行します。
- ルーティングテーブルを設定します。
- セカンダリインターフェイスのトラフィックが新しいルーティングテーブルを使用するように、カスタムルーティングテーブルポリシーデータベースのルールを設定します。
この作業を開始する前に、Amazon EC2 インスタンスが AWS クラウドにあることを認識してください。そのため、複数のインターフェイスを使用することのメリットを、すべてのユースケースが享受できるわけではありません。セカンダリネットワークインターフェイスを使用する必要がない場合の例を、次に示します。
- ネットワークスループットの増加について。インスタンスタイプとサイズに基づいて上限が設定されているので、ネットワークのスループットは増加しません。詳細については、「Amazon EC2 インスタンスタイプ」を参照してください。
- Elastic IP アドレスの追加について。インターフェイスごとの Elastic IP アドレスが不足している場合でも、そのアドレスを増やすために、必ずしもインターフェイスを追加する必要はありません。ほとんどのアプリケーションは、ドメインネームシステムでうまく動作します。例えば、Apache であれば、名前ベースの仮想ホストを使用できます。
注: セカンダリネットワークインターフェイスを追加する手順は、次に示す Ubuntu のバージョンごとに異なります。
- Ubuntu 14.04
- Ubuntu 16.04
- Ubuntu 18.04
- Ubuntu 20.04
解決方法
注意: ここに示す解決方法の手順は、表示した Linux バージョンでテスト済みですが、お客様固有の構成に応じて若干の変更が必要になる場合があります。
Ubuntu 14.04 または 16.04 の設定
セカンダリインターフェイス設定ファイルの作成、ルーティングテーブルの設定、および Ubuntu のルーティングポリシールールの設定は、1 つのファイルにより行うことができます。
すべての手順は、ルートユーザー権限で実行する必要があります。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
重要: 前出の例では、プライマリインターフェイスに付けられる名前は eth0、eth1 と続きます。ただし、m4 や m5 ファミリーのタイプなど、拡張されたネットワークをサポートするインスタンスでは、名前の不整合が発生することがあります。例えば、セカンダリの名前が eth0 の場合でも、プライマリの名前が ens3 となっていることがあります。こういった名前の不整合は、インスタンスの実行中にセカンダリインターフェイスが追加された場合に発生します。
インターフェイスの追加を起動時に行う、もしくはインスタンスを再起動することで、名前の不整合を回避できます。あるいは、インターフェイスの実行中でも、次のコマンドにより名前を変更することができます。
ip link set eth0 name ens4 && ip link set ens4 up
2. セカンダリインターフェイスの設定ファイルを作成します。この例では、「eth1」のセカンダリインターフェイスを使用します。手順 1 で見つけたセカンダリインターフェイス名と一致するように「eth1」を変更してください。
vi /etc/network/interfaces.d/51-eth1.cfg
以下は、172.31.21.115 という単一の IP アドレスと、セカンダリインターフェイス上の 172.31.16.1 というゲートウェイの例です。シナリオに合わせて 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 アドレスとゲートウェイを更新してください。
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 ファイルに以下の行を追加します。手順 1 で見つけたプライマリインターフェイス名と一致するように「eth0」を変更してください。
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 を使用した設定の例を示します。Netplan は YAML 形式で記述されるので、インデントが重要であることに注意してください。次の例では、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 コンソールを開いて、[インスタンス] をクリックした後、対象のインスタンスを選択します。
2. [ネットワーキング] タブで、[ネットワークインターフェイス] までスクロールし、セカンダリネットワークインターフェイスのサブネット ID を記録します。
3. Amazon Virtual Private Cloud (Amazon VPC) コンソールを開き、[サブネット ] を選択してから、サブネット ID 用として一覧表示されている IPv4 CIDR 範囲をメモします。
4. ネットワーク設定を適用します。
netplan --debug apply
関連情報
Configure route tables (ルートテーブルを設定する)