(最終更新日時:2008-12-28 20:52:49)
iptablesによるファイアウォールの設定です。
不正アクセス等が防げることを保証するものではありません。設定については自己責任でお願いいたします。
設定ファイルの編集
起動時にFTPをPASVモードを使用するためのモジュールを追加します。
# vi /etc/sysconfig/iptables-config
:
IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp"
:
# service iptables restart 再起動します
設定用スクリプトの作成
設定のためのスクリプトを作成します。
# vi /usr/local/sbin/firewall.sh
#!/bin/sh
# 外部I/Fのネットワーク情報
EXTIF="eth0"
EXTIP=$(ifconfig $EXTIF | grep inet | cut -d : -f 2 | cut -d \ -f 1)
# 内部I/Fのネットワーク情報
INTIF="eth1"
INTIP=$(ifconfig $INTIF | grep inet | cut -d : -f 2 | cut -d \ -f 1)
INTMASK=$(ifconfig $INTIF | grep Mask | cut -d : -f 4)
INTLAN=$INTIP'/'$INTMASK
# 非特権ポート
UNPRIVPORTS="1024:65535"
# パラメータ
LOGLIMIT="2/s" # ログマッチ許可 2回/秒
LOGBURST="5" # ログマッチ最大値 5回
SYNLIMIT="5/s" # SYN-Flood許可 5回/秒
SYNBURST="10" # SYN-Flood最大値 10回
PINGLIMIT="5/s" # PING-Flood許可 5回/秒
PINGBURST="10" # PING-Flood最大値 10回
# 全チェインをクリア
iptables -F
iptables -t nat -F
iptables -t mangle -F
# 全ユーザ定義チェインをクリア
iptables -X
iptables -t nat -X
iptables -t mangle -X
# 全カウンタをクリア
iptables -Z
iptables -t nat -Z
iptables -t mangle -Z
# デフォルトポリシをDROPに設定する
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# --- (ログチェインの定義) ---
# DROPパケット
iptables -N LOG-DROP
iptables -A LOG-DROP -p all \
-m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
-j LOG --log-prefix "iptables DROP "
iptables -A LOG-DROP -f \
-m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
-j LOG --log-prefix "iptables FRAGMENT DROP "
iptables -A LOG-DROP -j DROP
# REJECTパケット
iptables -N LOG-REJECT
iptables -A LOG-REJECT -p all \
-m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
-j LOG --log-prefix "iptables REJECT "
iptables -A LOG-REJECT -f \
-m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
-j LOG --log-prefix "iptables FRAGMENT REJECT "
iptables -A LOG-REJECT -p tcp -j REJECT --reject-with tcp-reset
iptables -A LOG-REJECT -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -A LOG-REJECT -j REJECT
# PING-Floodパケット
iptables -N LOG-PINGFLOOD
iptables -A LOG-PINGFLOOD -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
-j LOG --log-prefix "iptables PINGFLOOD DROP "
iptables -A LOG-PINGFLOOD -j DROP
# SYN-Floodパケット
iptables -N LOG-SYNFLOOD
iptables -A LOG-SYNFLOOD -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
-j LOG --log-prefix "iptables SYNFLOOD DROP "
iptables -A LOG-SYNFLOOD -j DROP
# 不正なフラグを持つパケット
iptables -N LOG-BADFLAG
iptables -A LOG-BADFLAG -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
-j LOG --log-prefix "iptables BADFLAG DROP "
iptables -A LOG-BADFLAG -j DROP
# 既存の接続に結び付けられていないパケットを破棄
iptables -N LOG-INVALID
iptables -A LOG-INVALID -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
-j LOG --log-prefix "iptables INVALID DROP "
iptables -A LOG-INVALID -j DROP
# --- (ユーザ定義チェイン) ---
# INPUT-ICMPをチェック
iptables -N CHK-IN-ICMP
# Ping Flood対策
iptables -A CHK-IN-ICMP -p icmp --icmp-type echo-request \
-m limit --limit $PINGLIMIT --limit-burst $PINGBURST -j ACCEPT
iptables -A CHK-IN-ICMP -p icmp --icmp-type echo-request -j LOG-PINGFLOOD
# ICMP-Redirectsを破棄
iptables -A CHK-IN-ICMP -p icmp --icmp-type redirect -j LOG-DROP
# ICMP-Timestampを破棄
iptables -A CHK-IN-ICMP -p icmp --icmp-type timestamp-request -j LOG-DROP
iptables -A CHK-IN-ICMP -p icmp --icmp-type timestamp-reply -j LOG-DROP
# ICMP-address-maskを破棄
iptables -A CHK-IN-ICMP -p icmp --icmp-type address-mask-request -j LOG-DROP
iptables -A CHK-IN-ICMP -p icmp --icmp-type address-mask-reply -j LOG-DROP
# チェックOKなら許可
iptables -A CHK-IN-ICMP -p icmp -j ACCEPT
# OUTPUT-ICMPをチェック
iptables -N CHK-OUT-ICMP
# ICMP-Redirectsを破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type redirect -j LOG-DROP
# ICMP-TTL-Expiredを破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type ttl-zero-during-transit -j LOG-DROP
iptables -A CHK-OUT-ICMP -p icmp --icmp-type ttl-zero-during-reassembly -j LOG-DROP
# ICMP-Parameter-Problemを破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type parameter-problem -j LOG-DROP
# ICMP-Timestampを破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type timestamp-request -j LOG-DROP
iptables -A CHK-OUT-ICMP -p icmp --icmp-type timestamp-reply -j LOG-DROP
# ICMP-address-maskを破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type address-mask-request -j LOG-DROP
iptables -A CHK-OUT-ICMP -p icmp --icmp-type address-mask-reply -j LOG-DROP
# チェックOKなら許可
iptables -A CHK-OUT-ICMP -p icmp -j ACCEPT
# SYN-Floodチェック
iptables -N CHK-SYNFLOOD
iptables -A CHK-SYNFLOOD -p tcp --syn \
-m limit --limit $SYNLIMIT --limit-burst $SYNBURST -j ACCEPT
iptables -A CHK-SYNFLOOD -p tcp --syn -j LOG-SYNFLOOD
iptables -A CHK-SYNFLOOD -p tcp ! --syn -j ACCEPT
# 不正なフラグをチェック
iptables -N CHK-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags SYN,RST SYN,RST -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ACK,FIN FIN -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ACK,PSH PSH -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ACK,URG URG -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags FIN,RST FIN,RST -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ALL ALL -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ALL NONE -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ALL SYN,FIN,URG,PSH -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-option 64 -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-option 128 -j LOG-BADFLAG
# 外部とのSMBパケットを破棄
iptables -N DROP-SMB
iptables -A DROP-SMB -p tcp --dport 137:139 -j DROP
iptables -A DROP-SMB -p tcp --dport 445 -j DROP
iptables -A DROP-SMB -p udp --dport 137:139 -j DROP
iptables -A DROP-SMB -p udp --dport 445 -j DROP
iptables -A DROP-SMB -p tcp --sport 137:139 -j DROP
iptables -A DROP-SMB -p tcp --sport 445 -j DROP
iptables -A DROP-SMB -p udp --sport 137:139 -j DROP
iptables -A DROP-SMB -p udp --sport 445 -j DROP
# --- (INPUTチェイン) ---
# 不正なフラグを持つパケットを破棄
iptables -A INPUT -p tcp -j CHK-BADFLAG
# ローカルからのパケットを許可
iptables -A INPUT -i lo -j ACCEPT
# ローカルアドレス宛のパケットをリジェクト
iptables -A INPUT -d 127.0.0.0/8 -j LOG-REJECT
# 内部LANからのパケットを許可
iptables -A INPUT -i $INTIF -s $INTLAN -j ACCEPT
# 内部LANを騙る偽パケットをリジェクト
iptables -A INPUT -s $INTLAN -j LOG-REJECT
# INPUT ICMPパケットをチェック
iptables -A INPUT -i $EXTIF -p icmp -j CHK-IN-ICMP
# 外部とのSMBパケットを破棄
iptables -A INPUT -i $EXTIF -j DROP-SMB
# IDENTパケットを拒否
iptables -A INPUT -i $EXTIF -p tcp --dport 113 -j REJECT --reject-with tcp-reset
# 内部I/FのDHCP Broadcastを許可
iptables -A INPUT -i $INTIF -p udp --sport 68 --dport 67 -j ACCEPT
# ESTABLISHED/RELATED接続を許可
iptables -A INPUT -i $EXTIF -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i $EXTIF -p tcp --dport $UNPRIVPORTS \
-m state --state RELATED -j CHK-SYNFLOOD
iptables -A INPUT -i $EXTIF -p udp --dport $UNPRIVPORTS -m state --state RELATED -j ACCEPT
# 上記の何れにもマッチしなかったINPUTパケットを廃棄
iptables -A INPUT -j LOG-DROP
# --- (OUTPUTチェイン) ---
# ローカルのパケットを許可する
iptables -A OUTPUT -o lo -j ACCEPT
# 内部LANへのパケットを許可
iptables -A OUTPUT -o $INTIF -d $INTLAN -j ACCEPT
# OUPUT ICMPパケットをチェック
iptables -A OUTPUT -o $EXTIF -p icmp -j CHK-OUT-ICMP
# UDPのtracerouteコマンドを許可
iptables -A OUTPUT -o $EXTIF -p udp --dport 33434:33523 -m state --state NEW -j ACCEPT
# 外部とのSMBパケットを破棄
iptables -A OUTPUT -o $EXTIF -j DROP-SMB
# 非特権ポートからのTCP/UDPパケットを許可
iptables -A OUTPUT -o $EXTIF -s $EXTIP -p tcp --sport $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTIF -s $EXTIP -p udp --sport $UNPRIVPORTS -j ACCEPT
# 上記の何れにもマッチしなかったOUTPUTパケットを廃棄
iptables -A OUTPUT -j LOG-DROP
# --- (FORWARDチェイン) ---
# 既存の接続に結び付けられていないパケットを破棄
iptables -A FORWARD -i $EXTIF -m state --state NEW,INVALID -j LOG-INVALID
# 不正なフラグを持つパケットを破棄
iptables -A FORWARD -p tcp -j CHK-BADFLAG
# 外部とのSMBパケットを破棄
iptables -A FORWARD -o $EXTIF -j DROP-SMB
# 内部LANから外部へ非特権ポートからの転送を許可
iptables -A FORWARD -i $INTIF -o $EXTIF -s $INTLAN -p tcp --sport $UNPRIVPORTS -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -s $INTLAN -p udp --sport $UNPRIVPORTS -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -s $INTLAN -p icmp -j ACCEPT
# 外部から内部LANへ非特権ポートへの転送を許可
iptables -A FORWARD -i $EXTIF -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $EXTIF -p tcp --dport $UNPRIVPORTS -m state --state RELATED -j CHK-SYNFLOOD
iptables -A FORWARD -i $EXTIF -p udp --dport $UNPRIVPORTS -m state --state RELATED -j ACCEPT
iptables -A FORWARD -i $EXTIF -p icmp -m state --state RELATED -j ACCEPT
# 上記の何れにもマッチしなかったFORWARDパケットを廃棄
iptables -A FORWARD -j LOG-DROP
# --- (POSTROUTING) ---
iptables -A POSTROUTING -t nat -o $EXTIF -j MASQUERADE
# --- (ルールを保存する) ---
service iptables save
ファイアウォールの適用
作成したスクリプトを実行します。
# chmod +x /usr/local/sbin/firewall.sh
# firewall.sh
Copyright © 2004-2009 System House ACT. All Rights Reserved.