読者です 読者をやめる 読者になる 読者になる

ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

CentOSでiptables用スクリプト作成してログも出力する。

iptables ネットワーク ファイアウォール サーバー環境構築

iptables設定用スクリプトを作成し、iptablesのログも出力するようにする。

環境

CentOS6

手順

iptablesスクリプト作成

iptablesスクリプト作成

vi /etc/iptables.sh

スクリプトにはiptablesのコマンドをずらーっと書くだけ。
最初に初期化、最後に保存してiptablesを実行してる。

「-j LOG」の指定でログ出力をしています。
iptablesのルールは記述順(実行順)に適用されますが、「-j LOG」の行の前にREJECTやDROPされたパケットはログ出力されないようです。

–log-prefix “[iptables firewall]”
でログ出力時の識別子を指定。

–log-level=info
でログ出力のレベルを設定。通常はwarning

下記スクリプト、参考サイトの丸パクリ・・
環境に応じて適宜変更する。
下記だと、warningログだけ出力してる。

#!/bin/sh
#
# パス
PATH=/sbin:/usr/sbin:/bin:/usr/bin

# 内部ネットワークとして許可する範囲
LOCALNET0=192.168.10.0/24
LOCALNET1=10.0.10.0/24


#自サーバーIP
MYIP=10.0.10.30

###########################################################
# ポリシーの初期化
###########################################################
# すべてのルールを削除
iptables -F
iptables -t nat -F
iptables -X

# パケットカウンタをクリア
iptables -Z

# デフォルトのポリシーを設定する
# INPUTはリモートでの設定を考慮する
iptables -P INPUT ACCEPT
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

###########################################################
# ループバックインターフェイスの開放
###########################################################
# ローカルアドレスへの許可
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -p tcp -s $LOCALNET0 -j ACCEPT
iptables -A INPUT -p tcp -s $LOCALNET1 -j ACCEPT
iptables -A OUTPUT -p tcp -d $LOCALNET0 -j ACCEPT
iptables -A OUTPUT -p tcp -d $LOCALNET1 -j ACCEPT

###########################################################
# 内部から行ったアクセスに対する外部からの返答アクセスを許可
###########################################################
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

###########################################################
# ステルススキャンに対抗
###########################################################
# すべてのTCPセッションがSYNで始まらないものをログに記録し、拒否する
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "Dropped by Stealth Scan: "
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

###########################################################
# Ping of Death対策
###########################################################
# 1秒間に10回を超えるpingはログを記録して破棄
#iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j LOG --log-prefix "Dropped by Ping of Death: "
#iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j DROP

###########################################################
# ICMP制御
###########################################################
# ICMPの入力について設定
iptables -A INPUT -p icmp -j ACCEPT

# ICMPの出力について設定
iptables -A OUTPUT -p icmp -j ACCEPT


###########################################################
# 内向きポリシー
###########################################################
# LOCALNETからのTCP22番ポート(SSH)へのアクセスを許可
iptables -A INPUT -p tcp -s $LOCALNET0 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -s $LOCALNET1 --dport 22 -j ACCEPT

# LOCALNETからのTCP20,21番ポート(FTP)へのアクセスを許可
iptables -A INPUT -p tcp -s $LOCALNET0 -m multiport --dport 20,21 -j ACCEPT
iptables -A INPUT -p tcp -s $LOCALNET1 -m multiport --dport 20,21 -j ACCEPT

# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
iptables -A INPUT -p tcp -d $MYIP --dport 80 -j ACCEPT


###########################################################
# 外向きポリシー
###########################################################
# 既に認証されたパケットを受理
iptables -I OUTPUT 1 -p tcp -s $MYIP -m state --state ESTABLISHED,RELATED -j ACCEPT

# LOCALNETからのTCP22番ポート(SSH)へのアクセスを許可
iptables -A OUTPUT -p tcp -d $LOCALNET0 --sport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -d $LOCALNET1 --sport 22 -j ACCEPT

# LOCALNETへのTCP20,21番ポート(FTP)へのアクセスを許可
iptables -A OUTPUT -p tcp -d $LOCALNET0 -m multiport --sport 20,21 -j ACCEPT
iptables -A OUTPUT -p tcp -d $LOCALNET1 -m multiport --sport 20,21 -j ACCEPT

# HTTPセッションを開始するパケットを受理
iptables -A OUTPUT -p tcp -s $MYIP --dport 80 -j ACCEPT

# SSLセッションを開始するパケットを受理
iptables -A OUTPUT -p tcp -s $MYIP --dport 443 -j ACCEPT

# DNSセッションを開始するパケットを受理
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# SMTPセッションを開始するパケットを受理
iptables -A OUTPUT -p tcp -s $MYIP --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp -s $MYIP --dport 465 -j ACCEPT
iptables -A OUTPUT -p tcp -s $MYIP --dport 587 -j ACCEPT

# NTPを許可
iptables -A OUTPUT -p udp -d 133.243.238.243 --dport 123 --sport 123 -j ACCEPT          # ntp-a2.nict.go.jp
iptables -A OUTPUT -p udp -d 133.243.238.244 --dport 123 --sport 123 -j ACCEPT          # ntp-a3.nict.go.jp
iptables -A OUTPUT -p udp -d 133.243.238.163 --dport 123 --sport 123 -j ACCEPT          # ntp-b2.nict.go.jp
iptables -A OUTPUT -p udp -d 133.243.238.164 --dport 123 --sport 123 -j ACCEPT          # ntp-b3.nict.go.jp
iptables -A OUTPUT -p udp -d 210.171.226.40 --dport 123 --sport 123 -j ACCEPT


###########################################################
# INPUTロギング
###########################################################
iptables -N IN_LOGGING
iptables -A IN_LOGGING -j LOG --log-level warning --log-prefix "Dropped by INPUT: "
iptables -A IN_LOGGING -j DROP
iptables -A INPUT -j IN_LOGGING

###########################################################
# OUTPUTロギング
###########################################################
iptables -N OUT_LOGGING
iptables -A OUT_LOGGING -j LOG --log-level warning --log-prefix "Dropped by OUTPUT: "
iptables -A OUT_LOGGING -j DROP
iptables -A OUTPUT -j OUT_LOGGING

###########################################################
# ポリシーの初期化
###########################################################
# デフォルトのポリシーを設定する
# INPUTのみリモートでの設定を考慮する
iptables -P INPUT DROP

###########################################################
# 設定の保存と反映
###########################################################
/etc/init.d/iptables save
/etc/init.d/iptables restart

実行権限付与

chmod +x /etc/iptables.sh

スクリプト実行

sh /etc/iptables.sh

この時点ではまだログは出力されない

ロガー設定

ログ出力先ディレクトリ作成

mkdir /var/log/iptables/

rsyslogの設定
rsyslogがlinux標準のロギングシステムらしい。

vi /etc/rsyslog.conf

追記

kern.info                                               /var/log/iptables/iptables.log

messageログへの出力しないよう設定

.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages

↓変更↓

.info;mail.none;news.none;authpriv.none;cron.none;kern.none /var/log/messages

rsyslogを再起動

service rsyslog restart

ログローテート

上記のままだと1ファイルにログが溜まってしまうのでデイリーでローテートを行う。

linux標準のlogrotateを使用する。
logrotate.d配下に設定ファイルを作成すると自動的に実行される。

vi /etc/logrotate.d/iptables

設定

/var/log/iptables/iptables.log {
  rotate 10
  daily
  compress
  missingok
  notifempty
  create 0644 root root
}

rotete ... n回分ローテート保持
daily ... 毎日ローテート
compress ... 圧縮する
missingok ... ログファイルが見つからなかった場合、エラーメッセージを出力せずに次のログファイルの処理に移行する。
notifempty ... ログファイルが空ならローテートしない
create {パーミッション} {ユーザー名} {グループ名} ...
新規ログファイルをローテーションした直後に作成する。


翌日、ログローテートを確認する。