このような状況を解消するため、RHELにてPolicy Based Routing (PBR)を設定し検証してみた。以下に検証内容と設定手順を記載する。
環境
- OS : RHEL 7
- NIC1 (ens192) : 192.168.11.191/24
- NIC2 (ens224) : 192.168.33.191/24
通信要件
以下通信要件を実現するルーティングテーブルを作成する。- NIC1で受けた通信はNIC1から返す
- NIC2で受けた通信はNIC2から返す
- 対象サーバから送信する通信はNIC1側から行う
Policy Based Routing設定手順
- デフォルトゲートウェイの設定
デフォルトゲートウェイは「サーバ自身から通信を行うNIC」に対して設定する。今回はNIC1 (ens192)で設定しておく。
# ip route show
default via 192.168.11.31 dev ens192 proto static metric 100 ←★NIC1 (ens192)にデフォルトゲートウェイを設定
192.168.11.0/24 dev ens192 proto kernel scope link src 192.168.11.191 metric 100
192.168.33.0/24 dev ens224 proto kernel scope link src 192.168.33.191 metric 101
- NIC2用のルーティングテーブルを追加
NIC1用のIPアドレスから送信する場合のルーティングテーブルを作成する。
# ip rule add from 192.168.33.191 table 100 prio 100
# ip rule show
0: from all lookup local
100: from 192.168.33.191 lookup 100 ←★追加されたテーブル
32766: from all lookup main
32767: from all lookup default
- NIC2用のルーティングテーブルにルーティングを設定
NIC1用のテーブルにデフォルトゲートウェイと同セグのルーティングテーブルを追加する。
# ip route add 192.168.33.0/24 dev ens224 proto kernel scope link metric 100 table 100
# ip route add default via 192.168.33.31 table 100
# ip route show table 100
default via 192.168.33.31 dev ens224
192.168.33.0/24 dev ens224 proto kernel scope link metric 100
- NIC1用のルーティングテーブルを追加
NIC2用のIPアドレスから送信する場合のルーティングテーブルを作成する。
# ip rule add from 192.168.11.191 table 101 prio 101
# ip rule show
0: from all lookup local
100: from 192.168.33.191 lookup 100
101: from 192.168.11.191 lookup 101 ←★追加されたテーブル
32766: from all lookup main
32767: from all lookup default
- NIC1用のルーティングテーブルにルーティングを設定
NIC2用のテーブルにデフォルトゲートウェイと同セグのルーティングテーブルを追加する。
# ip route add 192.168.11.0/24 dev ens192 proto kernel scope link metric 100 table 101
# ip route add default via 192.168.11.31 table 101
# ip route show table 101
default via 192.168.11.31 dev ens192
192.168.11.0/24 dev ens192 proto kernel scope link metric 100
これで完了となる。一見すると、NIC1とNIC2の両方にデフォルトゲートウェイが設定されているため、通常のルーティングテーブル(
ip route show
で表示されるテーブル)は不要となるように見えるが、サーバ自身から通信を行う場合は、通常のルーティングテーブルを使用するようなので、設定は必要となる。試しに通常のデフォルトゲートウェイを設定せずにpingを実行してみると、ルーティングがないためネットワークに到達できない旨のエラーが表示された。[root@localhost ~]# ping 192.168.55.1
connect: ネットワークに届きません
動作確認
NIC1側のクライアントからping
192.168.11.0/24のセグメントにいるクライアントからpingを実施して確認してみる。# ping -c 1 192.168.11.191
PING 192.168.11.191 (192.168.11.191) 56(84) bytes of data.
64 bytes from 192.168.11.191: icmp_seq=1 ttl=64 time=0.114 ms ←★OK!
--- 192.168.11.191 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.114/0.114/0.114/0.000 ms
# ping -c 1 192.168.33.191
PING 192.168.33.191 (192.168.33.191) 56(84) bytes of data.
64 bytes from 192.168.33.191: icmp_seq=1 ttl=63 time=0.365 ms ←★OK!
--- 192.168.33.191 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.365/0.365/0.365/0.000 ms
NIC2側のクライアントからping
192.168.33.0/24のセグメントにいるクライアントからpingを実施して確認してみる。# ping -c 1 192.168.11.191
PING 192.168.11.191 (192.168.11.191) 56(84) bytes of data.
64 bytes from 192.168.11.191: icmp_seq=1 ttl=63 time=0.219 ms ←★OK!
--- 192.168.11.191 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.219/0.219/0.219/0.000 ms
# ping -c 1 192.168.33.191
PING 192.168.33.191 (192.168.33.191) 56(84) bytes of data.
64 bytes from 192.168.33.191: icmp_seq=1 ttl=64 time=0.110 ms ←★OK!
--- 192.168.33.191 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.110/0.110/0.110/0.000 ms
再起動してもルーティングテーブルが消えないようにする
-
NetworkManager-dispatcher-routing-rules
をインストール
NetworkManager-dispatcher-routing-rules
は、以前はNetworkManager-config-routing-rules
と呼ばれていたパッケージとなるが、以下にある通り、パッケージ名が変更されているだけで同じものになるようだ。NetworkManager-dispatcher-routing-rules
は、RHELのインストールISOイメージに含まれていないので、RHELのサイトからRPMファイルをダウンロードしてインストールする。インストール後、NetworkManager-dispatcher.service
が自動起動するよう設定する。
# rpm -ivh NetworkManager-dispatcher-routing-rules-1.18.0-5.el7.noarch.rpm
警告: NetworkManager-dispatcher-routing-rules-1.18.0-5.el7.noarch.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID fd431d51: NOKEY
準備しています... ################################# [100%]
更新中 / インストール中...
1:NetworkManager-dispatcher-routing################################# [100%]
# systemctl enable NetworkManager-dispatcher.service
# systemctl start NetworkManager-dispatcher.service
- NIC1用のルーティング設定を追加
以下のようにrule-<デバイス名>
とroute-<デバイス名>
のファイルを作成する。先ほど手動で設定する際に使ったコマンドから、ip rule add
やip route add
を省略して書けばよい。
# cat /etc/sysconfig/network-scripts/rule-ens192
from 192.168.11.191 table 101 prio 101
# cat /etc/sysconfig/network-scripts/rule-ens192
default via 192.168.11.31 table 101
192.168.11.0/24 dev ens192 proto kernel scope link metric 100 table 101
- NIC2用のルーティング設定を追加
同様にNIC2用のファイルを作成する。
# cat /etc/sysconfig/network-scripts/rule-ens224
from 192.168.33.191 table 100 prio 100
# cat /etc/sysconfig/network-scripts/route-ens224
default via 192.168.33.31 table 100
192.168.33.0/24 dev ens224 proto kernel scope link metric 100 table 100
- OS再起動
OS再起動してルーティングテーブルを確認すると、以下の通り問題なく設定されていることがわかる。
# ip rule show
0: from all lookup local
100: from 192.168.33.191 lookup 100
101: from 192.168.11.191 lookup 101
32766: from all lookup main
32767: from all lookup default
# ip route show table 100
default via 192.168.33.31 dev ens224
192.168.33.0/24 dev ens224 proto kernel scope link metric 100
# ip route show table 101
default via 192.168.11.31 dev ens192
192.168.11.0/24 dev ens192 proto kernel scope link metric 100
(参考) 削除コマンド
参考までに、削除コマンドは以下の通りとなる。# ip route del default table 100
# ip route del 192.168.33.0/24 table 100
# ip rule del table 100
# ip route del default table 101
# ip route del 192.168.11.0/24 table 101
# ip rule del table 101
0 件のコメント:
コメントを投稿