iptablesではDropしたログをなるべく取っておいた方がいいですね。
あれ、なんで繋がらないの!な~んてことがあったときにログを見れば
iptablesで拒否してたことがわかりますのでね。
まずログの出力先を確保
sudo mkdir -p /var/log/iptables
次にログを出す設定
Ubuntu10.04?あたりからsyslogが無くなって代わりにrsyslogになったようで。
今までと同じような書き方でもいいだけど折角なのでrsyslogの書き方で紹介。
rsyslogの場合は/etc/rsyslog.d/のなかに設定ファイルを置く形になってます。
sudo nano /etc/rsyslog.d/35-iptables.conf
:msg,contains,"Dropped" -/var/log/iptables/iptables.log :msg,contains,"Dropped" ~
ちなみにsyslogの時と同じようにするなら以下のファイルの末尾に追加します。
sudo nano /etc/rsyslog.d/50-default.conf
# Log iptables kern.=debug /var/log/iptables/iptables_debug.log kern.=warning /var/log/iptables/iptables_warn.log kern.=notice /var/log/iptables/iptables_notice.log
rsyslogのサービスを再起動します。
sudo service rsyslog restart
iptablesを掛けるときに–log-prefixに先ほど設定したDroppedという文字列を先頭に書いておきます。
sudo nano /etc/iptables.sh
#!/bin/sh # # パス PATH=/sbin:/usr/sbin:/bin:/usr/bin # インタフェース名定義 #LAN0=eth0 #LAN1=eth1 #自サーバーIP MYIP=xxx.xxx.xxx.xxx #ZabbixサーバーIP ZABBIXIP=xxx.xxx.xxx.xxx # 内部ネットワークとして許可する範囲 LOCALNET=xxx.xxx.xxx.xxx/xx # 外部ネットワークとして許可する範囲 #GLOBALNET=xxx.xxx.xxx.xxx/xx ########################################################### # ポリシーの初期化 ########################################################### # すべてのルールを削除 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 $LOCALNET -j ACCEPT iptables -A OUTPUT -p tcp -d $LOCALNET -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 ########################################################### # NetBIOS関連のアクセスはログを記録せずに破棄 # ※不要ログ記録防止 ########################################################### iptables -A INPUT -p tcp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A INPUT -p udp -m multiport --dports 135,137,138,139,445 -j DROP iptables -A OUTPUT -p tcp -m multiport --sports 135,137,138,139,445 -j DROP iptables -A OUTPUT -p udp -m multiport --sports 135,137,138,139,445 -j DROP ########################################################### # 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄 # ※不要ログ記録防止 ########################################################### iptables -A INPUT -d 192.168.1.255 -j DROP iptables -A INPUT -d 255.255.255.255 -j DROP ########################################################### # 113番ポート(IDENT)へのアクセスには拒否応答 # ※メールサーバ等のレスポンス低下防止 ########################################################### iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset ########################################################### # DHCP関連のアクセスはログを記録せずに破棄 # ※不要ログ記録防止 ########################################################### iptables -A INPUT -p udp -m multiport --dports 67,68 -j DROP iptables -A OUTPUT -p udp -m multiport --sports 67,68 -j DROP ########################################################### # (Ubuntu/Debian系のみ) # 60秒以内に10回以上のssh接続を試みたIPアドレスをシャットアウトする ########################################################### iptables -A INPUT -p tcp ! -s $LOCALNET --dport 22 -m state --state NEW -m recent --set --name ssh_attack iptables -A INPUT -p tcp ! -s $LOCALNET --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 --rttl --name ssh_attack -j LOG --log-prefix 'Dropped by SSH Attack: ' iptables -A INPUT -p tcp ! -s $LOCALNET --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 --rttl --name ssh_attack -j DROP ########################################################### # 内向きポリシー ########################################################### # LOCALNETからのTCP22番ポート(SSH)へのアクセスを許可 iptables -A INPUT -p tcp -s $LOCALNET --dport 22 -j ACCEPT # LOCALNETからのTCP20,21番ポート(FTP)へのアクセスを許可 iptables -A INPUT -p tcp -s $LOCALNET -m multiport --dport 20,21 -j ACCEPT # 外部からのTCP80番ポート(HTTP)へのアクセスを許可 iptables -A INPUT -p tcp -d $MYIP --dport 80 -j ACCEPT # 外部からのTCP443番ポート(HTTPS)へのアクセスを許可 iptables -A INPUT -p tcp -d $MYIP --dport 443 -j ACCEPT # 外部からのTCP3306番ポート(MySQL)へのアクセスを許可 iptables -A INPUT -p tcp -s $LOCALNET --dport 3306 -j ACCEPT # ルータからのTCP/UDP53番ポート(DNS)へのアクセスを許可 iptables -A INPUT -p tcp --sport 53 -j ACCEPT iptables -A INPUT -p udp --sport 53 -j ACCEPT # 外部からのTCP123番ポート(NTP)へのアクセスを許可 # ntp.nict.jp iptables -A INPUT -p udp -s 133.243.238.163 --dport 123 --sport 123 -j ACCEPT iptables -A INPUT -p udp -s 133.243.238.164 --dport 123 --sport 123 -j ACCEPT iptables -A INPUT -p udp -s 133.243.238.243 --dport 123 --sport 123 -j ACCEPT iptables -A INPUT -p udp -s 133.243.238.244 --dport 123 --sport 123 -j ACCEPT iptables -A INPUT -p udp -s 210.171.226.40 --dport 123 --sport 123 -j ACCEPT # Zabbixセッションを許可するパケットを受理 iptables -A INPUT -p tcp -s $ZABBIXIP -d $MYIP --dport 10050 -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 $LOCALNET --sport 22 -j ACCEPT # LOCALNETへのTCP20,21番ポート(FTP)へのアクセスを許可 iptables -A OUTPUT -p tcp -d $LOCALNET -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 # MySQLセッションを開始するパケットを受理 iptables -A OUTPUT -p tcp -d $LOCALNET --sport 3306 -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 # Zabbixセッションを許可するパケットを受理 iptables -A OUTPUT -p tcp -s $MYIP -d $ZABBIXIP --dport 10051 -j ACCEPT ########################################################### # 拒否IPアドレスからのアクセスはログを記録せずに破棄 # ※拒否IPアドレスは/etc/.deny_ipに1行ごとに記述しておくこと # (/etc/.deny_ipがなければなにもしない) ########################################################### if [ -s /etc/.deny_ip ]; then iptables -N DENY_HOST for ip in `cat /etc/.deny_ip` do iptables -A DENY_HOST -s $ip -m limit --limit 1/s -j LOG --log-prefix 'Dropped by Deny IP: ' iptables -A DENY_HOST -s $ip -j DROP iptables -I INPUT -j DENY_HOST done fi ########################################################### # 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
そして実行権限を付けて実行。
sudo chmod +x /etc/iptables.sh sudo sh /etc/iptables.sh
あとこのままだとログが肥大化するのでローテートさせる。
sudo nano /etc/logrotate.d/iptables
/var/log/iptables/*.log { daily rotate 30 missingok notifempty compress delaycompress dateext create 644 syslog adm sharedscripts postrotate /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true endscript }
ローテート動作テスト
sudo logrotate -dv /etc/logrotate.d/iptables