Server構築(iptables)

(最終更新日時: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
a System House to build an Accounting system by the Computer Technology