IPFパケットフィルタを設定する

IPFパケットフィルタは IP通信に使用されるパケットを、 指定された条件に従ってフィルタリングするもので、 ファイアーウォールを構成する際などに利用するものです。 ここでは、その設定例を紹介します。

このメモは 2.9 版に基づいています。 3.0版では、ライセンス上の問題によりIPFパケットフィルタは削除され、 新しいフィルタリングソフト、PFパケットフィルタが導入されました。 そのため、3.0版以降にはこのメモを適用できません。

フィルタリングの想定仕様

  1. 2つのネットワーク・インターフェース、fxp0 と fxp1 を持っていて、 fxp0 が内部の LAN に、fxp1 が外部につながっているものとします。 アドレスは、fxp0 = 192.168.0.1、fxp1 = 192.168.1.1 とします。
  2. 外側からのアクセスは、tcp/80 を除いて全て拒否します。 tcp/80 は公開 HTTP サーバへのアクセスを想定して、 192.168.1.1 宛の通信のみを許可します。
  3. 内側から外側へのアクセスは全て許可します。
    注意: この仕様は非常に大雑把なものです。 実際にファイアーウォールとして運用するのであれば、 本当に必要な通信のみを通すように、詳細な設定をするべきです。

設定の手順

  1. /etc/ipf.rules にフィルタリングのルールを定義します。 この詳細は次項で説明します。
  2. IP フォワーディング機能が有効になっている必要があるため、 /etc/sysctl.conf の中の net.inet.ip.forwarding=1 の行を有効にします。
  3. IPF が起動するように、 /etc/rc.conf の中の ipfilter=NO を ipfilter=YES に変更します。
  4. マシンをリブートします。
  5. 外側からのアクセス等を試みて、フィルタリングが正常に動作することを確認します。 また、ログファイル /var/log/ipflog に適切なログ情報が出ているか確認します。
  6. ルールに問題があった場合、/etc/ipf.rules を書き直した後、ルールを再読み込みします。 再読み込みは以下のコマンドで行うことができ、マシンのリブートは不要です。
    # ipf -Fa -f /etc/ipf.rules
    

ルールの定義

ここでは、フィルタリング・ルールの記述例を紹介します。 以下のルールを順に /etc/ipf.rules に記述します。

  1. 全てのインターフェースからの受信で、パケット長が異常に短いものを破棄します。
    block in log quick all with short
    
  2. 全てのインターフェースからの受信で、IP オプションが設定されているものを破棄します。
    block in log quick all with ipopts
    
  3. ループバック・インターフェースとの通信を全て許可します。
    pass in quick on lo0
    pass out quick on lo0
    
  4. 不正と思われるアドレスからのパケットを破棄します。
    block in log quick from 0.0.0.0/8 to any        # illegal.
    block in log quick from 10.0.0.0/8 to any       # private.
    block in log quick from 127.0.0.0/8 to any      # localhost.
    block in log quick from 169.254.0.0/16 to any   # auto-configuration.
    block in log quick from 172.16.0.0/12 to any    # private.
    block in log quick from 192.0.2.0/24 to any     # example IP netblock.
    block in log quick from 204.152.64.0/23 to any  # cluster interconnects.
    block in log quick from 224.0.0.0/3 to any      # Class D networks.
    
  5. 外部から公開 HTTP サーバへのアクセスを許可します。
    pass in quick on fxp1 proto tcp from any to 192.168.1.1/32 port = 80
     flags S keep state
    
    ※ 途中で折り返してありますが、実際は1行で記述します。
  6. 内部から外部へのアクセスを全て許可します。
    pass in quick on fxp0 proto tcp from any to any flags S keep state
    pass in quick on fxp0 proto udp from any to any keep state
    pass in quick on fxp0 proto icmp from any to any keep state
    pass out quick on fxp1 proto tcp from any to any flags S keep state
    pass out quick on fxp1 proto udp from any to any keep state
    pass out quick on fxp1 proto icmp from any to any keep state
    
  7. その他の通信は全て拒否します。
    block return-rst in log quick proto tcp all
    block in  log all
    block out log all