1 #!/bin/sh 2
3 PATH=/sbin:/bin:/usr/bin:/usr/sbin 4
5 ## 変数の定義
6 INTERNAL_INTERFACE="eth0" # 内側インタフェースの名前 7 EXTERNAL_INTERFACE="eth1" # 外側インタフェースの名前 8 DMZ_INTERFACE="eth2" # DMZ側インタフェースの名前 9
10 # 外側インタフェースのIPアドレス
11 IPADDR=‘ifconfig $EXTERNAL_INTERFACE | \
12 sed -e ’s/^.*inet addr :\([^ ]*\).*$/\1/p’ -e d‘
13
14 # 外部ネットワークのブロードキャスト・アドレス 15 BCAST=‘ifconfig $EXTERNAL_INTERFACE | \ 16 sed -e ’s/^.*Bcast:\([^ ]*\) .*$/\1/p’ -e d‘
17
18 # 内部ネットワークのブロードキャスト・アドレス 19 INTERNAL_BCAST=‘ifconfig $INTERNAL_INTERFACE | \ 20 sed -e ’s/^.*Bcast:\([^ ]*\) .*$/\1/p’ -e d‘
21
22 # 内部ネットワーク・アドレスのネットマスク長
23 INTERNAL_MASK=‘/sbin/ifconfig $INTERNAL_INTERFACE | \ 24 sed -e ’s/^.*Mask:\([^ ]*\) .*$/\1/p’ -e d‘
25
26 # 内部ネットワーク・アドレス
27 INTERNAL_LAN_X=‘netstat -rn | grep $INTERNAL_INTERFACE | \ 28 grep $INTERNAL_MASK | cut -f1 -d’ ’‘
29 INTERNAL_LAN=$INTERNAL_LAN_X/$INTERNAL_MASK 30
31 # DMZネットワーク・アドレスのネットマスク長
32 DMZ_MASK=‘/sbin/ifconfig $DMZ_INTERFACE | \ 33 sed -e ’s/^.*Mask:\([^ ]*\)/\1/p’ -e d‘
34
35 # DMZネットワーク・アドレス
36 DMZ_LAN_X=‘netstat -rn | grep $DMZ_INTERFACE | \ 37 grep $DMZ_MASK | cut -f1 d’ ’‘
38 DMZ_LAN=$DMZ_LAN_X/$DMZ_MASK 39
40 ANYWHERE="0.0.0.0/0"
41
42 ## 以下の設定を実行している間はパケットの転送を停止する 43 echo 0 > /proc/sys/net/ipv4/ip_forward
44
45 ## すでに設定されているルールを消去する
46 iptables -F
47 iptables -F -t nat 48
49 ## ポリシーの初期設定 50 iptables -P INPUT DROP 51 iptables -P OUTPUT ACCEPT 52 iptables -P FORWARD DROP 53
54 ## ループバック・インタフェースの入出力を許可する 55 iptables -A INPUT -i lo -j ACCEPT
56 iptables -A OUTPUT -o lo -j ACCEPT 57
58 ## TCP SYN Flood攻撃を防ぐためにSYN Cookiesを有効にする 59 echo 1 > /proc/sys/net/ipv4/tcp_syncookies
60
61 ## Broadcast pingに応答しないようにする
62 echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses 63
64 ## Source Routedパケットを拒否する
65 for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do 66 eho 0 >$i
67 done 68
69 ## ICMP Redirectパケットを拒否する
70 for i in /proc/sys/net/ipv4/conf/*/accept_redirect; do 71 echo 0 >$i
72 done 73
74 ## 外側インタフェースのIPアドレスが取得できなかった場合は,フィルタを設定しない 75 if [ -z "$IPADDR" ]; then
76 iptables -A INPUT -i $INTERNAL_INTERFACE -j ACCEPT 77 exit 0
78 fi 79
80 ##############################################################################
81 ##
82 ## INPUTチェーンの設定(デフォルト拒否)
83 ##
84 85 ###
86 ### インターネットからルータが受信したパケットのフィルタリング 87 ###
88 ### 注意点
89 ### - ルータへの不必要なアクセスを拒否する 90 ### - smurf 攻撃の踏み台にならないように 91
92 ## 内部ネットワークから送った(ようにみえる)パケットを 93 ## 外部インタフェースから受信するはずはない
94 ## 拒否したパケットのログも記録する
95 iptables -A INPUT -i $EXTERNAL_INTERFACE -s $INTERNAL_LAN -j LOG \ 96 --log-prefix "spoofed packet "
97 iptables -A INPUT -i $EXTERNAL_INTERFACE -s $INTERNAL_LAN -j DROP 98
99 ## 自分が送った(ようにみえる)パケットを 100 ## 外部インタフェースから受信するはずはない 101 ## 拒否したパケットのログも記録する
102 iptables -A INPUT -i $EXTERNAL_INTERFACE -s $IPADDR -j LOG \ 103 --log-prefix "spoofed packet "
104 iptables -A INPUT -i $EXTERNAL_INTERFACE -s $IPADDR -j DROP 105
106 ## DHCPのパケットを許可する
107 ## (CATV,ISP用,DHCPを使用ない場合はコメントアウトする)
108 # iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp -s $ANYWHERE \ 109 # -d $ANYWHERE --sport bootps --dport bootpc -j ACCEPT
110
111 ## 他ホストの DHCP パケットを拒否する
112 iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp --sport bootpc \ 113 --dport bootps -j DROP
114
115 ## 始点・終点アドレスがプライベートIPアドレスのパケットを拒否する 116 ## ISPからプライベートIPアドレスを割り当てられている場合は,
117 ## 該当エントリを削除する
118 iptables -A INPUT -i $EXTERNAL_INTERFACE -s 10.0.0.0/8 -j DROP 119 iptables -A INPUT -i $EXTERNAL_INTERFACE -s 172.16.0.0/12 -j DROP 120 iptables -A INPUT -i $EXTERNAL_INTERFACE -s 192.168.0.0/16 -j DROP 121 iptables -A INPUT -i $EXTERNAL_INTERFACE -d 10.0.0.0/8 -j DROP 122 iptables -A INPUT -i $EXTERNAL_INTERFACE -d 172.16.0.0/12 -j DROP 123 iptables -A INPUT -i $EXTERNAL_INTERFACE -d 192.168.0.0/16 -j DROP 124
125 ## ブロードキャスト・パケットを拒否する
126 iptables -A INPUT -i $EXTERNAL_INTERFACE -d 255.255.255.255 -j DROP 127 iptables -A INPUT -i $EXTERNAL_INTERFACE -d 224.0.0.1 -j DROP 128 if [ -n "$BCAST" ]; then
129 iptables -A INPUT -i $EXTERNAL_INTERFACE -d $BCAST -j DROP 130 fi
131
132 ## IDENTにはTCP RESETを返す
133 iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp --dport ident -j REJECT \ 134 --reject-with tcp-reset
135
136 ## コネクションの戻りパケットを許可する
137 iptables -A INPUT -i $EXTERNAL_INTERFACE -m state --state ESTABLISHED \ 138 -j ACCEPT
139
140 ## その他,拒否したパケットのログを記録する
141 iptables -A INPUT -i $EXTERNAL_INTERFACE -j LOG
142 143 ###
144 ### 内部ネットワークからルータが受信したパケットのフィルタリング 145 ###
146
147 ## すべて許可する
148 iptables -A INPUT -i $INTERNAL_INTERFACE -j ACCEPT 149
150 ###
151 ### DMZネットワークからルータが受信したパケットのフィルタリング
152 ###
153
154 ## DNSとNTPのみ許可する
155 iptables -A INPUT -i $DMZ_INTERFACE -p udp --dport 53 -j ACCEPT 156 iptables -A INPUT -i $DMZ_INTERFACE -p udp --dport 123 -j ACCEPT 157
158 ## その他,拒否したパケットのログを記録する 159 iptables -A INPUT -i $DMZ_INTERFACE -j LOG 160
161 ##############################################################################
162 ##
163 ## FORWARDチェーンの設定(デフォルト拒否)
164 ##
165
166 ## Ingressフィルタリング(RFC2827)
167 ## 拒否したパケットのログを記録する
168 iptables -A FORWARD -i $DMZ_INTERFACE -s ! $DMZ_LAN -j LOG \ 169 --log-prefix "ingress filtering "
170 iptables -A FORWARD -i $DMZ_INTERFACE -s ! $DMZ_LAN -j DROP 171
172 iptables -A FORWARD -i $INTERNAL_INTERFACE -s ! $INTERNAL_LAN -j LOG \ 173 --log-prefix "ingress filtering "
174 iptables -A FORWARD -i $INTERNAL_INTERFACE -s ! $INTERNAL_LAN -j DROP 175
176 ## 内部ネットワークから送った(ようにみえる)パケットを外部インタフェースから受信するはずはない 177 ## 拒否したパケットのログも記録する
178 iptables -A FORWARD -i $EXTERNAL_INTERFACE -s $INTERNAL_LAN -j LOG \ 179 --log-prefix "spoofed packet "
180 iptables -A FORWARD -i $EXTERNAL_INTERFACE -s $INTERNAL_LAN -j DROP 181
182 ## 始点アドレスがプライベートIPアドレスのパケットを拒否する
183 ## ISPからプライベートアドレスを割り当てられる場合は,該当エントリを削除する
184 iptables -A FORWARD -i $EXTERNAL_INTERFACE -s 10.0.0.0/8 -j DROP 185 iptables -A FORWARD -i $EXTERNAL_INTERFACE -s 172.16.0.0/12 -j DROP 186 iptables -A FORWARD -i $EXTERNAL_INTERFACE -s 192.168.0.0/16 -j DROP 187
188 ## Windows DCE RPC,NetBIOS,Direct Hosting SMBパケットを拒否する 189 iptables -A FORWARD -p tcp -m multiport \
190 --source-port 135,137,138,139,445 -j DROP 191 iptables -A FORWARD -p udp -m multiport \ 192 --source-port 135,137,138,139,445 -j DROP 193 iptables -A FORWARD -p tcp -m multiport \
194 --destination-port 135,137,138,139,445 -j DROP 195 iptables -A FORWARD -p udp -m multiport \
196 --destination-port 135,137,138,139,445 -j DROP 197
198 ###
199 ### インターネット ⇔ DMZ 間のフィルタリング 200 ###
201
202 ## IDENTにはTCP RESETを返す
203 iptables -A FORWARD -i $DMZ_INTERFACE -p tcp --dport ident -j REJECT \ 204 --reject-with tcp-reset
205
206 ## サーバーへの接続を許可する
207 ## 許可するポート番号はDNATで決まるので,ここで指定はしなくてよい 208 ## サーバーがグローバルIPアドレスの場合は,許可するプロトコルと 209 ## ポート番号を指定すること
210 iptables -A FORWARD -i $EXTERNAL_INTERFACE -o $DMZ_INTERFACE \ 211 -m state --state NEW,ESTABLISHED -j ACCEPT
212
213 ## 戻りパケットを許可する
214 ## DMZ → インターネットへの接続は許可しない
215 iptables -A FORWARD -i $DMZ_INTERFACE -o $EXTERNAL_INTERFACE \ 216 -m state --state ESTABLISHED -j ACCEPT
217 218 ###
219 ### DMZ ⇔ 内部 間のフィルタリング 220 ###
221
222 ## 内部 → DMZ はデフォルト許可
223 iptables -A FORWARD -i $INTERNAL_INTERFACE -o $DMZ_INTERFACE \ 224 -m state --state NEW,ESTABLISHED -j ACCEPT
225
226 ## 戻りパケットを許可する
227 ## 注意:DMZ → 内部の接続は許可してはいけない
228 iptables -A FORWARD -i $DMZ_INTERFACE -o $INTERNAL_INTERFACE \ 229 -m state --state ESTABLISHED,RELATED -j ACCEPT
230 231 ###
232 ### インターネット ⇔ 内部 間のフィルタリング 233 ###
234
235 ## 内部 → インターネット はデフォルト許可
236 iptables -A FORWARD -i $INTERNAL_INTERFACE -o $EXTERNAL_INTERFACE \ 237 -m state --state NEW,ESTABLISHED -j ACCEPT
238
239 ## 戻りパケットを許可する
240 ## 注意:インターネット → 内部の接続は許可してはいけない
241 iptables -A FORWARD -i $EXTERNAL_INTERFACE -o $INTERNAL_INTERFACE \ 242 -m state --state ESTABLISHED,RELATED -j ACCEPT
243
244 ##############################################################################
245 ##
246 ## NATの設定 247 ##
248
249 ## 端末型接続の場合は IP masquerade
250 iptables -A POSTROUTING -t nat -o $EXTERNAL_INTERFACE -j MASQUERADE 251
252 ## インターネット → DMZ のWebアクセスを転送する
253 iptables -A PREROUTING -t nat -i $EXTERNAL_INTERFACE \ 254 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2 255
256 ## パケットの転送を開始する
257 echo 1 > /proc/sys/net/ipv4/ip_forward 258
259 exit 0