Title: USAGIプロジェクト パケットフィルタ機能の開発活動 Author(s): USAGIプロジェクトコアメンバ (usagi-core@linux-ipv6.org) Date: 2005/01/31 -- 目次 1. 概要 2. 2004年の主な活動 2.1 IPバージョン非依存なConnection Trackingの開発 2.1.1 機能 2.1.2 構成と処理内容 2.1.3 フラグメント化されたIPv6パケットの処理 2.1.4 メモリ使用量の低減 2.1.5 従来のIPv4用Connection Trackingに対する変更の追従 2.1.6 今後の予定について 2.2 パケットフィルタ機能の品質向上化 -- 本文 1. 概要 USAGIプロジェクトは、LinuxのIPv6 スタックや、IPv6に関するライ ブラリ、アプリケーションを改良し、より良いコードを提供しており、パケッ トフィルタ機能もその一つとなっている。今年度、USAGIプロジェクトはパケッ トフィルタ機能に関し、以下の2点について活動した。 - ネットワークフローの状態の変化を追跡するConnection Trackingの IPv6対応 - IPv6パケットフィルタ機能の品質向上化 以下では、これらの活動の内容について報告する。 2. 2004年の主な活動 2.1 IPバージョン非依存なConnection Trackingの開発 Connection Tracking は、機器に入ってくるパケット全てを解析し、TCPやUDPのフローの状態の変化 を追跡するLinuxカーネルの一機能である。Linuxには、IPv4専用のConnection Tracking(以下ip_conntrackと呼ぶ)が実装されており、Stateful Packet InspectionやNATの実現に利用されている。一方、IPv6パケットに対する Stateful Packet Inspectionの実現も望まれていたが、IPv6用のConnection Trackingは存在しなかった。そこで昨年、ip_conntrackのレイヤ3部分を一般 化したConnection Tracking(以下nf_conntrackと呼ぶ)の第一版を実装した。 今年は、より完成度を上げるため、フラグメント化されたIPv6パケットに対す る特別な処理の追加やメモリ使用量の低減、現在もメンテナンスが続けられて いる従来のip_conntrackに対する変更の追従を行った。以下の節では、 nf_conntrackの機能と構成について簡単に説明し、今年行った改善点について 説明する。 2.1.1 機能 nf_conntrackの役割は、パケットを走査しフローの状態の変化を 追跡することである。現在nf_conntrackが認識できるフローの状態は以下のい ずれかである。 - NEW 新たに検出したフローであり、片方向のパケットし か検出していないことを示す。 - ESTABLISHED 両方向のパケットを検出済みのフローであることを 示す。 - RELATED NEWと同様だが、他のフローと関係のあることが判 明したフローであることを示す(例えば、FTPのデー タチャネル等)。 この他にも、特定のカーネルオプションを有効化することにより、フロー中の 総パケット数、総バイト数をカウントする機能も持っている。  フローの状態はStateful Packet Inspectionに利用できる。例えば、LAN外 からいきなり来たパケットはすべて破棄するが、過去にLAN内からLAN外へ転送 されたパケットに対する逆方向のパケットは通過できるようにすることができ る。このルールを実現するには、LAN外から来たパケットを走査した後フロー の状態がNEWならばパケットを破棄し、ESTABLISHED、またはRELATEDならば通 過を許可すればよい。また、従来のNAT機能はip_conntrackが追跡したフロー の状態の情報を利用してNATマッピングを管理している。現在nf_conntrackを 利用したIPv4 NAT機能は存在しないが、今後対応される方向にある。 2.1.2 構成と処理内容  nf_conntrackは、ネットワークプロトコル、トランスポートプロトコル、ア プリケーションデータのそれぞれの走査モジュールと、コアモジュールで構成 される。現在、nf_conntrackが対応しているプロトコルは、IPv4、IPv6、TCP、 UDP、SCTP、ICMP、ICMPv6、FTPである。nf_conntrackは、パケットをルーティ ングする前に、ネットワークプロトコルとトランスポートプロトコルの走査モ ジュールを用いて、パケットがどのフローに属するかを判別し、そのフローの 状態を保持するデータベースを更新する。  なお、フローはtupleと呼ばれる識別子で識別される。tupleは、例えばTCP ならば送信元、送信先のネットワークアドレス、ポート番号、ネットワークプ ロトコルの種別、トランスポートプロトコルの種別からなる。  次に、走査を希望するアプリケーションデータ走査モジュールが存在すれば、 そのモジュールはパケットのアプリケーションデータを走査する。これにより、 そのパケットが属すフローに関係するフローが、新たに生成される可能性があ るかどうかを判定する。もしその可能性があり、実際に予期したフローを検知 した場合、予期されていたフローの状態はRELATEDになる。 2.1.3 フラグメント化されたIPv6パケットの処理  nf_conntrackは、パケット中のアプリケーションデータも走査する可能性が ある。そこで、パケットがフラグメント化されている場合は、再構築する必要 がある。従来のip_conntrackでは、パケットを走査する前にパケットを再構築 する。そして、パケットをネットワークインタフェースから出力する前にパケッ トを再分割する。このため、パケットサイズが入力時と出力時で異なる可能性 がある。RFC 2460によれば、IPv6ではルータがパケットを分割しないとされて いるため、nf_conntrackが上記のようなパケットのサイズ変更をしない方が好 ましい。そこで、パケットを再構築する際は、元々のパケットを保持しておき、 そのクローンを再構築に利用する。ここで、クローンとは、パケットのデータ をコピーせず、パケットを管理する構造体のみをコピーしたものである。パケッ トをネットワークインタフェースから出力する際には、保持しておいた元々の パケットを出力し、再構築したパケットは破棄する。以上により、パケットサ イズを変更せず、再構築したパケットの走査を可能にした。 2.1.4 メモリ使用量の低減  nf_conntrackが追跡するフロー数の増大は、そのままメモリ使用量に影響す ることから、フローに関する情報を機能ごとに分類し、その機能ごとに適した メモリ割当を行うよう改善した。例えば、従来のip_conntrackではフローの情 報にIPv4 NAT機能のための情報も含まれていたが、IPv6のフロー情報には必要 ないためそれを含まない。 2.1.5 従来のIPv4用Connection Trackingに対する変更の追従  nf_conntrackの開発の一方で、メインラインのカーネルには、従来の ip_conntrackに対するバグフィクス、機能追加が行われている。そこで、 nf_conntrackのコードが機能的に古くならないよう、適宜ip_conntrackに対す る変更をバックポートした。2004年12月現在、nf_conntrackは最新の安定バー ジョンであるLinux 2.6.9に対応しており、ip_conntrackと同等の機能を有し ている。 2.1.6 今後の予定について  nf_conntrackの開発に際しては、Linuxにおけるパケットフィルタ、NAT機能 に関する開発、メンテナンスを行っているNetfilter Project(http://www.netfilter.org)とメーリングリスト上で密に議論しなが ら進め、9月には同Projectのコアメンバーとドイツ・エアランゲンにおいてミー ティングを行った。また同Projectは、メインラインのカーネルに含まれてい ない拡張機能のパッチ群を公開、管理しており、nf_conntrackもそれに取り込 まれた。  今後、Netfilter ProjectではConnection Trackingに関する機能追加を従来 のip_conntrackではなくnf_conntrackに対して行っていく方向にあり、安定化 等がなされた後、メインラインカーネルに取り入れられることと思われる。 2.2 パケットフィルタ機能の品質向上化  LinuxカーネルにおけるIPv6パケットフィルタのモジュールを調査したとこ ろ、多数のバグが存在しコード品質が低いことが判明したため、これらを修正 した。Logging機能や拡張ヘッダ内の情報を使うルールを使用する場合、 2.4.29または2.6.10以降のLinuxカーネルを使うことが推奨される。  また、従来のIPv6パケットフィルタ機能では、パケットをフィルタルールと 比較する前に、パケットのデータがメモリ上で連続的になるよう、必要ならば メモリコピーを行っていた。Linuxカーネルでは、可能な限りメモリコピーの 発生を抑えるため、メモリ上で断片化されたデータをパケットとして扱えるよ うパケット管理機構に工夫が施されているが、上記の挙動により、その工夫が 無駄になっていた。そこで、IPv6パケットフィルタ機能でも、パケット管理機 構を最大限に利用して、メモリコピーの発生を抑えるようにした。 Copyright Notice Copyright (C) USAGI/WIDE Project (2004, 2005). All Rights Reserved.