デフォルトのルーティングテーブルがボトルネックになる時
午前2時、監視システムがアラートを発しました。会社の100Mbps専用線が使用率98%に達しています。Pingは500msまで跳ね上がり、顧客からはウェブサイトの読み込みが異常に遅いという苦情が届き始めました。ゲートウェイにSSHでログインして原因を突き止めたところ、あるrsyncスクリプトが数百GBのバックアップデータをクラウドに転送していました。デフォルトでは、LinuxはDestination IP(宛先IP)のみを見てパケットの送り先を決定します。それが顧客の優先トラフィックなのか、システムのバックアップパケットなのかは考慮されません。
これを解決するために必要なのが、Policy-Based Routing (PBR)です。宛先に基づいて盲目的にルーティングするのではなく、PBRを使用すると、送信元IP、サービスの種類、またはポートに基づいてトラフィックを分流できます。これは、マルチホーム構成や回線コストの最適化が必要なデータセンターを管理する上で、不可欠なスキルです。
最強のコンビ:RuleとTable
iproute2の世界では、PBRは主に2つの概念に基づいて動作します:
- Routing Table(ルーティングテーブル):
mainテーブルだけを使う必要はありません。Linuxでは最大255個の独立したルーティングテーブルを作成でき、各テーブルに独自のゲートウェイを設定できます。 - Routing Policy Database (RPDB): これは制御ロジックの層です。
ip ruleコマンドを介して、どのパケットをどのルーティングテーブルで検索するかを決定します。
RPDBを郵便物の仕分け係に例えてみましょう。社長室(送信元IP)からの手紙は優先トレイ(テーブルA)に入れられ、広告メールは通常トレイ(テーブルB)に送られるといった具合です。
実践:バックアップサーバーのトラフィックを分離する
ゲートウェイサーバーに2つの接続があると仮定します:
eth0: ISP A(メイン)、IP 192.168.1.10、ゲートウェイ 192.168.1.1eth1: ISP B(バックアップ/低コスト)、IP 10.0.0.10、ゲートウェイ 10.0.0.1
目標:メイン回線を解放するため、バックアップマシン(192.168.1.50)からの全トラフィックをISP B経由で送信する。
1. 新しいルーティングテーブルの作成
まず、数字だけでは分かりにくいため、ルーティングテーブルに名前を付けます。/etc/iproute2/rt_tablesファイルを開きます:
echo "100 backup_line" | sudo tee -a /etc/iproute2/rt_tables
2. 新しいテーブルのルート設定
次に、backup_lineテーブルの出口を定義します。注意:このステップを忘れると、新しいテーブルが空であるためパケットが「迷子」になります。
# テーブル100のデフォルトゲートウェイを指定
sudo ip route add default via 10.0.0.1 dev eth1 table backup_line
# サーバーがLANとの通信を失わないよう、内部ネットワークのルートを維持
sudo ip route add 192.168.1.0/24 dev eth0 table backup_line
3. ルーティングルールの有効化
これが送信元IPと作成したルーティングテーブルを結びつける重要なステップです:
sudo ip rule add from 192.168.1.50 lookup backup_line
<a href="https://itfromzero.com/ja/network/linux%e3%81%a7%e3%81%ae%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e6%8e%a5%e7%b6%9a%e5%95%8f%e9%a1%8c%e3%81%ae%e8%a8%ba%e6%96%ad%e3%81%a8%e3%83%88%e3%83%a9%e3%83%96%e3%83%ab%e3%82%b7.html">ip rule</a> showコマンドで確認してください。新しいルールがプライオリティ32765に表示されます。この瞬間から、.50からのすべてのパケットは、メインのルーティングテーブルの設定に関わらず、10.0.0.1を経由するように強制されます。
高度なテクニック:ポートによるルーティング (FWMARK)
送信元IPだけでは不十分な場合もあります。Webトラフィック(80, 443)は高速回線、TorrentやFTPは低速回線に振り分けたい場合はどうすればよいでしょうか?この場合、iptablesを使用してパケットに「ラベル」を貼る必要があります。
ステップ1:パケットのマーキング
mangleテーブルを使用して、HTTPSパケットにラベル番号2を割り当てます:
sudo iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 2
ステップ2:ラベルによるルーティング
IPでフィルタリングする代わりに、fwmarkでフィルタリングします:
sudo ip rule add fwmark 2 lookup high_speed_table
sudo ip route flush cache
再起動後も設定を維持する方法
ipコマンドによる設定は、マシンの再起動時に消失します。最新のUbuntuでは、永続性を確保するためにNetplan(/etc/netplan/01-netcfg.yaml)に設定を記述します:
routing-policy:
- from: 192.168.1.50
table: 100
priority: 10
routing-tables:
- name: backup_line
id: 100
回避すべき落とし穴 (トラブルシューティング)
長年の運用経験から、デバッグで徹夜しないための3つの重要な注意点を挙げます:
- rp_filterという名の罠: Linuxはデフォルトで、パケットの行きと帰りの経路が一致しない場合、そのパケットをブロックします(非対称ルーティング)。
net.ipv4.conf.all.rp_filter=2を設定して、このチェックを緩和してください。 - 優先順位: ID(プライオリティ)が低いルールほど先に処理されます。上に汎用的なルールを置いてしまうと、下の詳細なルールが無視されることがあります。
- 静かなる落とし穴: 常に
tcpdump -i eth1 -nを使用して、トラフィックが実際に期待通りのインターフェースから出ているかを確認してください。設定テーブルだけを信じてはいけません。
PBRは単なるネットワークのテクニックではありません。これはインフラの制御権を取り戻し、硬直したネットワーク回線をより柔軟でインテリジェントなものに変えるためのツールです。設定の成功を祈っています!
