このような問題は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コマンドで確認できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
ポリシーベースルーティングとは(デフォルトルーティングとの違い)
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
・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
複数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
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
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
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"
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
確認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の経路設計なども含む実践的な内容で、実務に直結するスキルを習得できます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:tsharkコマンドでLinuxのパケット解析をスクリプト化する方法|tcpdumpとの違い・フィールド抽出・JSON出力の実践手順
- この記事の属するカテゴリ:ネットワーク管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます