iptablesの設定

ファイアウォールの設定シェル

昔、どっかから拾ってきて使いまわしてるシェル、今となっては出典不明
これをiptables.shなどという名前にして実行してiptablesを設定する

#!/bin/bash

#---------------------------------------#
# 設定開始                              #
#---------------------------------------#
LAN=eth0

#---------------------------------------#
# 設定終了                              #
#---------------------------------------#

# 内部ネットワークのネットマスク取得
LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`

# 内部ネットワークアドレス取得
LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '`
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK

# すべてのルールをクリア
iptables -F
iptables -X
iptables -Z

# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
iptables -P INPUT   DROP   # 受信はすべて破棄
iptables -P OUTPUT  ACCEPT # 送信はすべて許可
iptables -P FORWARD DROP   # 通過はすべて破棄

# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT

# 内部からのアクセスをすべて許可
#iptables -A INPUT -s $LOCALNET -j ACCEPT

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# フラグメント化されたパケットはログを記録して破棄
iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A INPUT -f -j DROP

# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A INPUT ! -s $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A OUTPUT ! -d $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A OUTPUT ! -d $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP

# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH

# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -d 224.0.0.1 -j DROP

# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

# ACCEPT_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを許可するユーザ定義チェイン作成
#ACCEPT_COUNTRY_MAKE(){
#    for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'`
#    do
#        iptables -A ACCEPT_COUNTRY -s $addr -j ACCEPT
#    done
#}

# DROP_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成
#DROP_COUNTRY_MAKE(){
#    for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'`
#    do
#        iptables -A DROP_COUNTRY -s $addr -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_COUNTRY] : '
#        iptables -A DROP_COUNTRY -s $addr -j DROP
#    done
#}

# IPアドレスリスト取得
#. /root/iptables_functions
#IPLISTGET

# 日本からのアクセスを許可するユーザ定義チェインACCEPT_COUNTRY作成
#iptables -N ACCEPT_COUNTRY
#ACCEPT_COUNTRY_MAKE JP
# 以降,日本からのみアクセスを許可したい場合はACCEPTのかわりにACCEPT_COUNTRYを指定する

# 中国・韓国・台湾※からのアクセスをログを記録して破棄
# ※全国警察施設への攻撃元上位3カ国(日本・アメリカを除く)
# http://www.cyberpolice.go.jp/detect/observation.htmlより
#iptables -N DROP_COUNTRY
#DROP_COUNTRY_MAKE CN
#DROP_COUNTRY_MAKE KR
#DROP_COUNTRY_MAKE TW
#iptables -A INPUT -j DROP_COUNTRY

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここから)               #
#----------------------------------------------------------#

# 外部からのTCP:22番ポート(SSH)へのアクセス
# ※SSHサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 外部からのTCP/UDP:53番ポート(DNS)へのアクセス
# ※外部向けDNSサーバーを運用する場合のみ
#iptables -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -A INPUT -p udp --dport 53 -j ACCEPT

# 外部からのTCP:80番ポート(HTTP)へのアクセス
# ※Webサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 外部からのTCP:443番ポート(HTTPS)へのアクセス
# ※Webサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 外部からのTCP:21番ポート(FTP)へのアクセス
# ※FTPサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# 外部からのPASV用ポート(FTP-DATA)へのアクセス
# ※FTPサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 60000:60010 -j ACCEPT

# 外部からのTCP:25番ポート(SMTP)へのアクセス
# ※SMTPサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 25 -j ACCEPT
#iptables -A INPUT -p tcp --dport 587 -j ACCEPT

# 外部からのTCP:465番ポート(SMTPS)へのアクセス
# ※SMTPSサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 465 -j ACCEPT

# 外部からのTCP:110番ポート(POP3)へのアクセス
# ※POP3サーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 110 -j ACCEPT

# 外部からのTCP:995番ポート(POP3S)へのアクセス
# ※POP3Sサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 995 -j ACCEPT

# 外部からのTCP:143番ポート(IMAP)へのアクセス
# ※IMAPサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 143 -j ACCEPT

# 外部からのTCP:993番ポート(IMAPS)へのアクセス
# ※IMAPSサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 993 -j ACCEPT

# 外部からのUDP:1194番ポート(OpenVPN)へのアクセス
# ※OpenVPNサーバーを公開する場合のみ
#iptables -A INPUT -p udp --dport 1194 -j ACCEPT_COUNTRY

# VPNインタフェース用ファイアウォール設定
# ※OpenVPNサーバーを公開する場合のみ
#[ -f /etc/openvpn/openvpn-startup ] && /etc/openvpn/openvpn-startup

# 外部からのTCP:10000番ポート(Webmin)へのアクセス
# ※Webminサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 10000 -j ACCEPT_COUNTRY

# 外部からのTCP:888番ポート(3ware 3DM2)へのアクセス
#iptables -A INPUT -p tcp --dport 888 -j ACCEPT_COUNTRY

# 外部からのTCP:10050番ポート(zabbix)へのアクセス
iptables -A INPUT -p tcp --dport 10050:10051 -j ACCEPT
#iptables -A INPUT -p udp --dport 10050:10051 -j ACCEPT_COUNTRY
#iptables -A INPUT -s <<IPアドレス>> -p tcp --dport 10050 -j ACCEPT

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここまで)               #
#----------------------------------------------------------#

# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/deny_ip ]; then
    for ip in `cat /root/deny_ip`
    do
        iptables -I INPUT -s $ip -j DROP
    done
fi

# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
iptables -A INPUT -j DROP
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
iptables -A FORWARD -j DROP

なお、このシェルの国を識別してアクセス制限をする機能を使うには
↓のシェルをiptables_functionsという名前で同じディレクトリに保存しておく
# IPアドレスリスト取得関数定義
IPLISTGET(){
    # http://nami.jp/ipv4bycc/から最新版IPアドレスリストを取得する
    wget -q http://nami.jp/ipv4bycc/cidr.txt.gz
    gunzip cidr.txt.gz
    # 最新版IPアドレスリストが取得できなかった場合
    if [ ! -f cidr.txt ]; then
        if [ -f /tmp/cidr.txt ]; then
            # バックアップがある場合はその旨をroot宛にメール通知して処理を打ち切る
            echo cidr.txt was read from the backup! | mail -s $0 root
            exit 1
        else
            # バックアップがない場合はその旨をroot宛にメール通知して処理を打ち切る
            echo cidr.txt not found!|mail -s $0 root
            exit 1
        fi
    fi
    # 最新版IPアドレスリストを /tmpへバックアップする
    /bin/mv cidr.txt /tmp/cidr.txt
}

IPアドレスを識別してアクセス拒否をしたい場合はdeny_ipというファイルを用意して
IPアドレスを改行区切りで並べるのかな?使ったことないから分からないけど

ちなみに、CentOSのバージョンが6のサーバーに適用したら以下の部分の4行でエラーが出たので修正した
iptables -A INPUT -s ! $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
 ↓
iptables -A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP

これで設定を保存、再起動しても安心
service iptables save
最終更新:2012年06月04日 16:08