動作原理

このセクションの内容:

概要

接続監視のメカニズム

接続監視の順序

概要

SpIDer GateはDr.Web Firewall for Linuxコンポーネントの働きにより正常に動作します。このコンポーネントは、NetFilter(GNU/Linux OSコンポーネント)用に調整されたルーティングルールを解析し、確立された接続が、クライアントアプリケーションとリモートサーバー間の中間の機能(プロキシ)を実行するSpIDer Gateにリダイレクトされるように修正します。

Dr.Web Firewall for Linuxは、トランジット接続だけでなく、送信と受信のリダイレクトのルールを別々に管理できます。バイパスまたはリダイレクトのルールを正確に設定するには、コンポーネントではLuaで書かれたスクリプトだけでなく設定に組み込まれたルールを使うことができます。

接続監視のメカニズム

接続を監視するために、Dr.Web Firewall for Linuxはルーティングポリシーのデータベース(man ip: ip routeip rule参照)とNetFilterシステムコンポーネントのnf_conntrackインターフェースで指定されたルーティングテーブルを使用します。監視された接続と転送されたパケットには、Dr.Web Firewall for LinuxがNetFilterのチェーンのさまざまな段階で接続をリダイレクトし、転送されたパケットを正しく処理できるようにするビットマークが付けられます(詳細はman iptablesを参照)。

iptablesルールのアクション

Dr.Web Firewall for Linuxは、iptablesルールで次のアクションを使用します。

MARK:このアクションにより、Dr.Web Firewall for Linuxは指定された数字マークをパケットに設定できます。

CONNMARK:このアクションにより、Dr.Web Firewall for Linuxは指定された数字マークを接続に設定できます。

TPROXY:このアクションにより、Dr.Web Firewall for Linuxは、パケットのコンテンツを変更することなく、PREROUTING NetFilterチェーンから指定されたネットワークソケット(<IP address><port>)にパケットをリダイレクトできます。このアクションを使用すると、Dr.Web Firewall for Linuxは接続の最初の宛先アドレスを特定できます。

NFQUEUEこのアクションにより、エンジンのネットワークスタックから、スキャンのためにカーネル空間外で動作するプロセスにパケットを送信できます。したがって、Dr.Web Firewall for Linuxは、特殊なNetlinkソケットを介して、指定した番号のキューNFQUEUEに接続し、処理で判定するために必要なパケットを入手します(Dr.Web Firewall for Linuxは、NetFilterに、DROP:ドロップACCEPT:許可REPEAT:繰り返しのいずれかの判定を伝える必要があります)。

パケットと接続のマーク

パケットをマークするため、Dr.Web Firewall for Linuxは、パケットおよび接続マークで使用可能な32ビットのうち次の3つを使用します。

LDMビット(Local Delivery Mark)。マークにこのビットがあるパケットは、使用しているルーティングルールに基づいてローカルホストに送信されます。

CPMビット(Client Packets Mark)。クライアント(接続開始側)とプロキシ(Dr.Web Firewall for Linuxなど)の間の接続を示します。

SPMビット(Server Packets Mark)。プロキシ(Dr.Web Firewall for Linuxなど)とサーバー(接続受信側)の間の接続を示します。

LDMCPMSPMビットは、ルーティング接続を実行する他のアプリケーションがパケットをマークするために使用していない任意のさまざまなビットにすることができます。デフォルトでは、Dr.Web Firewall for Linuxは適切な(他のアプリケーションでは使用されていない)ビットを自動的に選択します。

ルートとルーティングポリシー(ip rule、ip route)

Dr.Web Firewall for Linuxを(あらゆる接続スキャンモードで)正しく動作させるには、100番のルーティングテーブルを使用するip ruleルーティングポリシーをシステムに設定する必要があります。

from all fwmark <LDM>/<LDM> lookup 100

次のルートをテーブルに追加する必要があります。

local default dev lo scope host

このルーティングポリシーは、マークにLDMビットが入っているパケットが常にローカルホストに送信されることを保証します。

それ以降、XXXビットの<XXX>文字列は、2 NNはパケットマーク内のXXXビットの序数)に等しい16進値になります。たとえば、最小(ゼロ)ビットがLDMビットとして選択されている場合は、<LDM> = 20 = 0x1になります。

NetFilter(iptables)のルール

Dr.Web Firewall for Linuxを(あらゆる接続スキャンモードで)正しく動作させるには、次の6つのルール(iptables-save出力コマンド形式で表示)がNetFilterシステムコンポーネントの該当するチェーンのnatテーブルとmangleテーブルに存在している必要があります。

*nat

-A POSTROUTING -o lo -m comment --comment drweb-firewall -m mark --mark <LDM>/<LDM> -j ACCEPT

*mangle

-A PREROUTING -m comment --comment drweb-firewall -m mark --mark 0x0/<CPM+SPM> -m connmark --mark <SPM>/<CPM+SPM> -j MARK --set-xmark <LDM>/<LDM>
-A PREROUTING -p tcp -m comment --comment drweb-firewall -m mark ! --mark <CPM+SPM>/<CPM+SPM> -m connmark --mark <CPM>/<CPM+SPM> -j TPROXY --on-port <port> --on-ip <IP-address> --tproxy-mark <LDM>/<LDM>
-A OUTPUT -m comment --comment drweb-firewall -m mark --mark <CPM>/<CPM+SPM> -j CONNMARK --set-xmark <CPM>/0xffffffff
-A OUTPUT -m comment --comment drweb-firewall -m mark --mark <SPM>/<CPM+SPM> -j CONNMARK --set-xmark <SPM>/0xffffffff
-A OUTPUT -m comment --comment drweb-firewall -m mark --mark 0x0/<CPM+SPM> -m connmark ! --mark 0x0/<CPM+SPM> -j MARK --set-xmark <LDM>/<LDM>

以下の説明では、0~5の番号がこれらのルールに割り当てられています(文書に記載されている順序で)。式<X+Y>は、それぞれの数XYのビット数「OR」(合計)を意味します。

ルール番号2のパラメータ<IP address>と<port>は、Dr.Web Firewall for Linuxが監視された接続を管理するネットワークソケットを示します。

さらに、Dr.Web Firewall for Linux設定で監視接続モード(送信、受信、トランジット)を有効にする場合は、次の追加ルールが該当するチェーンのmangleテーブル(OUTPUTINPUTFORWARD)に存在する必要があります。

送信OUTPUT)接続を監視するには:

-A OUTPUT -p tcp -m comment --comment drweb-firewall -m tcp --tcp-flags SYN,ACK SYN -m mark --mark 0x0/<CPM+SPM> -j NFQUEUE --queue-num <ONum> --queue-bypass

受信INPUT)接続を監視するには:

-A INPUT -p tcp -m comment --comment drweb-firewall -m tcp --tcp-flags SYN,ACK SYN -m mark --mark 0x0/<CPM+SPM> -j NFQUEUE --queue-num <INum> --queue-bypass

トランジットFORWARD)接続を監視するには:

-A FORWARD -p tcp -m comment --comment drweb-firewall -m tcp --tcp-flags SYN,ACK SYN -m mark --mark 0x0/<CPM+SPM> -j NFQUEUE --queue-num <FNum> --queue-bypass

以下の説明では、6、7、8の番号がこれらのルールに割り当てられています(文書に記載されている順序で)。

ここで、<ONum><INum><FNum>は、Dr.Web Firewall for Linuxが対応する接続のインストールを示すパケット(SYNフラグが設定されているがACKフラグは含まれていないパケット)を待機しているNFQUEUE内のキューの数です。

接続監視の順序

ルール6、7、8のいずれかに従って、対応する方向の新しいネットワーク接続を示すパケットは、CPMSPMのどちらのビットでもマークされていない場合、NetFilterによって該当するNFQUEUEキューに入れられます。ここでパケットは、nf_conntrackインターフェースを介してDr.Web Firewall for Linuxによって読み取られます。ルール3と4は、接続を監視済みとしてマークします。つまり、接続マークに接続方向が設定されていることを示すビットがあります。このビット番号は、パケットマークのビット番号と一致します。その結果、ルール1、2、5に従って、この接続を介して送信されたパケットはDr.Web Firewall for Linuxによって配信されます。ルール0がnatテーブルのPOSTROUTINGチェーンの最上部に追加されるため、NATが設定されている場合、マークされたパケットのアドレスは送信されません(Dr.Web Firewall for Linuxの監視および接続処理ロジックに干渉するため)。

パケットがいずれかのNFQUEUEキューに現れると、Dr.Web Firewall for Linuxは、NetFilterで誤ったルールが設定されている場合に備えて、パケットの基本的な処理を実行します。次に、Dr.Web Firewall for Linuxは、ルール4に従い、それ自体の名前と、PSCとマークされたソケットを使用してサーバーへの接続を試みます。ローカル配信のルール5は適用されません。パケットはSPMでマークされており、このルールは<CPM + SPM>でマークされたパケットにのみ適用できるためです。

サーバーへの接続が失敗した場合、Dr.Web Firewall for Linuxは、RSTビットを含むクライアントパケットを生成し、<IP address>:<port>のペアをリクエストされたサーバーのネットワークソケットのアドレスに置き換えます。DROP判定もNFQUEUEに送信されます。RSTビットを含むパケットの送信に使用されるソケットは<CPM+SPM>としてマークされているため、上記のルールはどれも適用されず、パケットは通常のルーティングルールに従ってクライアントに配信されます。

リモートサーバーへの接続が成功した場合Dr.Web Firewall for Linuxは、監視したSYNパケットをコピーし、<LDM+CPM>とマークされたソケットから再送信して、パケットをローカルネットワークソケットにリダイレクトします。LDMビットが設定されているため、指定したルーティングルールに従って出力インターフェースを選択すると、パケットはloopbackインターフェースに追加されます。その後、NetFilter PREROUTINGチェーンに追加され、そこでルール2が適用されます。したがって、パケットは変更されることなくネットワークソケットDr.Web Firewall for Linuxにリダイレクトされます。この機能により、Dr.Web Firewall for Linuxは接続アドレスの4つの要素すべて(パケット送信者のIPアドレスとポート、パケット受信者のIPアドレスとポート)を保存できます。

Dr.Web Firewall for Linuxがルール2に従って監視した接続を受信するネットワークソケットの場合、IP_TRANSPARENTオプションと<LDM+CPM>マークが設定され、このソケットからDr.Web Firewall for Linuxによって送信されたパケットがNFQUEUEキューに分類されないようにします。クライアントが接続すると、保存されている4要素のアドレス(パケット送信者のIPアドレスとポート、パケット受信者のIPアドレスとポート)を使用して、ペアのソケットが検索されます。クライアントとサーバーの接続が確立されると、Luaの手順とDr.Web Firewall for Linuxの設定で指定されたスキャンルールに従ってスキャンされます。スキャンが成功し、接続が安定している場合は、クライアント側とサーバー側を接続する関連ソケットのペアが転送データの解析のためにSpIDer Gateコンポーネントに転送されます。それに続くクライアントとサーバー間の対話は、メディエーターのSpIDer Gateを介して確立されます。Dr.Web Firewall for Linuxは、クライアント側とサーバー側に関連付けられたソケットペアに加えて、確立された接続をスキャンするためのパラメータとルールをSpIDer Gateに送信します。

Dr.Web Firewall for Linux動作の概略図を以下に示します。

図12. コンポーネントの動作図

以下の接続処理のステップには番号が付いています。

1.クライアントがサーバーへの接続を試みます。

2.ルーティングルールに従って、NetFilterの接続をDr.Web Firewall for Linuxにリダイレクトします。

3.Dr.Web Firewall for Linuxは、クライアントの名前と接続スキャンを使用して、サーバーへの接続を試みます。

4.接続のクライアント側とサーバー側、接続処理用のSpIDer Gate、およびスキャンの設定とルールに関連するソケットペアを送信します。

5.メディエーターとしてSpIDer Gateを介し、サーバーとクライアント間でデータ交換を行います。

Dr.Web Firewall for Linuxを正しく動作させるためには、ルーティングテーブルに正しい数のビットマーク、NFQUEUEキュー、接続監視用のネットワークソケットアドレスを使用するためのルールが必要です。デフォルト設定では、コンポーネントは必要なルール設定を自動的に実行します。設定で接続の自動設定が無効になっている場合、コンポーネントを起動するときに必要なルールを手動で入力する必要があります。