web-dev-qa-db-ja.com

AWS VPCの2番目のENIがUbuntuインスタンスでアクセスできない

私はVPCを始めたばかりで、すべてがどのように機能するかを理解しようとしています。これまでのところ、私が遭遇した最大のハードルは、2番目のElastic NICをマシンに追加するたびに、その2番目のIPにVPC内の他のユーザーがアクセスできないことです。これが私がしたことです。

  • Canonicalが提供するUbuntu 12.10 x64 EBS用AMIを発売。
  • 起動時に2つのネットワークインターフェイス(同じサブネット)を構成しました
  • マシンが起動したら、/ etc/network/interfacesに以下を追加しました。

自動eth1

iface eth1 inet dhcp

  • ifup eth1
  • ifconfigを実行し、2番目のアドレスが稼働していることを確認します。

私のプライマリ(インターネットアクセス可能)インスタンス:

  • ping(新しいインスタンスeth0のIP)-機能
  • ping(新しいインスタンスeth1のIP)-失敗

Eth0で機能するため、pingを防止するACLはありません。マシンにはファイアウォールの設定はありません。複数のインターフェイスを備えた複数のSGおよびAZで4つの異なるインスタンスを試しましたが、すべて同じ結果になりました。

私はこれを認めるよりも長い間、壁に頭をぶつけてきました。これでエラーがどこにあるのかわかりません。

5
Jon

デフォルトでは、ルーティングテーブルはトラフィックをeth0にのみルーティングします。 ubuntuが他のENIを検出しても、トラフィックをそこにルーティングする必要があります。

高度なルーティングを行う必要があります。

1)2番目のENIへのアクセスを即座に一時的に有効にします。

ソース: http://www.rjsystems.nl/en/2100-adv-routing.php

# this will show your route table, i'll assume you have eth0 and eth1
# and your default is for eth0 to point to the gateway
# for this example lets assume the following:
# eth0 = 192.168.100.5 
# eth1 = 192.168.100.10
# gateway = 192.168.100.1
ip route show ;

# first step is to create a routing table for your new device
cat /etc/iproute2/rt_tables ;
echo 2 eth1_rt >> /etc/iproute2/rt_tables ;

# next add the eth1_rt route table, so by default it will also point to the gateway
ip route add default via 192.168.100.1 dev eth1 table eth1_rt ;

# next take a look at your ip rules
# i'll assume the defaults here, and things flows to default with priority 32767
ip rule;

# let's add a rule, if we see traffic from eth1's IP address,
# use its new routing table we setup, and give it higher priority than default
ip rule add from 192.168.100.10 lookup eth1_rt prio 1000 ;

# done! now check your traffic from both IPs, they should both work.

2)再起動時に2番目のENIへのアクセスを有効にしますが、永続的にします。

ソース: http://blog.bluemalkin.net/multiple-ips-and-enis-on-ec2-in-a-vpc/

さらに、この変更を保持したい場合は、インターフェイスファイルでこれらすべての変更を行い、ネットワークサービスを再起動するか、再起動して有効にすることができます。

# NOTE: add the eth1_rt routing table to /etc/iproute2/rt_tables as show in previous section

# original config to make dchp, I add mine to /etc/network/interfaces.d/eth1.cfg
auto eth1
iface eth1 inet dchp
    # your extra rules for eth1
    up ip route add default via 192.168.100.1 dev eth1 table eth1_rt
    up ip rule add from 192.168.100.10 lookup eth1_rt prio 1000

これを完全に有効にするには、システムを再起動します。

注:/etc/init.d/networking restart;を試しましたが、ルート/ルールの変更が検出されなかったため、理由がわからないため、再起動しました。それを即時かつ永続的にしたい場合は、両方の方法を実行します。

11
sonjz

これが私のやり方です。静的IPを使用しています。最初は2つの項目を取得するためにdhcpを使用します。 IPアドレスとネットマスク。これはステップバイステップの指示です:

インスタンスを起動します

Sudo cp /etc/network/interfaces.d/eth0.cfg /etc/network/interfaces.d/eth1.cfg
Sudo sed -i "s/eth0/eth1/g" /etc/network/interfaces.d/eth1.cfg
Sudo ifdown eth1
Sudo ifup eth1
Sudo ifconfig eth1 | tee /tmp/ifconfig-eth1-output.txt
Sudo ifdown eth1
Sudo rm -f /etc/network/interfaces.d/eth1.cfg 
ETH0_IP=$(cat /tmp/ifconfig-eth1-output.txt | grep "inet addr:" | cut -f 2 -d':' | cut -f 1 -d' ')
ETH0_NETMASK=$(cat /tmp/ifconfig-eth1-output.txt| grep "inet addr:" | cut -f 4 -d':')
ETH0_GATEWAY=$(echo ${ETH0_IP} | sed "s/[0-9]*$/1/g")
echo "auto eth1" > /tmp/eth1.cfg
echo "iface eth1 inet static" >> /tmp/eth1.cfg  
echo "address ${ETH0_IP}" >> /tmp/eth1.cfg 
echo "netmask ${ETH0_NETMASK}" >> /tmp/eth1.cfg 
echo "up ip route add default via ${ETH0_GATEWAY} dev eth1 table 1  metric 10001" >> /tmp/eth1.cfg 
echo "up ip rule add from ${ETH0_IP}/32 table 1 priority 10001" >> /tmp/eth1.cfg 
echo "up ip route flush cache" >> /tmp/eth1.cfg 
Sudo cp -f /tmp/eth1.cfg /etc/network/interfaces.d/
Sudo ifup eth1

それがそれをするはずです、チェックするためにこれらを実行してください。

curl --silent http://ipinfo.io
curl --interface eth0 --silent http://ipinfo.io
curl --interface eth1 --silent http://ipinfo.io

これらはすぐに有効になり、再起動しても保持されます。