RHEL 7.4 でPolicy Based Routingを設定してみました。

AWS運用自動化サービス「Cloud Automator」
この記事は1年以上前に書かれたものです。
内容が古い可能性がありますのでご注意ください。

はじめまして、クラウドインテグレーション部の城と申します。
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の設定

rule01rule02を追記します。
IDはmainより小さい(優先度が高い)ものを指定します。

ルールを追加

rule-eth0の場合、
「送信元が10.0.0.56/32の場合、テーブルrule01のルーティングを参照」
という意味になります。
送信元には各インターフェースのプライベートIPを指定します。

ルーティングを追加

設定したルールrule01rule02に該当する場合のルーティングを追加します。

NetworkManagerを停止する

私はここでハマってしまいました。
NetworkManagerが起動している場合、ネットワーク再起動しても、
/etc/sysconfig/network-scripts/以下のroute-*rule-*のファイルが設定反映されませんでした。
/var/log/messagesを見ると、下記確認できました。

解決策を探していたところ、公式サイトにはこのような記載がありました。

NetworkManager は現在、RHEL 7 でデフォルトで使用されています。NetworkManager を無効すると、ネットワークインターフェイス管理には代わりに initscripts が使用されます。

NetworkManagerを停止し、initscriptsを使用してみます。

自動起動の停止

自動起動についても停止しておきます。

ネットワーク再起動

設定を反映させるため、ネットワークを再起動します。

ルーティングテーブルの確認

設定内容が反映されたことが確認でき、eth1についても、
外部ネットワークからアクセスできるようになりました。

最後に

複数のENIを利用する場合のネットワーク設定の例を紹介しました。
このような構成の場合、どうしても設定内容が複雑になってしまいがちです。
システムやネットワークの構成をしっかりと検討した上で、どうしても必要な場合に利用することをお勧めいたします。

AWS運用自動化サービス「Cloud Automator」