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

keima's caprice diary

気付いたことをメモのように綴ります。なるべく義務っぽくならないように気まぐれに記録します。

iptables更新シェルスクリプト

シェルスクリプト
1 #! /bin/sh
2
3 trusthost='10.20.1.37'
4 myhost='10.20.1.16'
5 any='0.0.0.0/0'
6
7 ##############
8 #Flush & Reset
9 ##############
10 iptables -F
11 iptables -X
12 ##############
13 #Deafult Rule
14 ##############
15 iptables -P INPUT DROP
16 iptables -P OUTPUT DROP
17 iptables -P FORWARD DROP
18 #########
19 #loopback
20 #########
21 iptables -A INPUT -i lo -j ACCEPT
22 iptables -A OUTPUT -o lo -j ACCEPT
23 #######################
24 #ICMP trusthost->myhost
25 #######################
26 iptables -A INPUT -p icmp --icmp-type echo-request -s $trusthost -d $myhost -j ACCEPT
27 iptables -A OUTPUT -p icmp --icmp-type echo-reply -s $myhost -d $trusthost -j ACCEPT
28 #######################
29 #ICMP myhost->trusthost
30 #######################\
31 iptables -A OUTPUT -p icmp --icmp-type echo-request -s $myhost -d $trusthost -j ACCEPT
32 iptables -A INPUT -p icmp --icmp-type echo-reply -s $trusthost -d $myhost -j ACCEPT
33 #######################
34 #ssh trusthost-> myhost
35 #######################
36 iptables -A INPUT -p tcp -s $trusthost -d $myhost --dport 22 -j ACCEPT
37 iptables -A OUTPUT -p tcp -s $myhost --sport 22 -d $trusthost -j ACCEPT
38 #########
39 #logging
40 #########
41 iptables -N LOGGING
42 iptables -A LOGGING -j LOG --log-level warning --log-prefix "DROP:" -m limit
43 iptables -A LOGGING -j DROP
44 iptables -A INPUT -j LOGGING
45 iptables -A OUTPUT -j LOGGING

 

【解説】

 3、4行目
  メンテナンスホスト(trusthost)とサーバ(myhost)のIPアドレス指定。

 5行目
  不特定クライアント指定。

 10、11行目
  既存iptables設定リセット。

 15行目
  すべての送受信パケットを破棄(DROP)。
  一旦ネットワークを塞いだ後、用途に応じて穴を開ける。
  下記3種類のパケットを破棄。
   ①送信先が受信したホスト自身であるパケット(INPUTチェイン)
   ②ホスト自身で生成されたパケット(OUTPUTチェイン)
   ③受信したパケットの送信先が別のホストであるパケット(FORWARDチェイン)
    #チェイン:フィルタルールを集めてモジュール化したもの
  「-P INPUT」:INPUTチェインで定義されたパケットの破棄(DROP)を指定。

 16行目
  「-P OUTPUT」:OUTPUTチェインの破棄を設定。

 17行目
  「-P FORWARD」:FORWARDチェインの破棄を設定。

 21、22行目
  ループバックインターフェイスを経由するすべての送受信パケットの通過を許可。
  「-i」で受信側インターフェイス、「-o」で送信側インターフェイスを指定します。
  サーバからサーバ自身へのローカル接続をすべて許可。

 26、27行目
  メンテナンスホストからサーバへのpingを許可するルールの追加。
  pingは、「request」(26行目)とそれに答える「reply」(27行目)が対で必要。

 31、32行目
  サーバからメンテナンスホストへのpingを許可するルール。
  送信と受信が入れ替わるため、26、27行目におけるソースホスト(「-s ホストま
  たはネットワーク」)とディスティネーションホストの指定(「-d ホストまたは
  ネットワーク」)、INPUT/OUTPUTチェインが入れ替わっています。

 36、37行目
  ssh設定。ソースIPアドレスだけで制限。
   「-p tcp」:プロトコルTCP
   「-s $trusthost」:ソースIPアドレスが$trusthost
   「-d $myhost」:ディスティネーションIPアドレスが$myhost
   「--dport 22」:ディスティネーションポートが22
   「--sport 22」:ソースポートが22
   「-j ACCEPT」:ACCEPTする

 41行目以降
  監視設定。
  37行目までで特に指定しなかったパケットに関しては、指定したルールでログファ
  イルにその旨を記録。まず41行目で新たなチェイン「LOGGING」を独自に定義。

 42行目
  「--log-level」:ログレベルをwarningに設定。
  「--log-prefix」:ログの頭に「DROP:」を付けることに。
  このままではすべての無効パケットを記録してしまい、サーバに新たな負荷を掛け
  る可能性がある。そこで、「-m limit」で閾値を設け、閾値の範囲内で検出された
  不正パケットのログを出力することに。limitのデフォルトは、同一パターンの不正
  パケットに対し、1時間に最大3回のログ出力、連続した場合には5回の出力をする。

 43行目
  無効パケットの破棄(DROP)を指定。
  ログ出力の後に破棄。

 44、45行目
  INPUTおよびOUTPUTチェインに対しこのLOGGINGが行われるように設定。

 

cf.) 

連載記事 「習うより慣れろ! iptablesテンプレート集」

 

「service iptables save」:現在実行中のiptablesを「/etc/sysconfig/iptables」に保存する。