CentOS7で同一セグメント上に2枚のNICを挿した場合の対応

CentOS7で同一セグメント上に2枚のNICを挿した場合に
2枚目のNICの疎通ができなくなるので対処法を記しました。

原因:同一セグメントに2枚のNICがあると、送信する際に
   1枚目のNICからパケットが出て行ってしまう為。

対応方法:ポリシーベースルーティング設定を行い、
     2枚目のNICからも送信できるようにします。

環境

Linuxホスト(CentOS7)
1枚目NIC:192.168.0.40/24
2枚目NIC:192.168.0.45/24

ストレージ(NetApp)
IP1:192.168.0.55
IP2:192.168.0.56

一時的に設定する場合(再起動すると設定が消える)

1枚目のNICの経路テーブルIDの登録
(192.168.0.40からのパケットはテーブルID:99、プライオリティー100のルールに従う)
ip rule add from 192.168.0.40 table 99 prio 100

1枚目のNICのルーティングの登録
(192.168.0.0宛てで送信元IP:192.168.0.40のパケットは1枚目のNIC(ens160)から送信する テーブルID:99に登録)
ip route add 192.168.0.0/24 dev ens160 src 192.168.0.40 table 99

(0.0.0.0宛てのパケットは1枚目のNIC(ens160)からGW:192.168.0.1宛てに送信する テーブルID:99に登録)
ip route add 0.0.0.0 via 192.168.0.1 dev ens160 table 99

2枚目のNICの経路テーブルIDの登録
(192.168.0.45からのパケットはテーブルID:100、プライオリティー200のルールに従う)
ip rule add from 192.168.0.45 table 100 prio 200

2枚目のNICのルーティングの登録
(192.168.0.0宛てで送信元IP:192.168.0.45のパケットは2枚目のNIC(ens192)から送信する テーブルID:100に登録)
ip route add 192.168.0.0/24 dev ens192 src 192.168.0.45 table 100

(0.0.0.0宛てのパケットは2枚目のNIC(ens192)からGW:192.168.0.1宛てに送信する テーブルID:100に登録)
ip route add 0.0.0.0 via 192.168.0.1 dev ens192 table 100

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

ip route ではポリシーベースルーティングの情報は確認できない。

ip rule

0: from all lookup local
100: from 192.168.0.40 lookup 99
200: from 192.168.0.45 lookup 100
32766: from all lookup main
32767: from all lookup default

ip route show table 99

0.0.0.0 via 192.168.0.1 dev ens160
192.168.0.0/24 dev ens160 scope link src 192.168.0.40

ip route show table 100

0.0.0.0 via 192.168.0.1 dev ens192
192.168.0.0/24 dev ens192 scope link src 192.168.0.45

永続設定するには、設定ファイルを編集の必要があります(再起動しても設定が残る)

経路テーブルIDの登録
vi /etc/iproute2/rt_tables

以下を追記

99 rule40
100 rule45

ルールファイルの作成
vi /etc/sysconfig/network-scripts/rule-ens160

from 192.168.0.40 table rule40 priority 100

「送信元IPが192.168.0.40ならrule40に従う、優先度は100」というルールを定義

vi /etc/sysconfig/network-scripts/rule-ens192

from 192.168.0.45 table rule45 priority 200

「送信元IPが192.168.0.45ならrule45に従う、優先度は200」というルールを定義

ルーティングファイルの修正
vi /etc/sysconfig/network-scripts/route-ens160

192.168.0.0/24 dev ens160 src 192.168.0.40 table rule40 …(1)
0.0.0.0 via 192.168.0.1 dev ens160 table rule40 …(2)

(1) 「192.168.0.0/24宛てでホストがens160の192.168.0.40だったらrule40に従う」
(2) 「rule40のデフォルトゲートウェイは192.168.0.1」

vi /etc/sysconfig/network-scripts/route-ens192

192.168.0.0/24 dev ens192 src 192.168.0.45 table rule45
0.0.0.0 via 192.168.0.1 dev ens192 table rule45

ネットワークの再起動
systemctl restart network

ルーティングルールの確認
ip rule

0: from all lookup local
100: from 192.168.0.40 lookup rule40
200: from 192.168.0.45 lookup rule45
32766: from all lookup main
32767: from all lookup default

ip route show table rule40

0.0.0.0 via 192.168.0.1 dev ens160
192.168.0.0/24 dev ens160 scope link src 192.168.0.40

ip route show table rule45

0.0.0.0 via 192.168.0.1 dev ens192
192.168.0.0/24 dev ens192 scope link src 192.168.0.45

疎通確認
ping -I ens160 192.168.0.55
ping -I ens192 192.168.0.56

両方のNICからNetAppに疎通できることを確認して下さい。

障害テスト

ip l set ens160 down
ip l set ens160 up

↑だとポリシールーティングルールがNICダウン時に消えて、アップ時に戻らない

ifdown ens160
ifup ens160

↑だとNIC再開時にポリシールーティング設定ファイルが反映されて、復帰する。

Comments are closed.