Debianのルーティングポリシーについて
前回strongSwan(vici)でIPsecを構築しました。それを利用していると220というIDをもった通常とは違ったルーティングテーブルが作成されるようです。
基本的なルーティングについては過去に勉強しましたが、それだけでは不足なようです。そこで、今回はルーティングポリシーについて勉強して220というルーティングテーブルの謎を解明します。
複数のルーティングテーブル
Debianではルーティングテーブルが複数持てるようになっています。その確認方法は管理者権限で次のようにします。
0: | from all | lookup local |
220: | from all | lookup 220 |
32766: | from all | lookup main |
32767: | from all | lookup default |
この表のことを「ルーティングポリシー」と呼ぶようです。順に優先順位、セレクタ、アクションとなっています。これらの説明は後からしますので、まずはlookupのあとにある文字を拾ってみます。
local、220、mail、default。これらがテーブルIDになります。通常存在するのはlocal、main、defaultです。特に指示せずにルールを書き込んだ場合はmainテーブルに書き込まれます。今まで「ip route add」コマンドを入力していた時、実はmainテーブルを指定して設定を書き込んでいたという事になります。
localテーブルはカーネルが管理するテーブルでlocalアドレスとbroadcastアドレスで構成されます。また、defaultテーブルは通常空の予備テーブルです。
ルーティングをする際、ルーティングポリシーを参照し、優先順位の若いものから判定していき、ルート情報を得られた段階で処理終了します。
それぞれのテーブルを指定して、ルーティングテーブルを表示するには「ip route show table テーブル名」とします。テーブル名をmainとした時は「ip route」コマンドと同じ結果が得られると思います。
このコマンドで表示されるリストの見方ですが、まず対象となるネットワークが入ります。defaultはデフォルトルートを示します。それ以降は接頭に応じた情報が次の項目に入ります。
各接頭が意味するものは次の通りです。
- via
NEXT HOP値
- dev
送信されるイーサネットアダプタ名
- proto
staticだと静的ルーティング、kernelだとカーネルによるルーティングです。
- scope
linkの場合は直接接続、hostの場合は自身への接続
- src
送信元となるIPアドレス
これらの情報は、Qiita:「ip routeコマンドの出力結果の意味」を参考にさせていただきました。ありがとうございました。
セレクタには通常「from all」が入っています。これはすべての通信を対象にするものです。allの代わりに「IPアドレス/マスク長」として送信元による条件を加えたり、fromをtoにして宛先アドレス毎に変更したり、先頭に「not」を付けて反転させたりできます。詳しくは「man ip route」で表示されます。
アクションには通常「lookup テーブルID」が入っています。これは指定されたルーティングテーブルを参照します。通常はテーブルを参照するにとどまると思いますが、テーブルのほかプロトコルを指定したりもできるようです。
ルーティングポリシーへの追加
ルーティングポリシーを追加削除するには次のようにします。ここでは優先順位=50、テーブルID=110のテーブルを追加し、使われていないdefaultテーブルを削除してみたいと思います。ポリシーから削除しても各テーブルに設定済みのルールは消えません。
# ip rule del teble default
テーブルIDを指定してルート情報を追加するにはtableの後にIDを入力します。
ルーティングの確認
任意のIPアドレスに対してどのテーブルのルールが適用されているかを調べるには次のようにします。
この例では、172.168.1.1への経路はテーブルID=220に記述されているものが利用されます。また送信の際は、ens3インターフェースの先にある123.456.789.9のゲートウェイが利用され、送信元は123.456.789.1となります。
ルーティング情報の永続化
基本的にOSに設定した、ルーティングポリシーや、ルート情報は再起動で消えてしまいます。そこでスクリプトを使って、設定を復元させます。
Debianにおいいては「/etc/network/if-up.d」のインターフェース稼働時のにshスクリプトを保存するか、/etc/network/interfacesの対象インターフェースのエントリーにpost-up の行を追加し後に実行したいコマンドを記述するかになります。
筆者が前回設定したstrongSwanにはupdown用にスクリプトがあります。接続時と切断時で処理を分ける場合は呼び出したスクリプト内で「$PLUTO_VERB」という変数を使います。この値には接続時は「up-host」切断時は「down-host」という文字列が入っています。