Elastic Network Interface (ENI) のルートテーブルとルーティングルールを設定して、ECS インスタンスが複数のネットワークインターフェイスを介してトラフィックを送受信する方法を制御します。
ENI のポリシーベースルーティングの設定
ポリシーベースルーティングは、デフォルトルートのみに依存するのではなく、事前定義されたルールに基づいて、指定されたネットワークインターフェイスを介してトラフィックを転送します。これにより、複数の ENI 間で詳細なトラフィック制御が可能になります。
ユースケース
-
複数 ENI 環境での通信:セカンダリ ENI が Elastic IP アドレス (EIP) または NAT ゲートウェイと共に使用される場合、プライマリ ENI のデフォルトルートの優先度が高いため、応答トラフィックがプライマリ ENI を介して送信されることがあります。ポリシーベースルーティングは source-in-source-out の原則を適用し、トラフィックが同じ ENI を介して出入りするようにします。
-
トラフィックの負荷分散:デフォルトルートが要件を満たさない場合、ルーティングルールを定義して、複数の ENI にアウトバウンドトラフィックを分散します。
-
アクセス制御:送信元アドレス、宛先アドレス、またはその他のパラメーターに基づいて、特定のインターフェイスまたはパスへのトラフィックを制限し、ネットワーク分離を実現します。
前提条件
-
ENI が ECS インスタンスにバインドされていること。
詳細については、「ENI の作成と管理」の「ENI を ECS インスタンスにバインドする」セクションをご参照ください。
-
ENI が ECS インスタンスのオペレーティングシステムで有効になっていること。
詳細については、「ENI の作成と管理」の「ECS インスタンスで ENI を有効にする」セクションをご参照ください。
操作手順
次の例では、eth1 という名前のセカンダリ ENI を使用します。ENI 識別子と IP アドレスは、実際の値に置き換えてください。
Linux インスタンス
-
ENI 用のルートテーブルを作成し、ルーティングルールを追加します。
ip -4 route add default via <eth1 のゲートウェイ> dev eth1 table 1001 ip -4 rule add from <eth1 の IP アドレス> lookup 1001たとえば、eth1 用に 1001 という名前のルートテーブルを作成し、172.16.20.193 からのパケットが eth1 を経由してルーティングされるようにルールを追加します。
ip -4 route add default via 172.16.20.253 dev eth1 table 1001 ip -4 rule add from 172.16.20.193 lookup 1001 -
再起動後もルート設定を永続化します。
インスタンスの起動設定にルートコマンドを追加して永続化します。そうしない場合、再起動後にルートは失われます。テストのみを行う場合は、この手順をスキップしてください。
-
/etc/rc.localを開きます。vim /etc/rc.local -
iキーを押して挿入モードに入り、前の手順の コマンドを追加してからEscキーを押します。:wqと入力し、Enter キーを押してファイルを保存し、閉じます。説明ネットワークインターフェイスの識別子とゲートウェイアドレスは、実際の値に置き換えてください。
-
/etc/rc.localに実行権限を付与します。sudo chmod +x /etc/rc.local
-
-
ルートテーブルとルールが作成されたことを確認します。
ip route list table 1001 && \ ip rule list次の出力は、ルートテーブルとルールが設定されていることを示しています。
root@xxx:/etc/netplan# ip route list table 1001 && ip rule list default via 172.16.20.253 dev eth1 0: from all lookup local 32765: from 172.16.20.193 lookup 1001 32766: from all lookup main 32767: from all lookup default
Windows インスタンス
-
ENI のポリシーベースルートを作成します。
route add -p <宛先ネットワーク> mask <サブネットマスク> <ゲートウェイ> if <インターフェイスインデックス> metric <ルート優先度>この例では、イーサネット 2 という名前の ENI が使用されます。次のコマンドは、特定のルートに一致しないトラフィックをゲートウェイ
172.16.12.253経由でルーティングする、永続的なデフォルトルートを作成します。route add -p 0.0.0.0 mask 0.0.0.0 172.16.12.253 if 6 metric 1パラメーター:
-
-p:ルートを永続的にします。-pを指定しない場合、ルートは一時的なものとなり、再起動後に失われます。 -
宛先ネットワーク:
0.0.0.0はデフォルトルートを示し、一致する特定のルートがない場合に使用されます。 -
サブネットマスクとゲートウェイ:
ipconfigを実行してこれらの値を確認します。C:\Users\Administrator>ipconfig Windows IP Configuration Ethernet adapter Ethernet: Connection-specific DNS Suffix . : cn-hangzhou.ecs.internal Link-local IPv6 Address . . . . . : fe80::6926:88f5:e002:7443%3 IPv4 Address. . . . . . . . . . . : 172.16.20.241 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 172.16.20.253 Ethernet adapter Ethernet 2: Connection-specific DNS Suffix . : cn-hangzhou.ecs.internal Link-local IPv6 Address . . . . . : fe80::46bd:a7fb:362e:f79f%6 IPv4 Address. . . . . . . . . . . : 172.16.12.76 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 172.16.12.253 -
インターフェイスインデックス:
netsh interface ipv4 show interfacesを実行してインデックスを確認します。この例では、イーサネット 2 のインターフェイスインデックス (Idx) は 6 です。
C:\Users\Administrator>netsh interface ipv4 show interfaces Idx Met MTU State Name --- ---------- ---------- ------------ --------------------------- 1 75 4294967295 connected Loopback Pseudo-Interface 1 3 15 1500 connected Ethernet 6 15 1500 connected Ethernet 2 -
ルート優先度:metric <n> の形式で指定します。値が小さいほど優先度が高くなります。
-
-
route printを実行して、ルートがルート一覧に表示されることを確認します。C:\Users\Administrator>route print =========================================================================== Interface List 3...00 16 3e 0a d5 39 ......Red Hat VirtIO Ethernet Adapter 6...00 16 3e 4c 88 9c ......Red Hat VirtIO Ethernet Adapter #2 1...........................Software Loopback Interface 1 IPv4 Route Table Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 172.16.12.253 172.16.12.76 15 0.0.0.0 0.0.0.0 172.16.20.253 172.16.20.241 15 127.0.0.0 255.0.0.0 On-link 127.0.0.1 331 127.0.0.1 255.255.255.255 On-link 127.0.0.1 331 127.255.255.255 255.255.255.255 On-link 127.0.0.1 331 172.16.12.0 255.255.255.0 On-link 172.16.12.76 271 172.16.12.76 255.255.255.255 On-link 172.16.12.76 271 172.16.12.255 255.255.255.255 On-link 172.16.12.76 271 172.16.20.0 255.255.255.0 On-link 172.16.20.241 271 172.16.20.241 255.255.255.255 On-link 172.16.20.241 271 172.16.20.255 255.255.255.255 On-link 172.16.20.255 271 224.0.0.0 240.0.0.0 On-link 127.0.0.1 331 224.0.0.0 240.0.0.0 On-link 172.16.20.241 271 224.0.0.0 240.0.0.0 On-link 172.16.12.76 271 255.255.255.255 255.255.255.255 On-link 127.0.0.1 331 255.255.255.255 255.255.255.255 On-link 172.16.20.241 271 255.255.255.255 255.255.255.255 On-link 172.16.12.76 271 Persistent Routes: Network Address Netmask Gateway Address Metric 0.0.0.0 0.0.0.0 172.16.12.253 1 ===========================================================================
例
この例では、Alibaba Cloud Linux 3.2 を実行している ECS インスタンスがセカンダリ ENI (eth1) を介してパケットを受信し、プライマリ ENI (eth0) ではなく eth1 を介して応答パケットを送信するように、ポリシーベースルートを設定する方法を示します。セキュリティポリシーに特定の ENI の送信元 IP ホワイトリストが含まれている場合、トラフィックパスが一致しないと、正当なリクエストが拒否されます。ポリシーベースルーティングはこの問題を解決します。
-
環境を準備します。
-
ECS インスタンスを作成します。
詳細については、「[カスタム購入] タブでインスタンスを作成」をご参照ください。
-
セカンダリ ENI を ECS インスタンスにバインドします。
詳細については、「セカンダリ ENI のバインド」をご参照ください。
-
EIP を申請し、NAT モードで eth1 セカンダリ ENI に関連付けます。
詳細については、「EIP をセカンダリ ENI に関連付ける」をご参照ください。
バインドが完了すると、ECS インスタンスの詳細ページの [Elastic Network Interface] タブで、セカンダリ ENI のステータスが [バインド済み] に変わり、[IP アドレス] 列に割り当てられたパブリック IP アドレス (EIP) とプライマリプライベート IP アドレスが表示されます。
-
テストクライアントを準備します。
インターネットアクセスが可能な別の ECS インスタンスまたはオンプレミスのコンピューターをテストクライアントとして使用します。
-
ECS インスタンスのセキュリティグループにインバウンドルールを追加して、テストクライアントのパブリック IP アドレスからのアクセスを許可します。次に、テストクライアントで ping <EIP> を実行して、手順 c で関連付けた EIP への接続性を確認します。
詳細については、「セキュリティグループの使用ガイドラインとユースケース」の「ケース 4: 特定のプロトコルのトラフィックのみが ECS インスタンスにアクセスできるようにする」セクションをご参照ください。
-
-
テストクライアントから ECS インスタンスにパケットを送信します。
ping 47.xx.xx.109IP アドレスを eth1 に関連付けられた EIP に置き換えてください。
-
ECS インスタンスの eth0 と eth1 の両方で ICMP パケットを監視します。
-
eth0で ICMP パケットをキャプチャします。tcpdump -i eth0 icmp -
新しいウィンドウを開き、
eth1で ICMP パケットをキャプチャします。tcpdump -i eth1 icmp
-
-
結果を表示します。
ポリシーベースルートが設定されていない場合
パケットは eth1 を経由して入りますが、応答パケットは eth0 を経由して出ます。インスタンスは eth1 で受信し、eth0 で応答します。
eth0 でパケットをキャプチャします。ICMP エコー応答を確認できます。
[root@xxx ~]# tcpdump -i eth0 icmp dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 14:01:55.129356 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 142, length 40 14:01:56.141993 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 143, length 40 14:01:57.145388 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 144, length 40 14:01:58.163042 IP iZxxx > 12.xxx: ICMP echo reply, id 2048, seq 145, length 40eth1 でパケットをキャプチャします。ICMP エコー要求を確認できます。
[root@xxx ~]# tcpdump -i eth1 icmp dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 14:01:55.129339 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 142, length 40 14:01:56.141980 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 143, length 40 14:01:57.145376 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 144, length 40 14:01:58.163030 IP 12.xxx > iZxxx: ICMP echo request, id 2048, seq 145, length 40eth0 のデフォルトルートの優先度は 100 であり、eth1 よりも高いため、パケットは eth0 から送信されます。
[root@i xxx ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.20.253 0.0.0.0 UG 100 0 0 eth0 0.0.0.0 172.16.20.253 0.0.0.0 UG 101 0 0 eth1 172.16.20.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 172.16.20.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1ポリシーベースルートが設定されている場合
-
ポリシーベースルートを設定します。詳細については、このトピックの「ENI のポリシーベースルーティングの設定」セクションをご参照ください。
ip -4 route add default via 172.16.20.253 dev eth1 table 1001 ip -4 rule add from 172.16.20.199 lookup 1001 -
テストクライアントで
ping <EIP>を実行します。 -
ENI で ICMP パケットを監視します。
パケットは eth1 を経由して出入りするようになりました。インスタンスは source-in-source-out の原則に基づいて、同じ ENI を介して送受信します。
[root@xxx ~]# tcpdump -i eth0 icmp dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes [root@xxx ~]# tcpdump -i eth1 icmp dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 14:15:13.249277 IP 123.xxx.xxx.4 > iZbp1gt1xxx Z: ICMP echo request, id 2050, seq 150, length 40 14:15:13.249293 IP iZbxxx lh49gbqovzZ : 4: ICMP echo reply, id 2050, seq 150, length 40 14:15:14.263769 IP 123.xxx.xxx.4 > iZbp1gt1xxx Z: ICMP echo request, id 2050, seq 151, length 40 14:15:14.263783 IP iZbxxx lh49gbqovzZ : 4: ICMP echo reply, id 2050, seq 151, length 40 14:15:15.267143 IP 123.xxx.xxx.4 > iZbp1gt1xxx Z: ICMP echo request, id 2050, seq 152, length 40 14:15:15.267155 IP iZbxxx lh49gbqovzZ : 4: ICMP echo reply, id 2050, seq 152, length 40 14:15:16.275436 IP 123.xxx.xxx.4 > iZbp1gt1xxx Z: ICMP echo request, id 2050, seq 153, length 40 14:15:16.275449 IP iZbxxx lh49gbqovzZ : 4: ICMP echo reply, id 2050, seq 153, length 40
-
ENI のデフォルトルートの設定
デフォルトルートは、ENI を ECS インスタンスにバインドする際に自動的に設定されます。ただし、Ubuntu 18 より前の OS バージョン (Ubuntu 16 など) では、セカンダリ ENI のデフォルトルートが設定されず、ネットワーク接続の問題が発生することがあります。次の手順に従って、手動でデフォルトルートを設定します。
この例では、Ubuntu 16 と eth1 セカンダリ ENI が使用されます。
-
ENI 情報を表示します。
ip aroot@xxx:/etc/network# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:16:3e:15:74:ee brd ff:ff:ff:ff:ff:ff inet 172.16.20.231/24 brd 172.16.20.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::216:3eff:fe15:74ee/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:16:3e:46:31:f4 brd ff:ff:ff:ff:ff:ff inet 172.16.20.199/24 brd 172.16.20.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::216:3eff:fe46:31f4/64 scope link valid_lft forever preferred_lft forever出力は、eth1 がオペレーティングシステムで有効になっていることを示しています。
-
ルート情報を表示します。
route -n出力は、eth1 には内部ルートのみがあり、アウトバウンドルートがないことを示しています。
root@xxx:/etc/network# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.20.253 0.0.0.0 UG 0 0 0 eth0 172.16.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 172.16.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 -
eth1 のデフォルトルートを設定します。
ip -4 route add default via 172.16.20.253 dev eth1 metric 200-
-4:IPv4 アドレスにのみ適用されます。 -
172.16.20.253:eth1 のゲートウェイアドレスです。 -
metric 200:ルート優先度です。値が小さいほど優先度が高くなります。同じ宛先へのルートが複数存在する場合、メトリックが最も小さいルートが使用されます。
-
-
再起動後もルート設定を永続化します。
インスタンスの起動設定にルートコマンドを追加して永続化します。そうしない場合、再起動後にルートは失われます。テストのみを行う場合は、この手順をスキップしてください。
-
/etc/rc.localを開きます。vim /etc/rc.local -
iキーを押して挿入モードに入り、前の手順の コマンドを追加してからEscキーを押します。:wqと入力し、Enter キーを押してファイルを保存し、閉じます。説明ネットワークインターフェイスの識別子とゲートウェイアドレスは、実際の値に置き換えてください。
-
/etc/rc.localに実行権限を付与します。sudo chmod +x /etc/rc.local
-
-
eth1 に追加されたルートを表示します。
route -nroot@ixxxxxxxxxx:/etc/network# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.20.253 0.0.0.0 UG 0 0 0 eth0 0.0.0.0 172.16.20.253 0.0.0.0 UG 200 0 0 eth1 172.16.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 172.16.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1