iptables設定シェルスクリプト@CentOS5の解析メモ #4(ラスト)

iptables設定シェルスクリプト@CentOS5の解析メモ #3 - blog@longkey1.net
の続き。

参考教材
ファイアウォール構築(iptables) - CentOSで自宅サーバー構築

もう少しでアプリ毎の設定にたどり着ける!!
がんばるぞー!!


# 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
}

前提として、/tmp/cidr.txtに国別IPアドレスのリストがあるとする。

■awk
フィルタリングによく使用されるコマンド
{print $2}で2つめのフィールドを出力って感じ。
関数?みたいなもので、後々呼び出して国名の引数渡して使うくさい。
AWK リファレンス - UNIX & Linux コマンド・シェルスクリプト リファレンス

ACCEPT_COUNTRYってのも、のちのち定義されるチェイン。


# 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
}

--limitは前と一緒で1秒間に1回。
--limit-burstが無いけど、デフォルトだと5だから、1秒間に5回以上アクセス来たらログに残すかな。
んで破棄。

DROP_COUNTRYとかは前のACCEPT_COUNTRYと一緒。
ここまで来ると大体意味がわかってきた。


# 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

最初に呼び出す関数設定して、ここは実際の実行部分って感じか。
中国、韓国、台湾多いのかー。
日本はどんぐらいなんだろうな。



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

ポートを気をつければ良いだけなので、解析しない!



# 拒否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

これはまんま。
/root/deny_ipか、これ解析していなかったら飛ばしてたなー。



# 上記のルールにマッチしなかったアクセスはログを記録して破棄
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

上記以外のルールってことは、ここまでどこにも引っかからなかった場合っつうことか。
基本拒否だから、これで良いのか。



# サーバー再起動時にも上記設定が有効となるようにルールを保存
/etc/rc.d/init.d/iptables save

# ファイアウォール起動
/etc/rc.d/init.d/iptables start

ふむ、ここまでシェルに記述するのね。



# chmod 700 iptables.sh ← ファイアウォール設定スクリプトへ実行権限付加

ほう、感慨深いぜ。



# vi iptables_functions ← ファイアウォール設定スクリプト外部関数作成

# IPアドレスリスト取得関数定義
IPLISTGET(){
    # http://nami.jp/ipv4bycc/から最新版IPアドレスリストを取得する
    wget -q http://nami.jp/ipv4bycc/cidr.txt
    # 最新版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
}

■wget -q
-qでログにメッセージを書き出さないとな。
別にどっちでも良いと思うんだけど。
省エネ?

■mail -s
-sで件名



っつうことで、これで残すはアプリ毎の設定のみ。
一日かかったな、ここまで。
けど、かなり勉強になった!!

動かすアプリだけ設定すれば、これで完了。
ふぅ~。

後はログを見ながら運用していくだけだな。
けど、思ったよりよく出来たシェルだと思うなー。
業務で使っても問題なさそうな気がするけど、まずは運用してみるだな。

コメント

アーカイブ

2010

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com