今回は、Linuxサーバー構築時によくあるパターンですが、「ネットワークインターフェースが複数ある場合の設定方法について」です。
「間違えた事例」を元に、調査して設定していくパターンで説明します。
routeコマンドでルーティングテーブルを調べていたらおかしな点を見つけた
あるLinux(CentOS)サーバーで構築されたシステムで、各サーバーにログインしてネットワーク周りやルーティングテーブルを調べていたところ、おかしな点を見つけました。
Linuxでルーティングテーブルやデフォルトゲートウェイを確認する場合は、「route」コマンドで確認できます。
■routeコマンド
|
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0 ←デフォゲ
0.0.0.0 192.168.1.1 0.0.0.0 UG 101 0 0 eth1 ←デフォゲ
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.1.1 0.0.0.0 255.255.255.255 UH 100 0 0 eth1
192.168.51.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1
|
あれ?
デフォゲが2つあるような気がします?
eth0とeth1が同じデフォゲを持っているように見えます。。
早速調べました。
ネットワークインターフェース設定
正しいネットワークインターフェースの設定は以下です。
eth0 のみデフォルトゲートウェイを持ちます。
eth0:192.168.1.230 ←eth0がデフォゲを持つ
eth1:192.168.51.230
default gateway: 192.168.1.1
ルーティングテーブルがおかしくなっていた原因
結論から言えば、ifcfg-ethx ファイルの設定が間違えていました。
以下の設定を見てほしいのですが、ifcfg-eth1(192.168.51.230)のネットワークの設定が「NETWORK=192.168.1.0」になっていたことが原因でした。
|
$ cat ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.230
NETMASK=255.255.255.0
NETWORK=192.168.1.0
$ cat ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.51.230
NETMASK=255.255.255.0
NETWORK=192.168.1.0 ←ここの部分です。
|
正しく修正しました。
「NETWORK=192.168.1.0」→「NETWORK=192.168.51.0」
この後、OSまで再起動した場合、ルーティングテーブルの表示が変わり、正しい状態になりますでしょうか。
設定を修正しOSを再起動してみた結果
OSを再起動しましたが、まだ変わりませんでした。
|
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 101 0 0 eth1 ←OS再起動後もこの状態
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.1.1 0.0.0.0 255.255.255.255 UH 100 0 0 eth1
192.168.51.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1
|
さらに原因を追跡します。
/etc/sysconfig/network-scriptディレクトリ配下を確認します。
今回は、ルーティングテーブルがおかしいのに/etc/sysconfig/network-scriptディレクトリ配下にrouteファイルがありません。
※routeファイルはスタティックルートを切る時に使う設定ファイルです。
routeファイルがないのが気になりますが、なくても問題ではありません。
|
$ ls
ifcfg-eth0 ifdown-bnep ifdown-isdn ifdown-sit ifup-bnep ifup-isdn ifup-ppp ifup-wireless
ifcfg-eth1 ifdown-eth ifdown-post ifdown-tunnel ifup-eth ifup-plip ifup-routes init.ipv6-global
ifcfg-lo ifdown-ippp ifdown-ppp ifup ifup-ippp ifup-plusb ifup-sit network-functions
ifdown ifdown-ipv6 ifdown-routes ifup-aliases ifup-ipv6 ifup-post ifup-tunnel network-functions-ipv6
|
あらためて見ると、ipv6のファイルがあるし、なぜか ifup-wireless ファイルもあります。
と思ったらifup-isdnとかifup-pppとかなんでもあります(笑)
なんだろう、これは。
ここら辺の原因は後程するとして、今はネットワークの設定です。
通常、デフォルトゲートウェイは1つしかありません。
複数ネットワークインターフェースがあったとしてもデフォルトゲートウェイは1つです。
もし複数デフォルトゲートウェイがあったら、それはデフォルトのゲートウェイじゃなくなります。
だからDestination「0.0.0.0」は1つしかなければいけません。
正常なルーティングテーブルの例
念のため、他のサーバーのルーティングテーブルも調べました。
特に問題はなさそうでした。
ちなみに、これは正常なルーティングテーブルです。
|
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 160.xxx.xxx.1 0.0.0.0 UG 100 0 0 eth0
160.xxx.xxx.0 0.0.0.0 255.255.254.0 U 100 0 0 eth0
|
当たり前の話ですがデフォルトゲートウェイは1つしかありません。
※Windowsは各インターフェースがそれぞれデフォルトゲートウェイを持てるようですが、今回はLinux(CentOS)です。
他のサーバーのその他ネットワーク設定も調べてみたところ・・・
デフォルトゲートウェイだけでなく、他のサーバーのネットワーク設定も調べてみたところ、再度「あれ?」と思いました。
その理由は複数の ifcfg-ethx にデフォルトゲートウェイが設定されていたからです。。
※混乱しますが、おかしなルーティングテーブルのサーバーは、「ifcfg-eth0」も「ifcfg-eth1」もデフォルトゲートウェイの設定(GATEWAY=xx.xx.xx.xx)はされていません。
正常に動いていると思われたサーバーのネットワーク設定もおかしなものだったからです。
|
$ cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=10.xx.xx.7
PREFIX=24
GATEWAY=10.xx.40.254 ←デフォゲの設定がある
DNS1=xx.xx.xx.xx
DEFROUTE=yes ←DEFROUTEの設定もある
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=”System eth0″
$ cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=10.xx.xx.197
PREFIX=24
GATEWAY=10.xx.50.254 ←ここにもデフォゲの設定がある
DEFROUTE=yes ←DEFROUTEの設定もある
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=”System eth1″
|
しかし route コマンドで確認すると「Destination 0.0.0.0」は1つしかありません。
|
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.xx.xx.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.xx.xx.0 10.xx.xx.xx 255.255.255.0 UG 0 0 0 eth1
10.xx.xx.0 10.xx.xx.xx 255.255.255.0 UG 0 0 0 eth1
10.xx.xx.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 10.xx.xx.xx 0.0.0.0 UG 0 0 0 eth1
|
なぜか両方のifcfg-ethxにデフォルトゲートウェイの設定がされていますがrouteコマンドを見る限りでは問題なさそうです。
ifcfg-eth1で設定されているデフォゲが有効になっていますが、では、ifcfg-eth0で設定しているデフォルトゲートウェイの設定はどうなったのか?
調べてみたら複数のインターフェースでデフォルトゲートウェイを有効にすると、最後のインターフェースのデフォルトゲートウェイが有効になるそうです。
だから「ifcfg-eth0」と「ifcfg-eth1」の両方に「DEFROUTE=yes」が設定してあっても、2つをデフォゲに設定できないので一番最後の「ifcfg-eth1」が「DEFROUTE=yes」が有効になるということです。
ここまでは分かりました。
しかもややこしいのが、
- ifcfg-eth0 →デフォルトゲートウェイを設定するのが正解。eth1にも「DEFROUTE=yes」が設定されているので本来なら消えるはずだが、消えずにルーティングテーブルに残り、ちゃんと通信できている。
- ifcfg-eth1 →デフォルトゲートウェイ不要。しかし「DEFROUTE=yes」が設定されているのでeth0→eth1の流れでifcfg-eth1が優先的になる。
しかし実際、2つのデフォルトゲートウェイが見えています。
|
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 101 0 0 eth1
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.1.1 0.0.0.0 255.255.255.255 UH 100 0 0 eth1
192.168.51.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1
|
そのため、明示的に ifcfg-eth1に「DEFROUTE=no」を設定してみました。
複数のインターフェースがある場合は、他を「DEFROUTE=no」に設定することもできます。
- ifcfg-eth0 → とりあえず何もしない
- ifcfg-eth1 → DEFROUTE=noを入れてみる
ここまでやってから、念の為、OS再起動をしてみました。
(そこまでしなくてもいいかもしれないが)
DEFROUTE=noを入れたら直った
結論から言うと、「DEFROUTE=no」を設定したら直りました。
【正常な状態】
|
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.51.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1
|
【以前のおかしかった状態】
|
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 101 0 0 eth1 ←消えた
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
192.168.1.1 0.0.0.0 255.255.255.255 UH 100 0 0 eth1 ←消えた
192.168.51.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1
|
だいぶルーティングテーブルの内容がスッキリしたというか、正しくなったようです。
余計な設定が消えたからでしょうか。
結論
まだまだなぞが残ってスッキリしないので、Linuxのマニュアルを漁ります。
コメント