11.10. LOGターゲット

LOG ターゲットはパケットに関する詳細な情報をログするという特別な用途のために設計されている。考えようによっては違法行為と言えなくもない。言い換えれば、ロギングが使用できるのは、純粋なバグ狩りとエラー検出を目的とする場合だけだ。 LOG ターゲットはパケットに関する固有の情報を返してくる。大部分の IP ヘッダの他、およそ興味深いと思われる情報のほとんどだ。ログの出力はカーネルのロギング機能 (通常は syslogd) を介して行われる。それらの情報は、 dmesg で直接読んだり、syslogd のログを通じて、あるいはその他のプログラムやアプリケーションを使って読むことができる。パケット毎の行き先や、どんなパケットにどんなルールが適用されているのかが分かるので、ルールセットをデバグする用途には非常に優れたターゲットとなる。また、すでに運用中のファイヤーウォールで 100% 確信の持てないルールをテストする際に、 DROP の代わりに LOG ターゲットを使ってみるというのも名案だ。というのも、 DROP にした場合、ルールセットに 1カ所でも文法エラーがあると、接続障害など深刻な影響をユーザに与えてしまうからだ。また、極めて詳細なロギングを行いたい向きには ULOG ターゲットが面白いだろう。 ULOG ターゲットなら MySQL などへのダイレクトロギングをサポートしている。

Note

無用なログがコンソールに直接吐き出されるという現象が見られる場合、それは iptables あるいは Netfilter の問題ではない。専ら、 syslogd の設定 (たいていは /etc/syslog.conf) によって引き起こされる問題だ。この種の問題に関しては、 man syslog.conf を読み直すといいだろう。

また、 dmesg の設定を変更する必要もあるかもしれない。 dmesg はカーネルからのエラーメッセージを選択的に表示させるコマンド。 dmesg -n 1 とすれば panic メッセージのみをプリントさせることができる。 dmesg でいうレベルは syslogd のレベルと同じものだが、 dmesg では kernel ファシリティに属するログメッセージのみが対象となる。詳しくは man dmesg を参照のこと。

現在のところ、LOG ターゲットには、収集したい情報の種類や、設定したいオプション値の種類に応じて、皆の興味を惹くであろう 5つのオプションが設定可能となっている。下記にそのすべてを挙げた。

Table 11-8. LOGターゲットオプション

オプション--log-level
iptables -A FORWARD -p tcp -j LOG --log-level debug
説明iptablessyslog に、どのログレベルを使うかを指示する。ログレベルの全リストを知りたければ、syslog.conf のマニュアルを読むこと。通常、以下のログレベル (プライオリティとも呼ばれる) がある: debug, info, notice, warning, warn, err, error, crit, alert, emerg, panicerror キーワードは err と同義、 warnwarning と、 panicemerg と同義だ。これら 3 つは時代遅れで使われなくなっている (deprecated)。言い換えれば、err, warn, panic は使うべきでないということだ。プライオリティ (priority) はログされるメッセージの重篤度 (severity) を指定する。メッセージはすべて kernel ファシリティ (facility) でログされる。つまり、 syslog.conf ファイルで kern.=info /var/log/iptables を定義し、 iptables にログレベル info を使わせれば、 /var/log/iptables ファイルにログが集まる。ただし、このファイルには、カーネル関連で info プライオリティを使っている他のサービスのログも書き込まれることになるので注意。ロギングの詳細については、 syslogsyslog.conf の man ページや、その他の HOWTO などを読むことをお勧めする。
オプション--log-prefix
iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
説明このオプションは、ログメッセージに特定の接頭辞 (prefix) を付けるよう iptables に指示する。これを使えば、 grep などのツールと併用して、特定の問題やルールが楽に調べられる。接頭辞は 29文字までで、スペースと記号も使用できる。
オプション--log-tcp-sequence
iptables -A INPUT -p tcp -j LOG --log-tcp-sequence
説明このオプションは、ログメッセージに加えて、TCPシーケンスナンバー をログする。TCPシーケンスナンバー とはパケットの識別に使用される特別なナンバーで、各パケットの識別と、そのパケットがどの TCPシーケンス に該当するかを特定するため、そしてもちろん、ストリームを組み立て直すためにも利用されている。このオプションは、ログが権限のないユーザに読み込み可能な場合や誰にでも読める場合にはセキュリティリスクになるという点に注意しなければならない。これは iptables からの出力を含むログすべてに言えることだ。
オプション--log-tcp-options
iptables -A FORWARD -p tcp -j LOG --log-tcp-options
説明--log-tcp-options オプションは TCP パケットのヘッダから読み取った様々なオプションをログする。どういった不具合が起こりうるか、あるいは既に起こっているかをデバグしたい時、何物にも代え難い武器となる。ほとんどの LOG オプションがそうであるように、このオプションも変数フィールドに類するものは何も採らない。
オプション--log-ip-options
iptables -A FORWARD -p tcp -j LOG --log-ip-options
説明--log-ip-options オプションは IP パケットヘッダにあるほとんどのオプションをログする。これは --log-tcp-options とまったく同様に働き、違いは、対象が IP のオプションであるという点だけだ。これによるログメッセージは、特定の障害の切り分けやトレースを行いたい時に便利だ。もちろん、前記オプションと同様にデバグに活用することもできる。

Note

Linux カーネル 2.3, 2.4, 2,5, 2.6 で機能する。