2019年9月4日水曜日

RHEL 7やCentOS7でPolicy Based Routing (PBR)を設定する

RHELのサーバにてNICを複数持つ場合、両方のNICから適切に通信できるよう設定しないと、通信の行きと戻りが異なる「非対称ルーティング」となる場合がある。非対称ルーティングの場合、途中にファイアウォール等があると正常に通信を許可することができず、想定した通信ができない。

このような状況を解消するため、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設定手順

  1. デフォルトゲートウェイの設定
    デフォルトゲートウェイは「サーバ自身から通信を行う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
  1. 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
  1. 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
  1. 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
  1. 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

再起動してもルーティングテーブルが消えないようにする

  1. 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
  1. NIC1用のルーティング設定を追加
    以下のようにrule-<デバイス名>route-<デバイス名>のファイルを作成する。先ほど手動で設定する際に使ったコマンドから、ip rule addip 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
  1. 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
  1. 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 件のコメント:

コメントを投稿

人気の投稿