- ソリューションアーキテクト
- プロジェクトマネージャー
- テクニカルオペレーション
- Other occupations (4)
- Development
- Business
- Other
はじめまして、クラウドインテグレーション部の城と申します。
1月に入社したのですが、あっという間に1か月過ぎてしまいました。
時間の過ぎる速さに年齢を感じざるをえません。
さて本題へ入りますが、EC2インスタンスに別々のCIDRブロックのプライベートアドレスを付与し、それぞれと外部から通信させたいというケースがありました。
検証していたところ、ネットワークの設定でかなりつまづいてしまったので、一つの例として記録しておきたいと思います。
※インスタンス内のネットワーク設定にフォーカスしてお送りします。
実現したいこと
- OS:RedHat Enterprize Linux 7.4
- EC2インスタンスにそれぞれ別のCIDRブロックに所属するプライベートIPを設定する
- それぞれのインターフェースと通信できるように設定する
- インスタンス再起動時にも設定を維持する
用意した環境
次の環境を用意しました。
ENIが2つアタッチされています。
インターフェースの状態確認
インスタンスにログインしてネットワークインターフェースの確認をします。
所属するサブネットではない方のネットワークインターフェース [ eth1]は設定されていません。
ネットワークインターフェースの設定
[ eth1]の設定をします。DHCPでネットワーク設定を取得するようにします。
グローバルのデフォルトルートが複数登録されてしまうことを防ぐため、[ DEFROUTE=no] を記載しておきます。
ネットワーク再起動
前項の設定を反映させるため、ネットワークを再起動します。
インターフェースの状態確認(設定後)
確認すると、[ eth1 ]が設定されています。
通信確認
[ eth1] のENIに設定したEIPに対して、local端末からpingしてみます。
この段階ではアクセスできません。
ルーティング確認
ルーティングを確認します。
外部ネットワークから[ eth1] にアクセスすると、戻りのトラフィックがデフォルトルートにマッチしてしまい、下図NGの状態のように[ eth0] からトラフィックが出てしまうことがアクセスできない原因です。
そこで図中のOKの状態にすべく、ポリシーベースルーティングを設定します。
ポリシーベースルーティング設定
ポリシーベースルーティングは設定した条件により、ルーティングを行うことができます。
今回は送信元IPアドレスを条件に、別々のデフォルトゲートウェイを設定します。
ルートテーブルIDの設定
rule01、rule02を追記します。
IDはmainより小さい(優先度が高い)ものを指定します。
ルールを追加
[ rule-eth0 ]の場合、
「送信元が10.0.0.56/32の場合、テーブルrule01のルーティングを参照」
という意味になります。
送信元には各インターフェースのプライベートIPを指定します。
ルーティングを追加
設定したルールrule01、rule02に該当する場合のルーティングを追加します。
NetworkManagerを停止する
私はここでハマってしまいました。
NetworkManagerが起動している場合、ネットワーク再起動しても、
[ /etc/sysconfig/network-scripts/ ]以下の[ route- ]、[ rule-* ]のファイルが設定反映されませんでした。
[ /var/log/messages ]を見ると、下記確認できました。
解決策を探していたところ、公式サイトにはこのような記載がありました。
NetworkManagerを停止し、initscriptsを使用してみます。
自動起動の停止
自動起動についても停止しておきます。
ネットワーク再起動
設定を反映させるため、ネットワークを再起動します。
ルーティングテーブルの確認
設定内容が反映されたことが確認でき、[ eth1 ]についても、 外部ネットワークからアクセスできるようになりました。
最後に
複数のENIを利用する場合のネットワーク設定の例を紹介しました。
このような構成の場合、どうしても設定内容が複雑になってしまいがちです。
システムやネットワークの構成をしっかりと検討した上で、どうしても必要な場合に利用することをお勧めいたします。