はじめに
人生には3つの坂があると言います。上り坂、下り坂、そして――「まさか」。
普段は「安全で枯れた技術」「安全施工
」を愛してやまない私ですが、現場というものは時にそんな綺麗事ばかりでは済まないこともございます。
本当にどうやっても・・困った。。。という時には理屈を超えたトリッキーな実装を求められることもあります。いわゆる「まさか」というやつです。
とはいえ、実験もせずに机上の空論で現場に臨むのは無謀というもの。今日はL3SWではなく、F5 BIG-IP を使った PBR (Policy Based Routing) の確認をしてみました。いわゆる基礎実験です。
1. 【おさらい】PBR とは
PBR (Policy Based Routing) とは、通常の宛先ベースのルーティングとは異なり、送信元IPアドレスやプロトコルなど、特定の条件(ポリシー)に基づいて転送先のネクストホップを強制的に制御する技術です。
CiscoやARISTA、H3C等のL3SWではよくroute-mapにひっかけて方路を曲げたりします。
2. 試験環境
今回は完全closedな世界で行います。
図解:ベーストポロジー
*補足:今回は2つのGatewayがシステム内にあることを模しています。
Default Routeなgatewayは右上の192.68.20.254。(VMで受けています。その先のGlobalなNWも1台で賄うミニマム。)
また左上 物理L3スイッチ(Cat 3560CX)を2つ目の迂回用Gateway(192.168.20.200)としています。
BIG-IPにはExternal/Internal両方のVLANを収容し、ルーティングの決定権を握らせる構成です。*
各種設定

補足:Self IPの設定です。simple is Best。

補足:デフォルトゲートウェイの設定です。普段はこの .254 を向いていますが、ここをどう回避するかが本題となります。

補足:VSの設定です。TypeはForwarding(IP)。FastL4プロファイル。でL3 Forwardしてくれます。
SNAT automapつけても動きますが、今回は判りやすいように外しました。
Auto Last Hopも検証のため外しておきます。(今回外から中通信はございませんが。)
試験用ホスト群

補足:Hyper-V上のVMたちです。こういう実験がすぐに出来るのが仮想化の旨味ですね。
3. 事前確認
PBRを入れる前は、パケットは素直にDGW(192.168.20.254)へ向かいます。迂回路となる 192.168.20.200 への通信がないことを確認します。(全ては右上のGateway相当へ。)

補足:pingの応答やキャプチャで、正しくデフォルトゲートウェイ経由で通信されていることを確認しました。
4. では、お待ちかねの(?)PBRを入れてみましょう。
洒落た機能はありませんので、L3FWDなVSとiRulesの組み合わせでいきます。
実装した iRule
実はFLOW_INIT ではハードウェア処理が強すぎて命令が通りませんでした。hitせず方路曲がらず。
イベント CLIENT_ACCEPTED で検証を実施しました。
Source IPが10.10.10.1(青VM)だったら、緑VM(5.6.7.8)があるGW(192.168.20.200)へPBRします。
iRules_PBR_VAL_hosts_to_VAL_IF
when CLIENT_ACCEPTED {
set src_ip [IP::client_addr]
set dst_ip [IP::local_addr]
if { [IP::client_addr] eq "10.10.10.1" } {
nexthop External 192.168.20.200
log local0. "PBR Debug_to_200: Client=$src_ip, Destination=$dst_ip, NextHop=192.168.20.200"
}
}

補足:iRuleの定義です。トレーサーは入れていますが、実際に使用される際はtraffic見合いでどうぞ。

補足:VSへのiRule紐付けです。忘れがちですが、ここが抜けていると永久に悩むことになります。(実際にあれ?となりました。作って満足ではヨクナイですね。)

補足:既存コネクションの削除です。FastL4を使っていると、このコネクションテーブルを掃除しない限り、古いルーティング情報のまま動き続けることがあるため注意が必要です。
結果確認

補足:青VM(10.10.10.1)、黄VM(10.10.10.2)共に其々(1.2.3.4)(5.6.7.8)宛にpingを投げ続けています。
青VM(10.10.10.1)はPBRで方路が曲げられます。よって(5.6.7.8)のみ疎通性あり。
黄VM(10.10.10.2)はiRulesにhitしないので、通常のDGWに沿って(1.2.3.4)のみ疎通性あり。
基本形ですが、トレーサーからもPBRは効いたことを目視確認
しました。
おわりに
トリッキーなことを好んでやる必要はありません。本件のような手法に頼らず済む、関係者全員が総じてhappyになれる別の解法があれば、そちらを優先して採用すべきでしょう。
技術的な自己満足よりも、関わる人間全員が幸せになれる「設計の最適解」を優先する。それが現場の良識というものです。とはいえ、万が一の「まさか」の事態に備え、こうした”引き出し”を肌感覚で知っておくことも必要かと思います。

引用
K20510467: Implementing policy-based routing with an IP forwarding virtual server using iRules
https://my.f5.com/manage/s/article/K20510467
※Data Group Listにhostを列挙することもできそうですね。
K7595: Overview of IP forwarding virtual servers
https://my.f5.com/manage/s/article/K7595

