Solaris のシステム管理 (IP サービス)

第 25 章 Oracle Solaris IP フィルタ (概要)

この章では、Oracle Solaris IP フィルタの概要を紹介します。Oracle Solaris IP フィルタを使用した作業については、第 26 章Oracle Solaris IP フィルタ (作業)を参照してください。

この章では、次の内容について説明します。

Oracle Solaris IP フィルタの新機能

この節では、Oracle Solaris IP フィルタの新しい機能について説明します。

新機能の完全な一覧や各 Oracle Solaris リリースの説明については、『Oracle Solaris 10 9/10 の新機能』を参照してください。

パケットフィルタリングフック

Solaris 10 7/07 リリース以降では、Oracle Solaris でのパケットフィルタリングにパケットフィルタリングフックが使用されるようになりました。この機能は、システム管理に次のような利点をもたらします。

これらのフックの詳細については、「パケットフィルタリングフック」を参照してください。パケットフィルタリングフックに関する作業については、第 26 章Oracle Solaris IP フィルタ (作業)を参照してください。

Oracle Solaris IP フィルタの IPv6 パケットフィルタリング

Solaris 10 6/06: ネットワークインフラストラクチャーの全部または一部を IPv6 で構成しているシステム管理者のために、Oracle Solaris IP フィルタが IPv6 パケットフィルタリングに対応できるように拡張されています。IPv6 パケットフィルタリングでは、発信元または宛先の IPv6 アドレス、IPv6 アドレスを含むプール、および IPv6 拡張ヘッダーに基づいて、パケットを取り出すことができます。

ipf コマンドと ipfstat コマンドを IPv6 に使用できるように、-6 オプションが追加されています。ipmon コマンドと ippool コマンドのコマンド行インタフェースに変更はありませんが、これらのコマンドは IPv6 でも使用することができます。ipmon コマンドは、IPv6 パケットのログを記録できるように拡張されており、ippool コマンドは、IPv6 アドレスをプールに格納することができます。

詳細は、「IPv6 と Oracle Solaris IP フィルタ」を参照してください。IPv6 パケットフィルタリングに関する作業については、第 26 章Oracle Solaris IP フィルタ (作業)を参照してください。

Oracle Solaris IP フィルタとは

Oracle Solaris IP フィルタは、Oracle Solaris のファイアウォールソフトウェアとして SunScreen ファイアウォールを置き換えます。SunScreen ファイアウォール同様、Oracle Solaris IP フィルタは、ステートフルパケットフィルタリングとネットワークアドレス変換 (NAT) を行います。Oracle Solaris IP フィルタには、ステートレスパケットのフィルタリングとアドレスプールの作成と管理を行う機能もあります。

パケットのフィルタリングは、ネットワークベースの攻撃に対する基本的な保護を提供します。Oracle Solaris IP フィルタは、IP アドレス、ポート、プロトコル、ネットワークインタフェース、およびトラフィックの転送方向を元にフィルタリングを行うことができます。また、発信元 IP アドレス、宛先 IP アドレス、IP アドレスの範囲、またはアドレスプールによってもフィルタリングを行うことができます。

Oracle Solaris IP フィルタは、オープンソースの IP Filter ソフトウェアをベースにしています。オープンソースの IP Filter のライセンス契約、作者、および著作権宣言文を参照するためのデフォルトパスは、/usr/lib/ipf/IPFILTER.LICENCE です。Oracle Solaris がデフォルト以外の場所にインストールされている場合は、所定のパスを修正して、インストールした場所にあるファイルにアクセスします。

オープンソースの IP Filter の情報源

Darren Reed によるオープンソースの IP Filter ソフトウェアのホームページは、http://coombs.anu.edu.au/~avalon/ip-filter.html にあります。このサイトには、オープンソースの IP Filter に関する情報が含まれており、チュートリアル「IP Filter Based Firewalls HOWTO」(Brendan Conoboy および Erik Fichtner、2002) へのリンクも含まれています。このチュートリアルは、BSD UNIX 環境でファイアウォールを作成する方法を手順ごとに説明しています。このチュートリアルは BSD UNIX 環境向けに書かれていますが、Oracle Solaris IP フィルタの構成にも関連しています。

Oracle Solaris IP フィルタのパケット処理

Oracle Solaris IP フィルタは、パケットが処理されるときに一連の手順を実行します。次の図は、パケット処理の段階と、フィルタが TCP/IP プロトコルスタックとどのように統合されるかを示しています。

図 25–1 パケット処理の順序

Oracle Solaris IP フィルタのパケット処理に関連する手順の順序を示しています。

パケット処理には次の手順が含まれます。

OpenSolaris IP フィルタの使用ガイドライン

Oracle Solaris IP フィルタの構成ファイルの使用

Oracle Solaris IP フィルタを使用して、ファイアウォールサービスまたはネットワークアドレス変換 (NAT) を提供できます。Oracle Solaris IP フィルタは、ロード可能な構成ファイルを使用して実行できます。Oracle Solaris IP フィルタには、/etc/ipf というディレクトリがあります。/etc/ipf ディレクトリには、ipf.confipnat.conf および ippool.conf と呼ばれる構成ファイルを作成して、保存できます。 /etc/ipf ディレクトリに保存されている場合、これらのファイルは、起動プロセスで自動的にロードされます。構成ファイルを別の場所に保存して、これらのファイルを手動でロードすることも可能です。構成ファイルの例については、「Oracle Solaris IP フィルタ構成ファイルの作成と編集」を参照してください。

Oracle Solaris IP フィルタ規則セットの処理

ファイアウォールを管理するために、Oracle Solaris IP フィルタを使用して、ネットワークトラフィックをフィルタリングするために使用する規則セットを指定します。次の種類の規則セットを作成できます。

さらに、まとまった IP アドレスを参照するために、アドレスプールを作成することもできます。作成したプールは、あとで規則セット内で使用できます。アドレスプールは、規則処理を速めるために役立ちます。また、アドレスプールによって、大きなまとまりのアドレスをより簡単に管理できます。

Oracle Solaris IP フィルタのパケットフィルタリング機能の使用

パケットフィルタリング規則セットを使用して、パケットのフィルタリングを設定します。ipf コマンドで、パケットフィルタリング規則セットを処理します。ipf コマンドの詳細については、ipf(1M) コマンドを参照してください。

パケットフィルタリング規則は、ipf コマンドによってコマンド行で作成することも、パケットフィルタリングの構成ファイル内で作成することもできます。起動時にパケットフィルタリング規則をロードする場合は、パケットフィルタリング規則を保存する /etc/ipf/ipf.conf という構成ファイルを作成します。 起動時にパケットフィルタリング規則をロードしない場合は、適当な場所に ipf.conf ファイルを保存し、 ipf コマンドによってパケットフィルタリングを手動でアクティブ化します。

Oracle Solaris IP フィルタには、アクティブ規則セットと非アクティブ規則セットの 2 つのパケットフィルタリング規則セットを格納できます。大部分の場合、作業ではアクティブ規則セットを使用します。ただし、ipf -I コマンドを使用すると、コマンドアクションを非アクティブ規則リストに適用できます。非アクティブ規則リストは、ユーザーが選択しない限り、Oracle Solaris IP フィルタによって使用されることはありません。非アクティブ規則リストによって、アクティブなパケットのフィルタリングに影響を与えずに、規則を保存できます。

Oracle Solaris IP フィルタは、パケットを通過させる、またはブロックする前に、設定された規則リストの最初から最後まで規則を処理します。Oracle Solaris IP フィルタは、パケットを通過させるかどうかを決めるフラグを格納しています。フラグは、規則セット全体を調べ、最後に一致した規則を基にパケットを通過させるか、ブロックするかを決定します。

このプロセスには、2 つの例外があります。最初の例外は、パケットが quick キーワードを含む規則に一致した場合です。規則が quick キーワードを含む場合は、その規則に対する処理が実行され、それ以降の規則はチェックされません。2 番目の例外は、パケットが group キーワードを含む規則に一致した場合です。パケットがグループに一致すると、グループでタグ付けされた規則だけがチェックされます。

パケットのフィルタリング規則の構成

パケットのフィルタリング規則を作成するには、次の構文を使用します。

action [in|out] option keyword, keyword...

  1. 各規則がアクションを開始します。Oracle Solaris IP フィルタは、パケットが規則に一致する場合、アクションを実行します。次の一覧に、パケットに対して実行される一般的なアクションを示します。

    block

    パケットはフィルタを通過できません。

    pass

    パケットはフィルタを通過します。

    log

    パケットをロギングしますが、パケットをブロックするか、通過させるかの決定は行いません。ログを参照するには、ipmon コマンドを使用します。

    count

    フィルタの統計にパケットを含めます。統計を参照するには、 ipfstat コマンドを使用します。

    skip number

    フィルタは number フィルタリング規則をスキップします。

    auth

    パケット情報を確認するユーザープログラムが実行するパケット認証を要求します。このプログラムは、パケットを通過させるか、ブロックするかを決定します。

    preauth

    パケットの処理を決定するにあたって、フィルタが事前認証リストを参照するように要求します。

  2. アクション後の出力は、in または out のはずです。ユーザーの選択により、パケットのフィルタリング規則が、受信パケットと発信パケットのどちらに適用されるのかが決定されます。

  3. 次に、オプションの一覧からオプションを選択します。複数のオプションを使用する場合は、次の順序で使用してください。

    log

    規則が最後に一致した規則の場合、パケットをロギングします。ログを参照するには、ipmon コマンドを使用します。

    quick

    パケットが一致した場合、quick オプションを含む規則を実行します。これ以上の規則チェックは行われません。

    on interface-name

    パケットが指定したインタフェースを出入りする場合だけ、規則を適用します。

    dup-to interface-name

    パケットをコピーし、interface-name 上の複製を任意で指定した IP アドレスに送信します。

    to interface-name

    パケットを interface-name の出力キューに移動します。

  4. オプションの指定後、パケットが規則に一致するかどうかを決定するさまざまなキーワードを選択できます。次のキーワードは、以下の順序で使用してください。


    注 –

    デフォルトでは、構成ファイルのいずれの規則にも一致しないパケットは、すべてフィルタを通過します。


    tos

    16 進数または 10 進数の整数で表されたサービスタイプの値を基に、パケットをフィルタリングします。

    ttl

    生存期間の値を基に、パケットの一致を取ります。パケットに保存されている生存期間の値は、破棄される前にパケットがネットワーク上に存在できる期間を示します。

    proto

    特定のプロトコルに対して一致を取ります。/etc/protocols ファイルに指定されている任意のプロトコル名を使用したり、そのプロトコルを表す 10 進数の数を指定したりできます。キーワード tcp/udp は、TCP または UDP パケットとの一致を取るために使用できます。

    from/to/all/ any

    発信元 IP アドレス、宛先 IP アドレス およびポート番号のいずれか、 またはすべてに対して一致を取ります。all キーワードは、すべての発信元からのパケットおよびすべての宛先へのパケットを受諾するために使用します。

    with

    パケットに関連する指定された属性に対して一致を取ります。オプションがない場合にパケットを一致させるには、キーワードの前に not または no と記述します。

    flags

    設定されている TCP フラグを基にフィルタリングを行う TCP で使用します。TCP フラグについては、ipf(4) のマニュアルページを参照してください。

    icmp-type

    ICMP のタイプによってフィルタリングを行います。このキーワードは proto オプションが icmp に設定されているときに使用され、flags オプションが指定されているときは使用されません。

    keep keep-options

    保存しておくパケットの情報を決定します。使用可能な keep-options には、state オプションと frags オプションなどがあります。state オプションは、セッションに関する情報を、TCP、UDP、および ICMP パケットで保存できます。frags オプションは、パケットのフラグメントに関する情報を保存し、後のフラグメントにその情報を適用します。keep-options は、一致したパケットをアクセス制御リストのチェックなしで、通過させます。

    head number

    番号 number で指定されるフィルタリング規則に対して、新しいグループを作成します。

    group number

    デフォルトグループではなく、グループ番号 number のグループに規則を追加します。ほかのグループを指定しない場合は、すべてのフィルタリング規則がグループ 0 に保存されます。

次の例は、規則を作成するためにパケットのフィルタリング規則構文をまとめる方法を示しています。IP アドレス 192.168.0.0/16 からの受信トラフィックをブロックするには、規則リストに次の規則を含めます。


block in quick from 192.168.0.0/16 to any

パケットフィルタリング規則を記述するときの詳細な文法および構文については、ipf(4) のマニュアルページを参照してください。パケットのフィルタリングに関する作業については、「Oracle Solaris IP フィルタのパケットフィルタリング規則セットの管理」を参照してください。この例の IP アドレススキーム (192.168.0.0/16 ) については、 第 2 章TCP/IP ネットワークの計画 (手順)を参照してください。

Oracle Solaris IP フィルタの NAT 機能の使用

NAT は、発信元 IP アドレスと宛先 IP アドレスをほかのインターネットアドレスまたはイントラネットアドレスに変換するマッピング規則を設定します。これらの規則は、受信 IP パケットまたは発信 IP パケットの 発信元アドレスおよび宛先アドレスを変更し、パケットを送信します。また、NAT を使用して、あるポートから別のポートにトラフィックの方向を変更することもできます。NAT は、パケットに修正または方向の変更が行われても、パケットの完全性を維持します。

ipnat コマンドは、NAT 規則リストを処理するために使用します。ipnat コマンドの詳細については、ipnat(1M) コマンドを参照してください。

NAT 規則は、 ipnat コマンドを使用してコマンド行で作成することもNAT 構成ファイルで作成することもできます。NAT 構成規則は、ipnat.conf ファイルに保存されます。ネットワークアドレス変換を使用する場合は、ipnat.conf ファイルを作成します。 起動時に NAT 規則をロードしない場合は、適当な場所に ipnat.conf ファイルを保存し、ipnat コマンドによってパケットフィルタリングを手動でアクティブ化します。

NAT 規則の構成

次の構文で NAT 規則を作成します。

command interface-name parameters

  1. 各規則の冒頭には、次のコマンドのいずれかが記述されています。

    map

    ある IP アドレスまたはネットワークを規制のないラウンドロビン方式で別の IP アドレスまたはネットワークにマッピングします。

    rdr

    ある IP アドレスとポートのペアから別の IP アドレスとポートのペアにパケットの方向を変更します。

    bimap

    外部 IP アドレスと内部 IP アドレス間で双方向の NAT を確立します。

    map-block

    静的 IP アドレスをベースにした変換を確立します。このコマンドは、アドレスを指定の範囲に変換するアルゴリズムに基づいています。

  2. このコマンドのあとには、hme0 などのインタフェース名を記述します。

  3. 次に、NAT 構成を決定するさまざまなパラメータを選択します。次に、この種のパラメータの例をいくつか挙げます。

    ipmask

    ネットワークマスクを指定します。

    dstipmask

    ipmask が変換されるアドレスを指定します。

    mapport

    ポート番号の範囲と tcpudp または tcp/udp プロトコルを指定します。

次の例は、NAT 規則を作成するために NAT 規則の構文をまとめる方法を示しています。発信元アドレスが 192.168.1.0/24 のデバイス de0 から発信されるパケットを書き換え、外部に対して発信元アドレスが 10.1.0.0/16 であることを示すには、NAT 規則セットに次の規則を含めます。


map de0 192.168.1.0/24 -> 10.1.0.0/16

NAT 規則を記述する際の詳細な文法と形式については、ipnat(4) のマニュアルページを参照してください。

Oracle Solaris IP フィルタのアドレスプール機能の使用

アドレスプールは、アドレスとネットマスクのペアのまとまりに名前付けを行います。アドレスプールは、IP アドレスと規則の一致を取るために必要な時間を短縮します。また、アドレスプールによって、大きなまとまりのアドレスをより簡単に管理できます。

アドレスプール構成規則は、ippool.conf ファイルに保存されます。起動時にアドレスプール規則をロードする場合は、アドレスプールの規則を保存する /etc/ipf/ippool.conf というファイルを作成します。 起動時に アドレスプール規則をロードしない場合は、適当な場所に ippool.conf ファイルを保存し、ippool コマンドによってパケットフィルタリングを手動でアクティブ化します。

アドレスプールの構成

次の構文でアドレスプールを作成します。


table role = role-name type = storage-format number = reference-number
table

複数のアドレスへの参照を定義します。

role

Oracle Solaris IP フィルタでプールの役割を指定します。この時点で、参照できる役割は ipf だけです。

type

プールの保存形式を指定します。

number

フィルタリング規則が使用する参照番号を指定します。

たとえば、アドレスが 10.1.1.1 および 10.1.1.2 でネットワークが 192.16.1.0 のグループをプール番号 13 で参照する場合、アドレスプールの構成ファイルに次の規則を含めます。

table role = ipf type = tree number = 13 
{ 10.1.1.1/32, 10.1.1.2/32, 192.168.1.0/24 };

次に、フィルタリング規則のプール番号 13 を参照するには、次の例のような規則を構築します。


pass in from pool/13 to any

なお、プールへの参照を含む規則ファイルをロードする前に、プールファイルをロードする必要があります。プールファイルをロードしていない場合、次の出力のようにプールは未定義となります。


# ipfstat -io
empty list for ipfilter(out)
block in from pool/13(!) to any

プールをあとで追加しても、そのプールの追加によってカーネルの規則セットが更新されることはありません。そのプールを参照する規則ファイルも再ロードする必要があります。

パケットフィルタリング規則を記述するときの詳細な文法および構文については、ippool(4) のマニュアルページを参照してください。

パケットフィルタリングフック

Solaris 10 7/07 リリース以降では、pfil モジュールの代わりにパケットフィルタリングフックを使用して Oracle Solaris IP フィルタを有効にします。以前の Oracle Solaris リリースでは、Oracle Solaris IP フィルタを設定するには、追加手順として pfil モジュールの構成が必要でした。この追加の構成が必要であったため間違いが発生しやすく、Oracle Solaris IP フィルタが正しく動作しない場合がありました。pfil STREAMS モジュールが IP とデバイスドライバの間に挿入されることも、パフォーマンス低下の原因となっていました。さらに、pfil モジュールはゾーン間のパケット傍受を実行できませんでした。

パケットフィルタリングフックを使用することにより、Oracle Solaris IP フィルタを有効にする手順が簡素化されます。これらのフックを介して、Oracle Solaris IP フィルタはルーティング前 (入力) およびルーティング後 (出力) のフィルタタップを使用して、Oracle Solaris システムに対する入出力パケットフローを制御できます。

パケットフィルタリングフックによって pfil モジュールは不要になります。したがって、このモジュールに関連する次のコンポーネントも削除されます。

Oracle Solaris IP フィルタを有効にするための作業については、第 26 章Oracle Solaris IP フィルタ (作業)を参照してください。

Oracle Solaris IP フィルタと pfil STREAMS モジュール


注 –

pfil モジュールが Oracle Solaris IP フィルタに使用されるのは、次の Oracle Solaris 10 リリースのみです。

Solaris 10 7/07 リリース以降では、pfil モジュールはパケットフィルタリングフックで置き換えられ、Oracle Solaris IP フィルタには使用されなくなりました。


pfil STREAMS モジュールは、Oracle Solaris IP フィルタを有効にするために使用されます。ただし、Oracle Solaris IP フィルタは、モジュールを各インタフェースに転送する自動メカニズムを提供していません。そのかわり、pfil STREAMS モジュールは SMF サービス svc:/network/pfil によって管理されます。ネットワークインタフェースでフィルタリングをアクティブにするには、まず pfil.ap ファイルを構成します。そのあと svc:/network/pfil サービスをアクティブ化して、pfil STREAMS モジュールをネットワークインタフェースに転送します。STREAMS モジュールを有効にするには、システムをリブートするか、ifconfig コマンドを使用して、フィルタリングする各ネットワークインタフェースを unplumb したあと、再度 plumb します。IPv6 パケットフィルタリング機能をアクティブ化するには、inet6 バージョンのインタフェースを plumb する必要があります。

ネットワークインタフェースの pfil モジュールが見つからない場合、SMF サービスは保守状態になります。この状態をもたらすもっとも一般的な原因は、/etc/ipf/pfil.ap ファイルが正しく編集されていないことです。サービスが保守モードになると、フィルタのログファイルにそのことが記録されます。

Oracle Solaris IP フィルタをアクティブ化するための作業については、「Oracle Solaris IP フィルタの構成」を参照してください。

IPv6 と Oracle Solaris IP フィルタ

Solaris 10 6/06 リリース以降の Oracle Solaris IP フィルタでは、IPv6 がサポートされています。IPv6 パケットフィルタリングでは、発信元または宛先の IPv6 アドレス、IPv6 アドレスを含むプール、および IPv6 拡張ヘッダーに基づいて、パケットを取り出すことができます。

IPv6 は、多くの点で IPv4 に似ています。ただし、これら 2 つの IP バージョンは、ヘッダーとパケットサイズが異なっています。IP フィルタでは、これらは重要な要素です。IPv6 パケットには、「ジャンボグラム」と呼ばれる、65,535 バイトより大きなデータグラムが含まれています。Oracle Solaris IP フィルタでは、IPv6 ジャンボグラムはサポートされていません。IPv6 のその他の機能の詳細については、「IPv6 の主な特長」を参照してください。


注 –

ジャンボグラムの詳細については、Internet Engineering Task Force (IETF) の RFC 2675、『IPv6 Jumbograms』のドキュメントを参照してください。 http://www.ietf.org/rfc/rfc2675.txt


IPv6 に関連する IP フィルタの作業は、IPv4 とほとんど変わりません。もっとも大きな違いは、特定のコマンドで -6 オプションを使用することです。ipf コマンドと ipfstat コマンドには、IPv6 パケットフィルタリングを使用するために、-6 オプションが用意されています。IPv6 パケットフィルタリング規則をロードおよびフラッシュするときは、ipf コマンドで -6 オプションを使用します。IPv6 統計を表示するときは、ipfstat コマンドに -6 オプションを使用します。ipmon コマンドと ippool コマンドでも IPv6 がサポートされますが、IPv6 をサポートするためのオプションは指定しません。ipmon コマンドは、IPv6 パケットのログを記録できるように拡張されています。ippool コマンドでは、IPv6 アドレスをプールに格納できます。IPv4 アドレスまたは IPv6 アドレスのみのプールを作成したり、IPv4 アドレスと IPv6 アドレスを同じプールに含めたりできます。

ipf6.conf ファイルを使用して、IPv6 用のパケットフィルタリング規則セットを作成できます。デフォルトでは、ipf6.conf 構成ファイルは /etc/ipf ディレクトリに含まれています。ほかのフィルタリング構成ファイルと同様に、/etc/ipf ディレクトリに保存されている ipf6.conf ファイルは、起動時に自動的にロードされます。作成した IPv6 構成ファイルを別の場所に保存し、そのファイルを手動でロードすることもできます。


注 –

ネットワークアドレス変換 (NAT) では、IPv6 はサポートされていません。


IPv6 用のパケットフィルタリング規則を設定したら、inet6 バージョンのインタフェースを plumb して IPv6 パケットフィルタリング機能をアクティブにしてください。

IPv6 の詳細については、第 3 章IPv6 の紹介(概要)を参照してください。Oracle Solaris IP フィルタに関する作業については、第 26 章Oracle Solaris IP フィルタ (作業)を参照してください。

Oracle Solaris IP フィルタのマニュアルページ

次の表に Oracle Solaris IP フィルタに関するマニュアルページを示します。

マニュアルページ 

説明 

ipf(1M)

ipf コマンドを実行して次の作業を行う

  • パケットフィルタリング規則セットの処理

  • フィルタリングの無効化と有効化

  • 統計のリセットと現在のインタフェースステータスリストとカーネル内インタフェースリストの再同期化

ipf(4)

Oracle Solaris IP フィルタパケットのフィルタリング規則を作成するための文法と構文を含む 

ipfilter(5)

オープンソースの IP フィルタのライセンス情報を提供する 

ipfs(1M)

ipfs コマンドを実行して、NAT 情報と状態テーブル情報を保存し、リブート後に復元する

ipfstat(1M)

ipfstat コマンドを実行して、パケット処理の統計を検索し、表示する

ipmon(1M)

ipmon コマンドを使用してログデバイスを開き、パケットのフィルタリングと NAT の両方に対してロギングされたパケットを参照する

ipnat(1M)

ipnat コマンドを実行して次の作業を行う

  • NAT 規則の処理

  • NAT 統計の検索と表示

ipnat(4)

NAT 規則を作成するための文法と構文を含む 

ippool(1M)

ippool コマンドを実行して、アドレスプールの作成と管理を行う

ippool(4)

Oracle Solaris IP フィルタアドレスプールを作成するための文法と構文を含む 

ndd(1M)

pfil STREAMS モジュールの現在のフィルタリングパラメータおよび調整可能なパラメータの現在値を表示する