FORWARD => 全部DROP OUTPUT => 全部ACCEPT INPUT +-main +-ACCEPT(--in-interface lo) | +-icmpPrepare | +-icmpThrowTrust | +-icmpExec | +-ACCEPT(state RELATED,ESTABLISHED) | +-stateNew +-classDPrepare | +-classDExec | +-classEPrepare | +-classEExec | +-httpPrepare | +-httpThrowDie | +-httpExec | +-localNetPrepare | +-localNetExec | +-sshPrepare +-sshThrowTrust +-sshExec
ユーザー定義チェインの最後に1秒あたり10件を最大値としてログを取って終了する。
通らない部分にも書いてある。
$ grep -n log-prefix rules-save.sh | perl -pe 's/iptables -A (.+?) .*--log-prefix "iptables: (.+?): ".*$/("$1" eq "$2") . " : $1"/e' ... $ grep -nP "\-j (REJECT|DROP)" rules-save.sh ...
loインターフェースから来たパケットを許可する。
RELATED,ESTABLISHEDのパケットを許可する。
ルーターからのclassD,classEのアクセスを許可する。
192.168.0.100以外のwebサーバーへのアクセスを許可する。
(一時的な設定として利用する。ある程度の期間で解除する)
icmpを192.168.0.0/24,それ以外の、それぞれで回数制限を入れて許可する。
192.168.0.0/24の範囲でsamba,nfs,dns,ntp,rsync,cvs,svn,muninなどを許可する。
sshを192.168.0.0/24,192.0.43.10/32(example.com)の、それぞれで回数制限を入れて許可する。
消す。1回消すごとに番号を確認する。
$ sudo iptables -L -n -v --line-numbers $ sudo iptables -D httpPrepare 1変更。
$ sudo iptables -R httpPrepare 1 ...1番上に追加。
$ sudo iptables -I httpPrepare ...1番下に追加。
$ sudo iptables -A httpPrepare ...
設定ファイルから読み込み。
$ sudo /etc/init.d/iptables reload設定ファイルに保存。
$ sudo /etc/init.d/iptables save
設定ファイル。
$ sudo cat /var/lib/iptables/rules-save ...
設定コマンドの例。
$ cat bin/rules-save.sh iptables -F INPUT iptables -F FORWARD iptables -F OUTPUT iptables -P INPUT ACCEPT iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -F classDExec iptables -F classDPrepare iptables -F classEExec iptables -F classEPrepare iptables -F httpExec iptables -F httpPrepare iptables -F httpThrowDie iptables -F icmpExec iptables -F icmpPrepare iptables -F icmpThrowTrust iptables -F localNetExec iptables -F localNetPrepare iptables -F main iptables -F sshExec iptables -F sshPrepare iptables -F sshThrowTrust iptables -F stateNew iptables -X classDExec iptables -X classDPrepare iptables -X classEExec iptables -X classEPrepare iptables -X httpExec iptables -X httpPrepare iptables -X httpThrowDie iptables -X icmpExec iptables -X icmpPrepare iptables -X icmpThrowTrust iptables -X localNetExec iptables -X localNetPrepare iptables -X main iptables -X sshExec iptables -X sshPrepare iptables -X sshThrowTrust iptables -X stateNew iptables -N classDExec iptables -N classDPrepare iptables -N classEExec iptables -N classEPrepare iptables -N httpExec iptables -N httpPrepare iptables -N httpThrowDie iptables -N icmpExec iptables -N icmpPrepare iptables -N icmpThrowTrust iptables -N localNetExec iptables -N localNetPrepare iptables -N main iptables -N sshExec iptables -N sshPrepare iptables -N sshThrowTrust iptables -N stateNew iptables -A INPUT -j main iptables -A classDExec -m limit --limit 2/min --limit-burst 6 -j ACCEPT iptables -A classDExec -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: classDExec: " iptables -A classDExec -j DROP iptables -A classDPrepare -s 192.168.0.1/32 -j classDExec iptables -A classDPrepare -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: classDPrepare: " iptables -A classDPrepare -j DROP iptables -A classEExec -m limit --limit 2/min --limit-burst 6 -j ACCEPT iptables -A classEExec -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: classEExec: " iptables -A classEExec -j DROP iptables -A classEPrepare -s 192.168.0.1/32 -j classEExec iptables -A classEPrepare -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: classEPrepare: " iptables -A classEPrepare -j DROP iptables -A httpExec -j ACCEPT iptables -A httpExec -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: httpExec: " iptables -A httpExec -j DROP iptables -A httpPrepare -s 192.168.0.100/32 -j httpThrowDie iptables -A httpPrepare -j httpExec iptables -A httpPrepare -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: httpPrepare: " iptables -A httpPrepare -j DROP iptables -A httpThrowDie -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: httpThrowDie: " iptables -A httpThrowDie -j DROP iptables -A icmpExec -m limit --limit 10/sec --limit-burst 300 -j ACCEPT iptables -A icmpExec -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: icmpExec: " iptables -A icmpExec -j DROP iptables -A icmpPrepare -s 192.168.0.0/24 -j icmpThrowTrust iptables -A icmpPrepare -j icmpExec iptables -A icmpPrepare -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: icmpPrepare: " iptables -A icmpPrepare -j DROP iptables -A icmpThrowTrust -m limit --limit 20/sec --limit-burst 600 -j ACCEPT iptables -A icmpThrowTrust -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: icmpThrowTrust: " iptables -A icmpThrowTrust -j DROP iptables -A localNetExec -j ACCEPT iptables -A localNetExec -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: localNetExec: " iptables -A localNetExec -j DROP iptables -A localNetPrepare -s 192.168.0.0/24 -j localNetExec iptables -A localNetPrepare -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: localNetPrepare: " iptables -A localNetPrepare -j DROP iptables -A main -i lo -j ACCEPT iptables -A main -p icmp -m icmp --icmp-type any -j icmpPrepare iptables -A main -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A main -m state --state NEW -j stateNew iptables -A main -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: main: " iptables -A main -j REJECT --reject-with icmp-host-prohibited iptables -A sshExec -m limit --limit 1/min --limit-burst 6 -j ACCEPT iptables -A sshExec -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: sshExec: " iptables -A sshExec -j DROP iptables -A sshPrepare -s 192.168.0.0/24 -j sshThrowTrust iptables -A sshPrepare -s 192.0.43.10/32 -j sshExec iptables -A sshPrepare -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: sshPrepare: " iptables -A sshPrepare -j DROP iptables -A sshThrowTrust -m limit --limit 2/min --limit-burst 12 -j ACCEPT iptables -A sshThrowTrust -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: sshThrowTrust: " iptables -A sshThrowTrust -j DROP iptables -A stateNew -d 224.0.0.0/4 -j classDPrepare iptables -A stateNew -d 240.0.0.0/4 -j classEPrepare iptables -A stateNew -p tcp -m tcp -m multiport --dports 80,443,8080 -j httpPrepare iptables -A stateNew -p udp -m udp -m multiport --dports 111,2049,32765,32766,32767,32768 -j localNetPrepare iptables -A stateNew -p tcp -m tcp -m multiport --dports 111,2049,32765,32766,32767,32768 -j localNetPrepare iptables -A stateNew -p udp -m udp -m multiport --dports 137,138,139,445 -j localNetPrepare iptables -A stateNew -p tcp -m tcp -m multiport --dports 137,138,139,445 -j localNetPrepare iptables -A stateNew -p udp -m udp -m multiport --dports 53,123,873,2401,3690,4949 -j localNetPrepare iptables -A stateNew -p tcp -m tcp -m multiport --dports 53,123,873,2401,3690,4949 -j localNetPrepare iptables -A stateNew -p tcp -m tcp --dport 22 -j sshPrepare iptables -A stateNew -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: stateNew: " iptables -A stateNew -j REJECT --reject-with icmp-host-prohibited
syslog-ngの場合のログ分割。
$ rcsdiff /etc/config-archive/etc/syslog-ng/syslog-ng.conf,v /etc/syslog-ng/syslog-ng.conf =================================================================== RCS file: /etc/config-archive/etc/syslog-ng/syslog-ng.conf,v retrieving revision 1.11 diff -r1.11 /etc/syslog-ng/syslog-ng.conf 31a32 > destination iptables { file("/var/log/iptables.log"); }; 64c65,66 < filter f_kern { facility(kern); }; --- > filter f_kern { facility(kern); and not message("^iptables: "); }; > filter f_iptables { facility(kern) and message("^iptables: "); }; 92a95 > log { source(kernsrc); filter(f_iptables); destination(iptables); };
ログローテーション。
$ rcsdiff /etc/config-archive/etc/logrotate.d/syslog-ng,v /etc/logrotate.d/syslog-ng =================================================================== RCS file: /etc/config-archive/etc/logrotate.d/syslog-ng,v retrieving revision 1.5 diff -r1.5 /etc/logrotate.d/syslog-ng 9c9 < /var/log/debug /var/log/syslog /var/log/kern.log { --- > /var/log/debug /var/log/syslog /var/log/kern.log /var/log/iptables.log {
例。マルチキャストの許可の一部分。
(1) iptables -A classDExec -m limit --limit 2/min --limit-burst 6 -j ACCEPT (2) iptables -A classDExec -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: classDExec: " (3) iptables -A classDExec -j DROP
説明。
(1) iptables -A classDExec -m limit --limit 2/min --limit-burst 6 -j ACCEPTは一斉にアクセスがあった場合、瞬間的に6回許可できます。
その後は30秒後に許可できます。
アクセスが無い期間が3分続いた場合、再度6回連続で許可できます。
(2) iptables -A classDExec -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix "iptables: classDExec: "拒否されたアクセスを保存します。連続で10回保存できます。
その後は1秒後に保存できます。
アクセスが無い期間が10秒続いた場合、再度10回連続で保存できます。
(3) iptables -A classDExec -j DROP破棄します。破棄したことを相手に連絡しません。
DROPまでの処理の流れ。
(1)は、ルーターが30秒以内に7回マルチキャストを送ってきた場合(回数が回復しないうちに最大数+1送る)に、ACCEPTチェインではなく(2)に移動します。
(2)は、ログの記録数制限なので必ず(3)に移動します。(-j XXX が無い)
(3)は、そこで終了します。
破棄の種類。
-j DROP は負荷が高いので破棄する場合のみが望ましいです。
-j REJECT --reject-with icmp-host-prohibited はそのようなサービス、プロセスなどが無いと伝える場合。
ルールが1回適用されるとダメージが1であるとして、
--limit 2/min --limit-burst 6 最大HP : 6 HP回復量 : 30秒に+1 --limit 1/sec --limit-burst 10 最大HP : 10 HP回復量 : 1秒に+1のような感じです。
瞬間的に大量のアクセスがあるが許可したく、しかし、あまり連続で来られると拒否したい場合は、
--limit-burstを多め、--limitを多めにします。
例えば --limit 1/hour --limit-burst 1000 の場合、一気にアクセスが来ても1000アクセス許可しますが、
1000を超えると、その後は1時間に1回しか許可しません。
HPが1000に戻るまで1000時間かかります。
0 件のコメント:
コメントを投稿