CentOSでiptables用スクリプト作成してログも出力する。
iptables設定用スクリプトを作成し、iptablesのログも出力するようにする。
環境
CentOS6
手順
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 {パーミッション} {ユーザー名} {グループ名} ...
新規ログファイルをローテーションした直後に作成する。
翌日、ログローテートを確認する。