以下の内容はhttps://yokohama539.hatenablog.com/entry/2025/02/24/164036より取得しました。


(Junosで)FBFをしてみた。

今回はJunosのFBF機能を検証します。

FBFとは「Filter-Based Forwarding」の略です。
(Destination IPアドレス以外の)IPヘッダー特性によったルーティングを行う機能となります。
まあ、CiscoのPolicy Based Routing(PBR)のJuniper版…と言った方がわかりやすいでしょうか。
さっそく構成を考えます。

1. Filter-Based Forwarding 構成

ベタですが特定のSource IPアドレスによって経由するルーターを変える、という条件で設定していきます。
(条件はSource IPアドレス以外にもポート番号やパケット長などでもできますが、まあ一番確認が簡単なので…)
IOSと同様に特定のSource IPアドレスに一致しない場合は、ルーティングテーブルに従ってパケットを転送する条件も追加しましょう。
図に示すとこんな感じです。

少なくともPingの送信元のルーターと、経由するルーターは複数台必要になるので、思ったよりも大掛かりな構成となりました。
(インターフェイス複数個用意すればもっと台数少なくできますが、わかりやすさ優先でこの構成にしてます)
全台でOSPFを動かし、各々のLoopbackアドレスは学習済みとします。
また、vJR-03~vJR-06間はOSPFのmetric(cost)を調整して、vJR-03~vJR-04~vJR-06の経路が優先されるようにします。

2. Filter-Based Forwarding 設定

次にFBFの設定を検討します。
IOSライクにroute-map的なフィルターで条件にマッチしたパケットを指定したIPアドレスに転送するだけでしょ…と思ったら大間違い。
Junosは別個のFBF用のrouting-instanceが必要となり、各routing-instanceに従ったパケットフォワーディングをする動作となります。
なので、Firewall-Filterにて条件を定義し、マッチしたパケットについてnext-hopが変更された各routing-instanceに渡す、という動作になります。
また、定義したFBF用のrouting-instanceは各インターフェイスのネットワーク情報を保持していないので、RIB-Groupを作成してinet.0のネットワーク情報を共有しておく必要があります。
…文章だとよくわからんですね。イメージ図は以下の通りです。

では実際に設定していきます。
まず、FBF用のrouting-instanceを定義し、各routing-instanceにてnext-hopを変更したスタティックルートを設定します。

//vJR-03
set routing-instances TO-R4 instance-type forwarding
set routing-instances TO-R4 routing-options rib TO-R4.inet.0 static route 0.0.0.0/0 next-hop 34.34.34.4
set routing-instances TO-R5 instance-type forwarding
set routing-instances TO-R5 routing-options rib TO-R5.inet.0 static route 0.0.0.0/0 next-hop 35.35.35.5


次に、特定のSource IPアドレスがマッチした際はFBF用のrouting-instanceに渡すFirewall-Filterを作成します。
ポイントとしては、Firewall-Filterなので特定のSource IPアドレスに一致しない場合は最後のtermにaccpet文を定義する必要があることでしょうか。
(定義しないと暗黙のdiscardでパケットが破棄されてしまいます)
また、今回はOSPFを動かしてるので、最優先でOSPFパケットはacceptしてやります。

//vJR-03
set firewall family inet filter FBF term 0001 from protocol ospf
set firewall family inet filter FBF term 0001 then accept
set firewall family inet filter FBF term 0011 from source-address 1.1.1.1/32
set firewall family inet filter FBF term 0011 then routing-instance TO-R4
set firewall family inet filter FBF term 0021 from source-address 2.2.2.2/32
set firewall family inet filter FBF term 0021 then routing-instance TO-R5
set firewall family inet filter FBF term 9991 then accept
set interfaces ge-0/0/0 unit 0 family inet filter input FBF


最後にRIB-Groupを作成してinet.0のネットワーク情報をFBF用のrouting-instanceと共有する設定をします。
IOSにはない仕様なので、めんどくさいと感じてしまう…

//vJR-03
set routing-options interface-routes rib-group inet FBF-GROUP
set routing-options rib-groups FBF-GROUP import-rib inet.0
set routing-options rib-groups FBF-GROUP import-rib TO-R4.inet.0
set routing-options rib-groups FBF-GROUP import-rib TO-R5.inet.0


ちなみに、このimport-rib、show configurationでの出力結果はdisplay set有無で変わります。

//vJR-03
lab@vJR-03# run show configuration
<snip>
routing-options {
    interface-routes {
        rib-group inet FBF-GROUP;
    }
    router-id 3.3.3.3;
    rib-groups {
        FBF-GROUP {
            import-rib [ inet.0 TO-R4.inet.0 TO-R5.inet.0 ];
        }
    }
}
<snip>

lab@vJR-03# run show configuration | display set
<snip>
set routing-options interface-routes rib-group inet FBF-GROUP
set routing-options router-id 3.3.3.3
set routing-options rib-groups FBF-GROUP import-rib inet.0
set routing-options rib-groups FBF-GROUP import-rib TO-R4.inet.0
set routing-options rib-groups FBF-GROUP import-rib TO-R5.inet.0
<snip>

設定は以上となります。

3. Filter-Based Forwarding 確認

では、確認をしていきます。まずvJR-03自身から。
各routing-instanceのルーティングテーブルを確認します。

//vJR-03
lab@vJR-03# run show route | no-more

inet.0: 12 destinations, 12 routes (12 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

<snip>
1.1.1.1/32         *[OSPF/10] 01:36:45, metric 1
                    >  to 123.123.123.1 via ge-0/0/0.0
2.2.2.2/32         *[OSPF/10] 01:36:45, metric 1
                    >  to 123.123.123.2 via ge-0/0/0.0
6.6.6.6/32         *[OSPF/10] 01:36:50, metric 2
                    >  to 34.34.34.4 via ge-0/0/2.0
<snip>
TO-R4.inet.0: 7 destinations, 7 routes (7 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

0.0.0.0/0          *[Static/5] 01:37:40
                    >  to 34.34.34.4 via ge-0/0/2.0
34.34.34.0/24      *[Direct/0] 01:37:40
                    >  via ge-0/0/2.0
34.34.34.3/32      *[Local/0] 01:37:40
                       Local via ge-0/0/2.0
35.35.35.0/24      *[Direct/0] 01:37:40
                    >  via ge-0/0/3.0
35.35.35.3/32      *[Local/0] 01:37:40
                       Local via ge-0/0/3.0
123.123.123.0/24   *[Direct/0] 01:37:40
                    >  via ge-0/0/0.0
123.123.123.3/32   *[Local/0] 01:37:40
                       Local via ge-0/0/0.0
<snip>
TO-R5.inet.0: 7 destinations, 7 routes (7 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

0.0.0.0/0          *[Static/5] 01:37:40
                    >  to 35.35.35.5 via ge-0/0/3.0
34.34.34.0/24      *[Direct/0] 01:37:40
                    >  via ge-0/0/2.0
34.34.34.3/32      *[Local/0] 01:37:40
                       Local via ge-0/0/2.0
35.35.35.0/24      *[Direct/0] 01:37:40
                    >  via ge-0/0/3.0
35.35.35.3/32      *[Local/0] 01:37:40
                       Local via ge-0/0/3.0
123.123.123.0/24   *[Direct/0] 01:37:40
                    >  via ge-0/0/0.0
123.123.123.3/32   *[Local/0] 01:37:40
                       Local via ge-0/0/0.0
<snip>

FBF用に作成した「TO-R4.inet.0」と「TO-R5.inet.0」が存在して、かつDefault Routeがそれぞれ異なってますね。
Directな各インターフェイスのネットワーク情報もinet.0からimportされています。

では実際にvJR-01とvJR-02からPingを飛ばしてみましょう。

//vJR-01
lab@vJR-01# run ping 6.6.6.6 source 1.1.1.1 record-route
PING 6.6.6.6 (6.6.6.6): 56 data bytes
64 bytes from 6.6.6.6: icmp_seq=0 ttl=62 time=5.022 ms
RR:     34.34.34.3
        46.46.46.4
        6.6.6.6
        34.34.34.4
        123.123.123.3
        1.1.1.1
64 bytes from 6.6.6.6: icmp_seq=1 ttl=62 time=9.512 ms (same route)
64 bytes from 6.6.6.6: icmp_seq=2 ttl=62 time=5.364 ms (same route)
//vJR-02
lab@vJR-02# run ping 6.6.6.6 source 2.2.2.2 record-route
PING 6.6.6.6 (6.6.6.6): 56 data bytes
64 bytes from 6.6.6.6: icmp_seq=0 ttl=62 time=4.138 ms
RR:     35.35.35.3
        56.56.56.5
        6.6.6.6
        34.34.34.4
        123.123.123.3
        2.2.2.2
64 bytes from 6.6.6.6: icmp_seq=1 ttl=62 time=8.999 ms (same route)
64 bytes from 6.6.6.6: icmp_seq=2 ttl=62 time=6.224 ms (same route)

vJR-01とvJR-02にて、それぞれvJR-03から転送される際は異なる経路になってますね!

あと、特定のSource IPアドレス(1.1.1.1 or 2.2.2.2)以外のIPアドレスからPingを飛ばしてみます。

//vJR-01
lab@vJR-01# run ping 6.6.6.6 record-route
PING 6.6.6.6 (6.6.6.6): 56 data bytes
64 bytes from 6.6.6.6: icmp_seq=0 ttl=62 time=6.385 ms
RR:     34.34.34.3
        46.46.46.4
        6.6.6.6
        34.34.34.4
        123.123.123.3
        123.123.123.1
64 bytes from 6.6.6.6: icmp_seq=1 ttl=62 time=4.213 ms (same route)
64 bytes from 6.6.6.6: icmp_seq=2 ttl=62 time=8.404 ms (same route)
//vJR-02
lab@vJR-02# run ping 6.6.6.6 record-route
PING 6.6.6.6 (6.6.6.6): 56 data bytes
64 bytes from 6.6.6.6: icmp_seq=0 ttl=62 time=3.356 ms
RR:     34.34.34.3
        46.46.46.4
        6.6.6.6
        34.34.34.4
        123.123.123.3
        123.123.123.2
64 bytes from 6.6.6.6: icmp_seq=1 ttl=62 time=4.831 ms (same route)
64 bytes from 6.6.6.6: icmp_seq=2 ttl=62 time=8.790 ms (same route)

いずれもvJR03からvJR-04へ転送しているので、おそらく(inet.0の)ルーティングテーブルを参照して転送していそうです。

念のため、OSPFのmetric値を調整してvJR-03~vJR-05~vJR-06の経路が優先されるようにし、再度Ping飛ばしてみます。

//OSPF経路の変更(vJR-03~vJR-05~vJR-06経路を優先)
//vJR-03
lab@vJR-03# run show route 6.6.6.6

inet.0: 12 destinations, 12 routes (12 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

6.6.6.6/32         *[OSPF/10] 00:03:55, metric 200
                    >  to 35.35.35.5 via ge-0/0/3.0
<snip>
//vJR-06
lab@vJR-06# run show route

inet.0: 11 destinations, 11 routes (11 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

1.1.1.1/32         *[OSPF/10] 00:01:04, metric 201
                    >  to 56.56.56.5 via ge-0/0/1.0
2.2.2.2/32         *[OSPF/10] 00:01:04, metric 201
                    >  to 56.56.56.5 via ge-0/0/1.0
<snip>
//FBF term0011にマッチしたPing
//vJR-01
lab@vJR-01# run ping 6.6.6.6 source 1.1.1.1 record-route
PING 6.6.6.6 (6.6.6.6): 56 data bytes
64 bytes from 6.6.6.6: icmp_seq=0 ttl=62 time=3.805 ms
RR:     34.34.34.3
        46.46.46.4
        6.6.6.6
        35.35.35.5
        123.123.123.3
        1.1.1.1
64 bytes from 6.6.6.6: icmp_seq=1 ttl=62 time=5.530 ms (same route)
64 bytes from 6.6.6.6: icmp_seq=2 ttl=62 time=6.440 ms (same route)
//vJR-03からvJR-04へパケットを転送している。
//FBF term0021にマッチしたPing
//vJR-02
lab@vJR-02# run ping 6.6.6.6 source 2.2.2.2 record-route
PING 6.6.6.6 (6.6.6.6): 56 data bytes
64 bytes from 6.6.6.6: icmp_seq=0 ttl=62 time=3.749 ms
RR:     35.35.35.3
        56.56.56.5
        6.6.6.6
        35.35.35.5
        123.123.123.3
        2.2.2.2
64 bytes from 6.6.6.6: icmp_seq=1 ttl=62 time=6.204 ms (same route)
64 bytes from 6.6.6.6: icmp_seq=2 ttl=62 time=4.899 ms (same route)
//vJR-03からvJR-05へパケットを転送している。
//vJR-01からFBFにマッチしないPing
//vJR-01
lab@vJR-01# run ping 6.6.6.6 record-route
PING 6.6.6.6 (6.6.6.6): 56 data bytes
64 bytes from 6.6.6.6: icmp_seq=0 ttl=62 time=3.353 ms
RR:     35.35.35.3
        56.56.56.5
        6.6.6.6
        35.35.35.5
        123.123.123.3
        123.123.123.1
64 bytes from 6.6.6.6: icmp_seq=1 ttl=62 time=5.989 ms (same route)
64 bytes from 6.6.6.6: icmp_seq=2 ttl=62 time=5.772 ms (same route)
//vJR-03からvJR-05へパケットを転送している。
//vJR-02からFBFにマッチしないPing
//vJR-02
lab@vJR-02# run ping 6.6.6.6 record-route
PING 6.6.6.6 (6.6.6.6): 56 data bytes
64 bytes from 6.6.6.6: icmp_seq=0 ttl=62 time=3.770 ms
RR:     35.35.35.3
        56.56.56.5
        6.6.6.6
        35.35.35.5
        123.123.123.3
        123.123.123.2
64 bytes from 6.6.6.6: icmp_seq=1 ttl=62 time=5.019 ms (same route)
64 bytes from 6.6.6.6: icmp_seq=2 ttl=62 time=6.804 ms (same route)
//vJR-03からvJR-05へパケットを転送している。

下2つの、特定のSource IPアドレス(1.1.1.1 or 2.2.2.2)以外のIPアドレスの場合はvJR-05経由となったので、(inet.0の)ルーティングテーブルを参照して転送してますね!

という訳でFBFの検証でした。今回は以上になります!
ありがとうございました!!

4. 参考資料

Juniper Networks Documentation - Example: Configuring Filter-Based Forwarding
www.juniper.net
Juniper Networks Documentation - Junos CLI Reference - rib-groups
www.juniper.net




以上の内容はhttps://yokohama539.hatenablog.com/entry/2025/02/24/164036より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14