LoginSignup
10
10

More than 3 years have passed since last update.

Linux Policy Base Routing

Last updated at Posted at 2020-03-12

Linux Policy Base Routing

そもそも何が起きたか。

AWSでEC2を構築している時、複数NIC持つEC2に対してパケットが以下のような状況で到達しないことがあったので備忘録とする。
構成としては、EC2 インスタンスに複数のNICがついており、それぞれが別々のサブネットに所属。

Screen Shot 2020-03-12 at 18.20.43.png

図引用) 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/

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10