【Linux】 NIC(インターフェース)が複数ある場合の設定方法

今回は、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のマニュアルを漁ります。

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。