-->

2011-06-26

iptables の設定のサンプル part2

概要。
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 件のコメント: