Linuxのip ruleコマンドでポリシーベースルーティングを設定する方法|複数NICで出口経路を強制する実践手順

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxコマンド > ネットワーク管理コマンド > Linuxのip ruleコマンドでポリシーベースルーティングを設定する方法|複数NICで出口経路を強制する実践手順
「社内セグメント用のNICと外部向けのNICを2枚挿したのに、なぜかどちらの通信も同じゲートウェイ経由になってしまう」
このような問題はLinuxサーバーで複数のNICを扱う場面でよく出てきます。

デフォルト設定のままでは、Linuxのルーティングは1本のデフォルトゲートウェイにすべてのトラフィックを流します。NICが2枚あっても、出口は1つのゲートウェイに集中するのが基本動作です。

この問題を解決するのがポリシーベースルーティング(Policy-Based Routing:PBR)です。ip ruleとip routeコマンドを組み合わせることで、「このIPから送るパケットはこちらのゲートウェイへ」という送信元ベースの経路制御ができるようになります。

この記事では、RHEL 9系(Rocky Linux 9含む)とUbuntu 22.04 LTSを想定環境として、ip ruleによるポリシーベースルーティングの仕組みから設定手順・永続化・トラブルシュートまでを解説します。

この記事のポイント

・ip rule add でソースIPごとに使うルーティングテーブルを指定できる
・ip route add table N でNICごとの経路をテーブルに分離して管理する
・設定はOS再起動で消えるためnmcliまたはnetplanで永続化が必須
・ip route get で実際に選ばれる経路を1コマンドで確認できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

ポリシーベースルーティングとは(デフォルトルーティングとの違い)

Linuxのルーティングはルーティングテーブルという経路情報のリストを参照してパケットの出口を決めます。通常の設定では「mainテーブル」と呼ばれる1つのテーブルだけを使い、すべてのパケットがそこに書かれたルートに従って転送されます。

この方式では「送信元IPに関係なく、同じ宛先なら同じ出口を使う」という動作になります。NICが2枚あっても、両方のIPから来たパケットが同じデフォルトゲートウェイへ流れてしまうのはこのためです。

ポリシーベースルーティングでは、複数のルーティングテーブルを用意して、ip ruleコマンドで「このパケットはこのテーブルで経路を調べる」というルールを追加します。パケットが届いたとき、Linuxカーネルは優先度順にルールを確認し、最初にマッチしたルールが指すテーブルで経路を決定します。
方式 経路の決め方 ユースケース
通常のルーティング 宛先アドレスのみで決定 NICが1枚、または片方だけ使う
ポリシーベースルーティング 送信元IP・NIC・マーク等で決定 NIC2枚を独立したセグメントに使い分ける

現在のルールとルーティングテーブルを確認する

設定を始める前に、ip rule showとip route showで現在の状態を確認します。

ip rule show

出力例(環境により異なります)

0: from all lookup local 32766: from all lookup main 32767: from all lookup default

デフォルトでは3つのルールが表示されます。先頭の数字は優先度で、小さい方が先に評価されます。
・0(local):ループバックや同一ホスト内のパケット用
・32766(main):通常のルーティングテーブル(ip routeで追加した経路が入る)
・32767(default):mainテーブルに一致しなかった場合の最終テーブル(通常は空)

続いてmainテーブルの現在の経路を確認します。

ip route show

出力例(環境により異なります)

default via 192.168.1.1 dev ens192 proto static metric 100 10.0.0.0/24 dev ens224 proto kernel scope link src 10.0.0.10 metric 101 192.168.1.0/24 dev ens192 proto kernel scope link src 192.168.1.50 metric 100

この例ではens192(192.168.1.50)とens224(10.0.0.10)の2枚のNICがあります。デフォルトルートは192.168.1.1(ens192側)のみ設定されており、10.0.0.0/24宛て以外のパケットはすべてens192経由になっています。

複数NICの経路を分離する手順

ens224(10.0.0.10)から送信するパケットをens224側のゲートウェイ(10.0.0.1)経由で出すように設定する手順を説明します。

1. カスタムテーブル番号を/etc/iproute2/rt_tablesに追記する

ルーティングテーブルには番号と名前をつけて管理します。/etc/iproute2/rt_tablesに追記することで、番号ではなく名前で参照できるようになります。

echo "200 rt_ens224" >> /etc/iproute2/rt_tables

番号(ここでは200)は1~252の範囲で既存のものと重複しなければ何番でも構いません。

2. カスタムテーブルにルートを登録する

作成したテーブルにens224の経路を登録します。table rt_ens224オプションでテーブルを指定します。

# ens224側のデフォルトゲートウェイを登録する ip route add default via 10.0.0.1 dev ens224 table rt_ens224 # ens224のローカルネットワーク経路も追加する ip route add 10.0.0.0/24 dev ens224 scope link table rt_ens224

テーブルの内容を確認します。

ip route show table rt_ens224

出力例(環境により異なります)

default via 10.0.0.1 dev ens224 10.0.0.0/24 dev ens224 scope link

【重要】リモートサーバーで作業する場合の注意

SSHなどリモート接続中のサーバーでルーティング設定を変更すると、設定ミスにより接続が切れる場合があります。変更前にコンソールアクセス(KVM・IPMIなど)を確保するか、設定が消える仮想サーバーの場合はスナップショットを取得してから作業することを強くお勧めします。設定を元に戻すにはip rule del from 10.0.0.10とip route flush table rt_ens224を実行します。

3. ip ruleでソースIPに基づくポリシーを設定する

テーブルに経路を登録しただけでは機能しません。「ens224のIPから来たパケットはrt_ens224テーブルで経路を調べる」というルールをip rule addで追加します。

ip rule add from 10.0.0.10 table rt_ens224 priority 100

priorityは既存ルール(32766)より小さい値にします。ここでは100を指定します。

ip rule showで追加されたことを確認します。

ip rule show

出力例(環境により異なります)

0: from all lookup local 100: from 10.0.0.10 lookup rt_ens224 32766: from all lookup main 32767: from all lookup default

4. ip route getで経路を確認する

ip route getコマンドを使うと、特定の送信元IPから特定の宛先に送った場合にどのルートが選ばれるかを確認できます。

# ens224のIPから外部への経路を確認する ip route get 8.8.8.8 from 10.0.0.10 # ens192のIPからの経路(mainテーブルが使われる) ip route get 8.8.8.8 from 192.168.1.50

出力例(環境により異なります)

# from 10.0.0.10 の場合 8.8.8.8 from 10.0.0.10 via 10.0.0.1 dev ens224 table rt_ens224 src 10.0.0.10 uid 0 cache # from 192.168.1.50 の場合 8.8.8.8 from 192.168.1.50 via 192.168.1.1 dev ens192 src 192.168.1.50 uid 0 cache

10.0.0.10からのパケットが10.0.0.1(ens224側)経由になっていれば設定成功です。ポートレベルの疎通確認にはLinux ポート確認の全コマンドで紹介しているssコマンドやncコマンドも活用できます。

OS再起動後も設定を維持する永続化の方法

ここまでの設定はメモリ上のみで有効です。OSを再起動するとip rule・ip routeで追加した設定は消えます。永続化の方法はディストリビューションによって異なります。

ネットワーク設計を含む実践的なLinuxサーバー構築スキルを体系的に習得したい場合は、Linux Master Pro Seminarでハンズオン形式で学ぶ方法もあります。

RHEL 9 / Rocky Linux 9(NetworkManager/nmcli)

RHEL 9系ではNetworkManagerのルーティングルール機能を使います。接続プロファイル名を確認してから設定します。

# 接続プロファイル名を確認する nmcli connection show # ens224プロファイルにip routeを追加する(table=200を指定) nmcli connection modify "ens224" +ipv4.routes "0.0.0.0/0 10.0.0.1 200 table=200" nmcli connection modify "ens224" +ipv4.routes "10.0.0.0/24 0.0.0.0 0 table=200" # ip ruleを追加する(NetworkManager 1.26以降) nmcli connection modify "ens224" +ipv4.routing-rules "priority 100 from 10.0.0.10 table 200" # /etc/iproute2/rt_tablesへの追記は別途必要(この設定はOS再起動後も残る) echo "200 rt_ens224" >> /etc/iproute2/rt_tables # 設定を反映する nmcli connection up "ens224"

nmcliを使ったネットワーク設定全般については、Linux DNS 設定の基本でNetworkManagerとnmcliの基本的な使い方を解説しています。

Ubuntu 22.04 LTS(Netplan)

UbuntuのNetplanではrouting-policyセクションを使います。/etc/netplan/配下の設定ファイルを編集します。

# /etc/netplan/01-netcfg.yaml の記述例 network: version: 2 ethernets: ens224: addresses: - 10.0.0.10/24 routes: - to: default via: 10.0.0.1 table: 200 - to: 10.0.0.0/24 via: 0.0.0.0 table: 200 routing-policy: - from: 10.0.0.10 table: 200 priority: 100

設定を書いたらnetplan applyで反映します。netplan tryを使うと指定時間後に自動ロールバックするため、接続が切れた場合の保険になります。

トラブルシュート:ip ruleが機能しない時の確認手順

設定したのに期待どおりに動かない場合、以下の順番で確認します。

確認1:ルールが追加されているか(ip rule show)

ip rule show

追加したルールが表示されない場合はip rule addが成功していません。再実行してエラーメッセージを確認します。

確認2:優先度がmainテーブル(32766)より小さいか
ip rule showの先頭の数字(priority)を確認します。32766以上の場合、mainテーブルが先に参照されてルールが無視されます。

確認3:テーブルに経路が入っているか

ip route show table rt_ens224

テーブルが空の場合はip route add ... table rt_ens224が実行されていないか失敗しています。

確認4:ip route getで実際の経路を確認する

ip route get 8.8.8.8 from 10.0.0.10

期待するNIC経由になっていない場合は、ルールかテーブルの設定に誤りがあります。

確認5:/etc/iproute2/rt_tablesにテーブル名があるか
テーブル名(rt_ens224)を指定してコマンドが通らない場合は、/etc/iproute2/rt_tablesへの追記が漏れています。

本記事のまとめ

やりたいこと コマンド
現在のルールを確認する ip rule show
mainテーブルの経路を確認する ip route show
カスタムテーブルの経路を確認する ip route show table テーブル名
カスタムテーブルにルートを追加する ip route add default via GW dev NIC table テーブル名
ソースIPに基づくルールを追加する ip rule add from 送信元IP table テーブル名 priority N
特定の送信元からの経路を確認する ip route get 宛先IP from 送信元IP
RHEL 9系で永続化する nmcli connection modify 接続名 +ipv4.routing-rules "..."
Ubuntuで永続化する Netplanのrouting-policyセクションに記載

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、ネットワーク設計からサーバー構築まで一貫して学べる2日間のハンズオンセミナーを開催しています。複数NICの経路設計なども含む実践的な内容で、実務に直結するスキルを習得できます。

>> Linux Master Pro Seminarの詳細・日程はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。