はじめまして、hatです。
EC2上にてCentOSのマシンを稼動させ、複数のIPを持たせる必要があり作業をしたときのことです。
NWに詳しい方は想定できるかもしれませんが、備忘録をかねて作業内容を書いていきたいと思います。
環境情報
・EC2インスタンス (CentOS5.4を利用)
・ENIを2つ追加し、複数のIPアドレスを追加
・IFのセグメントはすべて同一(eth0,eth1,eth2)
- eth0:10.6.3.92
- eth1:10.6.3.96
- eth2:10.6.3.100
最初にAWSコンソールにてログインし、EC2インスタンスのネットワークインターフェースの追加し、
それぞれのインターフェースにEIPを割り当てました。それではsshにてアクセスしてみます。
結果は下記のようになりました。
- eth0 → sshアクセス可能
- eth1 → 応答なし
- eth2 → 応答なし
あれ、なぜつながらない・・・。ここでしばらく悩んでしまいました。
ふとルーティングテーブルを見てみると下記の状態になっていることに気づきました。
【ルーティングテーブルの情報】
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.6.3.0 * 255.255.255.0 U 0 0 0 eth0 10.6.3.0 * 255.255.255.0 U 0 0 0 eth1 10.6.3.0 * 255.255.255.0 U 0 0 0 eth2 169.254.0.0 * 255.255.0.0 U 0 0 0 eth2 default 10.6.3.1 0.0.0.0 UG 0 0 0 eth0
ローカルリンクの接続は問題ありませんが、eth1とeth2の外部からの通信は
デフォルトGWであるeth0を通って返されてしまっていました。
これでは正常な通信のやり取りができません。
調べてみるとipコマンドにてルーティングの設定ができるようなので
こちらを利用して設定の導入を進めて行くことにしました。
以下はその時に実施した内容です。
ルーティングテーブルの作成
まずはルーティングテーブルを追加します。
1~252の範囲(0、253~255は予約されている)から作成します。
ここでは100、101を利用しました。
【コマンド】
vi /etc/iproute2/rt_tables
【記載内容】
# # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 100 subroute-eth1 → ★追加 101 subroute-eth2 → ★追加
ルーティングの追加
ルートテーブルにルーティングを追加します。
【コマンド】(eth1の設定)
ip route add table subroute-eth1 10.6.3.0/24 dev eth1 scope link proto kernel
ip route add table subroute-eth1 default via 10.6.3.1 dev eth1
【コマンド】(eth2の設定)
ip route add table subroute-eth2 10.6.3.0/24 dev eth2 scope link proto kernel
ip route add table subroute-eth2 default via 10.6.3.1 dev eth1
実際に反映されているか確認します。
【コマンド】
ip route show table subroute-eth1
【表示結果】
10.6.3.0/24 dev eth1 proto kernel scope link default via 10.6.3.1 dev eth1
【コマンド】
ip route show table subroute-eth2
【表示結果】
10.6.3.0/24 dev eth2 proto kernel scope link default via 10.6.3.1 dev eth2
ルートテーブル参照条件のルールを追加
作成したルーティングテーブルが参照されるようにルールへ追加します。
mainのテーブル(routeコマンドで参照できるもの)よりも優先的に参照するように
優先度を上げておきます。
【コマンド】
ip rule add from 10.6.3.96 table subroute-eth1 prio 100
ip rule add from 10.6.3.100 table subroute-eth2 prio 110
ルーティングテーブルのルール情報を確認します。
【コマンド】
ip rule show
【表示結果】
0: from all lookup 255 100: from 10.6.3.96 lookup subroute-eth1 →★追加 110: from 10.6.3.100 lookup subroute-eth2 →★追加 32766: from all lookup main →routeコマンドで表示されるテーブル 32767: from all lookup default
OS起動時/ネットワーク再起動時の対処
1.OS起動時対応用、スクリプトを作成しておきます。
【コマンド】
vi /usr/local/sbin/subroute.sh
【記載内容】
#!/bin/sh #ルーティングルートテーブル追加 #[eth1用] ip route add table subroute-eth1 10.6.3.0/24 dev eth1 proto kernel scope link ip route add table subroute-eth1 default via 10.6.3.1 dev eth1 #[eth2用] ip route add table subroute-eth2 10.6.3.0/24 dev eth2 proto kernel scope link ip route add table subroute-eth2 default via 10.6.3.1 dev eth1 #ルーティングルール追加 #[eth1用] ip rule add from 10.6.3.96 table subroute-eth1 prio 100 #[eth2用] ip rule add from 10.6.3.100 table subroute-eth2 prio 110
2.ネットワークコマンド実行時用のファイルを作成します。
【コマンド】
vi /usr/local/sbin/subroute2.sh
【記載内容】
#!/bin/sh #ルーティングルートテーブル追加 #[eth1用] ip route add table subroute-eth1 10.6.3.0/24 dev eth1 proto kernel scope link ip route add table subroute-eth1 default via 10.6.3.1 dev eth1 #[eth2用] ip route add table subroute-eth2 10.6.3.0/24 dev eth2 proto kernel scope link ip route add table subroute-eth2 default via 10.6.3.1 dev eth1
3.ツールに実行権限を付与
chmod 755 /usr/local/sbin/subroute.sh chmod 755 /usr/local/sbin/subroute2.sh
4.自動起動に対応させるための修正
OS起動時用の登録
vi /etc/rc.local
【記載内容】
sh /usr/local/sbin/subroute.sh
5.ネットワークコマンド実行時用の登録
vi /etc/init.d/network
【記載内容】
[抜粋] sh /usr/local/sbin/subroute2.sh ;; ←閉じ前に記載すること stop) [抜粋]
終わりに
何とか想定どおりの動きになってくれました。ルーティングについては、奥が深く難しく感じましたが、苦労して分つながるとうれしいものです。すこしでも参考になっていただければ幸いです。