特定の国を許可したり拒否する iptables設定

ALL
スポンサーリンク

特定の国を許可したり拒否する iptables設定です。

以前、国内からの接続のみ許可する設定を紹介しましたが、これを拡張して、特定の国を許可したり拒否出来るようにしました。

iptables - 国内からの接続のみ許可して海外からの接続を遮断する パソコン鳥のブログ

設定スクリプト

以下の2つのスクリプトを同じ個所に置きます。
メールサーバやWEBサーバの場合は、必要に応じて、set_iptables.sh のコメントを外して下さい。

set_iptables.sh での設定内容の詳細については、下記を参照して下さい。
iptablesサンプル パソコン鳥のブログ

set_iptables.sh

#!/bin/sh
IPTABLES=/sbin/iptables
if [ $# -eq 1 ]
then
    if [ $1 = "stop" ]
    then
        $IPTABLES -F
        $IPTABLES -Z
        $IPTABLES -X
        $IPTABLES -P INPUT ACCEPT
        $IPTABLES -P OUTPUT ACCEPT
        $IPTABLES -P FORWARD DROP
        echo stopped..
        exit
    fi
fi
$IPTABLES -F
$IPTABLES -Z
$IPTABLES -X
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -N ACCEPT_FILTER
$IPTABLES -A ACCEPT_FILTER -j ACCEPT
$IPTABLES -N DROP_FILTER
$IPTABLES -N sshguard
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type redirect -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
$IPTABLES -A INPUT -j DROP_FILTER
#VPNでIPsecを使用する場合
#$IPTABLES -A INPUT -p 50 -j ACCEPT
#$IPTABLES -A INPUT -p 51 -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT_FILTER
#メールサーバの場合
#$IPTABLES -A INPUT -p tcp --dport 25 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -j sshguard
$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
#ssh接続を許可
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT_FILTER
#メールサーバの場合:pop3,pop3s,iamp4,imap4s許可
#$IPTABLES -A INPUT -p tcp -m multiport --dport 110,995,143,993 -m state --state NEW -j ACCEPT_FILTER
#メールサーバの場合:サブミッションポート許可
#$IPTABLES -A INPUT -p tcp -m multiport --dport 587 -m state --state NEW -j ACCEPT_FILTER
#Webサーバの場合:http,https許可
#$IPTABLES -A INPUT -p tcp -m multiport --dport 80,443 -m state --state NEW -j ACCEPT

set_iptables_accept_drop_filter.sh

#!/bin/bash
LIST_ACCEPT=
LIST_DROP=
IPTABLES=/sbin/iptables
wget -q -N http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip -q -f -c cidr.txt.gz > cidr.txt
if [ -f cidr.txt ]; then
    LIST_ACCEPT=${LIST_ACCEPT/,/\\\|}
    LIST_DROP=${LIST_DROP/,/\\\|}
    $IPTABLES -F ACCEPT_FILTER
    sed -n "s/^\($LIST_ACCEPT\)\t//p" cidr.txt | (while read address; do
        $IPTABLES -A ACCEPT_FILTER -s $address -j ACCEPT
        FLAG=1
    done
    if [ -n "$FLAG" ]; then
        $IPTABLES -A ACCEPT_FILTER -j DROP
    else
        $IPTABLES -A ACCEPT_FILTER -j ACCEPT
    fi)
    $IPTABLES -F DROP_FILTER
    sed -n "s/^\($LIST_DROP\)\t//p" cidr.txt | while read address; do
        $IPTABLES -A DROP_FILTER -s $address -j DROP
    done
fi

設定方法

set_iptables_accept_drop_filter.sh の

LIST_ACCEPT=
LIST_DROP=

の箇所を編集します。

LIST_ACCEPT にアクセスを受け入れる国、LIST_DROP にアクセスを拒否する国を指定します。
複数の国を指定する場合は、,(カンマ)で区切って指定します。

国の指定は下記ページの二字の国コードで指定します。

ISO 3166-1 – Wikipedia

例えば、

LIST_ACCEPT=JP,US
LIST_DROP=CN

のように指定します。

LIST_ACCEPT

ssh接続、メール送受信の接続を許可する国を指定します。

LIST_ACCEPT が空の場合は、全ての国からの接続を許可します。

LIST_ACCEPT に記述した場合は、記述した国からの接続を許可し、記述しない国からの接続は拒否します。
ただし、あなたのサーバのメールアドレスへのメール配信に関する接続や、WEB接続は許可します。

LIST_DROP

記述した国からの接続は全て拒否します。
メール配信に関する接続も拒否しますので、指定の国のメールサーバからは、あなたのサーバのメールアドレスへメールが届かなくなります。

set_iptables_accept_drop_filter.sh の LIST_ACCEPT,LIST_DROP を編集後、

sh set_iptables.sh
sh set_iptables_accept_drop_filter.sh

を実行すると、iptables の設定が行われます。

設定後、iptables設定内容の保存は、下記で行って下さい。

CentOSの場合
/etc/init.d/iptables save を実行
Ubuntuの場合
Ubuntuでiptablesを設定する方法 を参考に設定してください。

設定に関する注意点

接続を拒否する場合の記述は、次の2通りです。

・LIST_ACCEPT に記述しない(ただし、LIST_ACCEPT が空の場合は除く)
・LIST_DROP に記述する

違いはメール配信とWEB接続の許可の有無です。

「LIST_ACCEPT に記述しない(ただし、LIST_ACCEPT が空の場合は除く)」場合は、メール配信とWEB接続は受け入れ、その他の接続は拒否します。
「LIST_DROP に記述する」は、メール配信とWEB接続も拒否します。

WEBサーバの場合は、LIST_DROP で拒否する国に注意が必要です。
google等のクローラは国外からのアクセスです。
例えば US(アメリカ)を拒否すると、クローラの接続を拒否してしまい、google等の検索結果に反映されなくなります。

なお、googleではクローラのIPアドレスを公開していないので、クローラがアメリカ以外からも接続する可能性はあります。

設定例

set_iptables_accept_drop_filter.sh の LIST_ACCEPT,LIST_DROP の設定例です。

LIST_ACCEPT=JP
LIST_DROP=

日本国内からの接続のみ許可します。
メール配信とWEB接続は、全ての国から受け入れます。
不正アクセスの大半は国外からなので、ssh接続を国内に限定することで不正アクセスを大幅にブロックできます。

LIST_ACCEPT=
LIST_DROP=CN

メール配信・WEB接続も含めて、中国からの接続は全て拒否します。
攻撃元の国は中国が多いので、中国をブロックするだけでも効果があります。
中国からのメールが不要な場合は、このように特定の国だけを拒否する設定をお勧めします。

LIST_ACCEPT=JP
LIST_DROP=CN,US

メール配信・WEB接続も含めて、中国・アメリカからの接続は全て拒否します。
ssh等は日本国内からの接続のみ許可します。
攻撃数が多い中国とアメリカをブロックするので、おすすめです。
ただし、WEBサーバの場合は、アメリカからのクローラ接続もブロックしてしまうので、おすすめできません。

コメント