iptables の log の管理   ▲戻る
最終更新日 : 2004/03/10(森川靖大)  <<  作成日 : 2003/06/16(森川靖大)
  1. 前置き
  2. 最低限作業
  3. おまけ作業

1. 前置き

[1.1] ログの必要性

IP マスカレードルータを運用する際に注意しなければならないのは, グローバルなインターネットから見た場合, ルータ以下のプライベートIPのマシンからの通信は全てルータが行っている ように見えることである. 例えば, (ルータではなく) プライベートIPマシンがなんらかの不正なアクセスを 行った場合でも, 全てルータがその不正アクセスを行ったように (外部からは) 見える.

そのような場合に, ルータ自身が, いつ, どのマシンから, どのマシンへ ルーティングを行ったのかわかっていれば, 不正に利用されてるマシンを特定することができる.

以下では, IPマスカレードルータが適切なログをとる方法を記す.


[1.2] ポリシー

専攻ネットワークで運用するIPマスカレードルータでは, 以下のようにログをとる.

iptables(8) によるログは /var/log/kern.log に保存される. (それに伴い /var/log/messages, /var/log/syslog にも保存される). ただし, 現専攻でのプライベートIPの利用を考えると, ログが大量になり, 最悪ディスクを埋めつくす恐れがあるため, 以下のようにケアする必要がある.

2003 年度の経験から, だいたい 1 日に 1.0 GB のログが溜まることが分かった. よって 90 日分のログをまともにテキストで保管するとほぼ 90 GB になってしまう. しかし, gzip で圧縮を掛けることでデータはほぼ 1/100 に圧縮できる.

2. 最低限作業

[2.1] iptables(8) でログをとるには?

iptables(8) でログをとるためには, LOG チェインを用いる. 今回のように, 内部 (つまりはルータの eth1) から外部 (つまりはルータの eth0) へルーティングされる 全ての通信に対してログをとりたい場合は,

# iptables -A FORWARD -i eth1 -j LOG --log-prefix "IPTABLES-LOG: " [Enter]
とする.

ただし, 上記のコマンドは gate-toroku-system(1) の gate-db-to-iptables(8) によって生成される シェルスクリプト /usr/local/sbin/gate-ip-masq によって実行されるため, 管理者が手動で入力する必要はない. ただし, gate-toroku-system の設定ファイルである gate.conf(5) の $IPTABLES_LOG が以下のようになっている必要があるので注意.

   $IPTABLES_LOG = 1;

[2.2] kern.log と messages のローテーション動作変更

/var/log/kern.log/var/log/messages[1.2] ポリシー のようにローテーション させるには, 以下の作業を行う必要がある.

[2.2.1] 必要なパッケージのインストール

以下の必要なパッケージをインストールする.

# apt-get install debianutils sysklogd cron [Enter]

[2.2.2] /etc/cron.weekly/sysklogd への記述

/etc/cron.weekly/sysklogd

                 : 
cd /var/log
for LOG in `syslogd-listfiles --weekly`
do
   if [ -s $LOG ]; then
      savelog -g adm -m 640 -u root -c 4 $LOG >/dev/null
   fi
done
                 : 
の部分に, 以下の 3 行を追記する.

                 : 
cd /var/log
for LOG in `syslogd-listfiles --weekly`
do
   if [ $LOG = /var/log/kern.log ] || [ $LOG = /var/log/messages ]; then
      continue
   fi

   if [ -s $LOG ]; then
      savelog -g adm -m 640 -u root -c 4 $LOG >/dev/null
   fi
done
                 : 

これによって, /var/log/kern.log/var/log/messages は, 毎週ローテーションされることは無くなる.

※ なお, このファイルは本来 sysklogd(8) によって管理されているので, このパッケージをアップデートすることで書き換えられてしまう. アップデートの際には注意すること.

[2.2.4] /etc/cron.daily/sysklogd への記述

/etc/cron.daily/sysklogd

                 : 
do
   if [ -s $LOG ]; then
      chown root.adm $LOG
      chmod o-rwx $LOG
   fi
done

# Restart syslogd
#
/etc/init.d/sysklogd reload-or-restart
の部分に, 以下の 6 行を追記する.

                 : 
do
   if [ -s $LOG ]; then
      chown root.adm $LOG
      chmod o-rwx $LOG
   fi
done

if [ -f /var/log/kern.log ]; then
    savelog -g adm -m 640 -u root -c 90  /var/log/kern.log >/dev/null
fi
if [ -f /var/log/messages ]; then
    savelog -g adm -m 640 -u root -c 90 /var/log/messages >/dev/null
fi

# Restart syslogd
#
/etc/init.d/sysklogd reload-or-restart

これによって, /var/log/kern.log/var/log/messages は, 毎日ローテーションされ, 90 日分保管される.

※ なお, このファイルも本来 sysklogd(8) によって管理されているので, このパッケージをアップデートすることで書き換えられてしまう. アップデートの際には注意すること.


[2.3] 確認

以上で必要な設定は完了であるが, 実際に[1.2] ポリシーのように ログがとれているか確認すること.


[2.4] ログの見方

簡単ではあるが, ログの見方を説明する. 以下は, /var/log/kern.logに書き出されるメッセージである. (見やすさのため, 改行してある).

                          :
Mar 10 18:27:57 blue kernel: IPTABLES-LOG: IN=eth1 OUT=eth0
    SRC=192.168.16.55 DST=133.87.45.70 LEN=123 TOS=0x00 PREC=0x00
    TTL=127 ID=1152 PROTO=UDP SPT=1210 DPT=53 LEN=103 
Mar 10 18:31:14 blue kernel: IPTABLES-LOG: IN=eth1 OUT=eth0
    SRC=192.168.16.41 DST=133.50.135.142 LEN=60 TOS=0x00 PREC=0x00
    TTL=31 ID=8850 PROTO=ICMP TYPE=8 CODE=0 ID=512 SEQ=32782 
Mar 10 18:33:54 blue kernel: IPTABLES-LOG: IN=eth1 OUT=eth0
    SRC=192.168.16.55 DST=207.46.249.57 LEN=48 TOS=0x00 PREC=0x00
    TTL=127 ID=1225 DF PROTO=TCP SPT=1217 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0 
Mar 10 18:33:54 blue kernel: IPTABLES-LOG: IN=eth1 OUT=eth0
    SRC=192.168.16.55 DST=207.46.249.57 LEN=48 TOS=0x00 PREC=0x00
    TTL=127 ID=1225 DF PROTO=TCP SPT=1217 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0 
Mar 10 18:39:40 blue kernel: IPTABLES-LOG: IN=eth1 OUT=eth0
    SRC=192.168.16.55 DST=133.87.45.115 LEN=48 TOS=0x00 PREC=0x00
    TTL=127 ID=1431 DF PROTO=TCP SPT=1235 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0 
                          :

ある一行を説明すると,

Mar 10 18:27:57           <- [日時]
blue                      <- [ルータのホスト名]
kernel:                   <- [kernel からのメッセージであることを示す]
IPTABLES-LOG:             <- [--log-prefix で指定されたフラグ]
IN=eth1 OUT=eth0          <- [データがどちらのネットワークデバイスから入り, どちらから出るかを示す]
SRC=192.168.16.55         <- [データの送信元]
DST=133.87.45.70          <- [データの宛先]
LEN=123 TOS=0x00          <- [その他色々]
PREC=0x00 TTL=127 ID=1152 <- [    〃    ]
PROTO=UDP                 <- [TCP or UDP or ICMP]
SPT=1210                  <- [送信元ポート]
DPT=53                    <- [宛先ポート]
LEN=103                   <- [その他色々]

となる. 運悪くログを眺めなければならなくなった場合は参照して欲しい.

なお, このログの整形プログラムとして, gate-toroku-system(1) で gate-log-iptables(8) を用意している. 例えば /var/log/kern.log を手元に ipmasq.logとして 整形しようとすると,

# /usr/local/sbin/gate-log-iptables /var/log/kern.log ipmasq.log[Enter]

とすれば良い. すると, 上記のログは整形され, ipmasq.log に以下のように書き出される. (ログのサイズが GB クラスになると, 出力されるまでに時間がかかるので, コマンド入力後しばらく待つこと).

                          :
Mar 10 18:27:57 UDP  192.168.16.55  :1210  > 133.87.45.70   :53    (1 times)
Mar 10 18:31:14 ICMP 192.168.16.41  :      > 133.50.135.142 :      (1 times)
Mar 10 18:33:54 TCP  192.168.16.55  :1217  > 207.46.249.57  :80    (2 times)
Mar 10 18:39:40 TCP  192.168.16.55  :1235  > 133.87.45.115  :22    (1 times)
                          :

3. おまけ作業

以下の作業は必須ではない. …が, もの好きな方は挑戦してもらえると嬉しい.

[3.1] gate-log-iptables(8) で直接ログを整形

上記で紹介した gate-log-iptables(8) を/etc/cron.daily/sysklogd の中に直接用いることで, 必要な部分のみを抜き出し, ファイルサイズを圧縮したログを取ることもできる.

[3.1.1] 前準備

まず, [2.1][2.2]の作業を行なっておくこと.

[3.1.2] gate-log-iptables(8)の用意

gate-log-iptables(8)は gate-toroku-system(1) をインストールすることで自動的にシステムに組み込まれているはずである.

# /usr/local/sbin/gate-log-iptables [Enter]
というコマンド入力し, ヘルプメッセージが出力されれば OK である.

[3.1.3] /etc/cron.daily/sysklogd への記述

今回は, /etc/cron.daily/sysklogd

                 : 
do
   if [ -s $LOG ]; then
      chown root.adm $LOG
      chmod o-rwx $LOG
   fi
done

# Restart syslogd
#
/etc/init.d/sysklogd reload-or-restart
の部分に, 以下の 8 行を追記する.

                 : 
do
   if [ -s $LOG ]; then
      chown root.adm $LOG
      chmod o-rwx $LOG
   fi
done

if [ -f /var/log/kern.log ]; then
    /usr/local/sbin/gate-log-iptables /var/log/kern.log /var/log/ipmasq.log >/dev/null
    savelog -g adm -m 640 -u root -c 90 /var/log/ipmasq.log >/dev/null
    savelog -g adm -m 640 -u root -c 7  /var/log/kern.log >/dev/null
fi
if [ -f /var/log/messages ]; then
    savelog -g adm -m 640 -u root -c 7 /var/log/messages >/dev/null
fi

# Restart syslogd
#
/etc/init.d/sysklogd reload-or-restart
x

これによって, /var/log/kern.log/var/log/messages は, 毎日ローテーションされ, 7 日分保管される. そして, /var/log/kern.log から必要な部分だけを抽出されて整形されたログファイル /var/log/ipmasq.log が毎日生成され, 90 日分保管される.

※ なお, 繰り返しになるが, このファイルも本来 sysklogd(8) によって管理されているので, このパッケージをアップデートすることで書き換えられてしまう. アップデートの際には注意すること.

▲戻る     作成日:2003/06/16(森川靖大)