Linux Policy Base Routing
そもそも何が起きたか。
AWSでEC2を構築している時、複数NIC持つEC2に対してパケットが以下のような状況で到達しないことがあったので備忘録とする。
構成としては、EC2 インスタンスに複数のNICがついており、それぞれが別々のサブネットに所属。
図引用) http://blog.serverworks.co.jp/tech/2018/02/16/rhel-pbr-setting/
ルーティングテーブル(main)は以下のような状況。デフォルトGWはサブネット(10.0.1.0/24)のルータとなる。
[root@ip-10-0-1-5 etc]# ip route show table main
10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.5
10.0.2.0/24 dev eth1 proto kernel scope link src 10.0.2.5
default via 10.0.1.1 dev eth0
この状況で、10.0.1.0/24に所属するNWから、10.0.2.xのNIC(eth1)に対してPINGを飛ばしてみたが戻りのパケットがない状態。
なぜかと調べた結果、PINGは当該EC2に対して届いてはいるが、戻りのパケットを返す時に、当該EC2のデフォルトGWからパケットを送出しており、結果的に送信元に対して届かないというものだった。
同一の通信に関して、受信するNICと戻りの通信をするNICが異なる通信を非対称ルーティングと呼ぶ。
Linuxではどこかのバージョンから以下のカーネルパラメータにより、戻りの通信をするNICが受信したNICと異なる場合パケットを落とす設定になっている。この設定がパケットの受信先で有効になっており、戻りの通信だけフィルタリングされるのである。
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
上記を無効化する手もあるが、IP スプーフィングを防ぐためのOS全体のセキュリティ設定となる。
これを回避するためにPolicy Base Routingという機能もあるため実装する。
Policy Base Routing
標準のルーティングテーブルは、宛先アドレスをみて特定のルータやデフォルトゲートウェイにパケットをルーティングする。
一方で、Policy Base Routing(以下PBR)は、送信元IPアドレスやTCP/UDPポートも見てルーティングを決めてくれる機能である。
また、PBRを通常のルーティングよりもルールとして優先させる。
そのため、今回のケースで言えば送信元IPアドレスが10.0.2.0/24を基準のパケットは、10.0.2.1に飛ばすようにPBRを設定すれば良いという結論になる。(ここで言う送信元IPアドレスだが、PINGの戻りのパケットの部分をさす。tcpdumpすればわかるが、戻りのパケットは、10.0.2.x ==> 10.0.1.xとなっている。)
- こちらが現状のルールなので「32766: from all lookup main」よりもpriorityを小さな値にする。priorityが小さいほど優先度が高いルール
[root@ip-10-0-1-5 etc]# ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
- PBR用のルートテーブル・ルール作成
ip route flush table 2000
ip route add table 2000 to 10.0.2.0/24 dev eth1
ip route add table 2000 to default via 10.0.2.1 dev eth1
ip rule add from 10.0.2.0/24 table 2000 priority 200
cat << EOF > /etc/sysconfig/network-scripts/pbr02-eth1
from 10.0.2.0/24 table 2000 priority 200
EOF
cat << EOF > /etc/sysconfig/network-scripts/route-eth1
10.0.2.0/24 dev eth1 table pbr02
default via 10.0.2.1 dev eth1 table 2000
EOF
- 設定確認系
[root@ip-10-0-1-5 network-scripts]# ip rule show
0: from all lookup local
200: from 10.0.2.0/24 lookup pbr02
32766: from all lookup main
32767: from all lookup default
[root@ip-10-0-1-5 network-scripts]# ip route show table 2000
10.0.2.0/24 dev eth1 scope link
default via 10.0.2.1 dev eth1
参考
https://milestone-of-se.nesuke.com/nw-basic/routing/policy-based-routing/