web-dev-qa-db-ja.com

iptablesメッセージを別のファイルに記録するように、syslog.confファイルを構成するにはどうすればよいですか?

/etc/syslog.confファイルiptablesに関するログ情報を特定のファイルに保存します。

これらの情報を個別に保存したいので、必要なものを簡単かつ迅速に抽出できます。

10
Abid

syslog

iptablesのmanページをご覧ください。 LOGと呼ばれるターゲットが表示され、目的を実行できます。

  1. LOGのログレベルを4に設定します。

    # DROP everything and Log it
    iptables -A INPUT -j LOG --log-level 4
    iptables -A INPUT -j DROP
    
  2. 構成、設定 syslog.confこれらのメッセージを別のファイルに書き込みます。

    # /etc/syslog.conf
    kern.warning     /var/log/iptables.log
    
  3. Syslogdを再起動します。

    Debian/Ubuntu

    $ Sudo /etc/init.d/sysklogd restart
    

    Fedora/CentOS/RHEL

    $ Sudo /etc/init.d/syslog restart
    

注:このロギング方法は固定優先度と呼ばれます。番号または名前(1,2,3,4、..)または(DEBUG、WARN、INFOなど)です。

rsyslog

偶然rsyslogを使用している場合は、次のようにプロパティベースのフィルターを作成できます。

# /etc/rsyslog.conf
:msg, contains, "NETFILTER"       /var/log/iptables.log
:msg, contains, "NETFILTER"     ~

次に、記録するiptablesルールにthilsスイッチを追加します。

–log-prefix NETFILTER

別の方法として、このタイプのプロパティフィルターを使用してメッセージをログに記録することもできます。

:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~

注:この2番目の方法では、iptablesを変更する必要はありません。

参考文献

13
slm

これは、正常なファイアウォールと同様に、ファイアウォールがすでにログを作成していることを前提としています。一部の例では、slmの例の「NETFILTER」などの識別可能なメッセージが必要です。

rsyslog.dにファイルを作成する

vim /etc/rsyslog.d/10-firewall.conf

これはCentOS 7で機能します。INとOUTを探す以外に、ファイアウォールからのものであることを確認する方法がわかりません... CentOSは奇妙です。次のバージョンが機能しない場合を除き、これを使用しないでください。

# into separate file and stop their further processing
if  ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
    -/var/log/firewall
    & ~
}

これはCentOS 7で機能し、メッセージの内容もチェックします(「Shorewall」を-j LOGルールのメッセージにあるものに置き換えてください)。

# into separate file and stop their further processing
if  ($msg contains 'Shorewall') and \
    ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
    -/var/log/firewall
    & ~
}

これは他のもの(Ubuntu、Debian、openSUSE)で動作します。そして、これはそれを行うための最良の方法です。メッセージ内の文字列を検索しません:

# into separate file and stop their further processing
if  ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then    -/var/log/firewall
    &   ~

そして、これはデフォルトのopenSUSEマシンが持っているものです(私はすべてのディストリビューションが持っているべきもので、欠けていると思います)(違いは "&〜"ではなく "stop"のようです;すべてのシステムが両方の構文をサポートしているわけではありません):

if  ($syslogfacility-text == 'kern') and \
    ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
    -/var/log/firewall
    stop
}

上記のすべてについて、logrotate.dファイルも忘れないでください。

vim /etc/logrotate.d/firewall

含む:

/var/log/firewall {
    rotate 7
    size 500k
    postrotate
        # before using this, run the command yourself to make sure 
        # it is right... the daemon name may vary
        /usr/bin/killall -HUP rsyslogd
    endscript
}
6
Peter