海外からの接続をipset+iptablesでブロックする

ALL
スポンサーリンク

海外からの接続をipset+iptablesでブロックする設定です。
日本国内からの接続を受け入れて、それ以外からの接続をブロックすることで、海外からの接続ブロックとして動作させています。

スポンサーリンク

ipsetでの準備

ipset が使えるようにします。また、ipsetのセットがサーバー再起動時に失われないように ipset-service もインストールします。
CentOSの場合は、次を実行します。

yum install ipset ipset-libs ipset-service

次の内容で ファイル set_ipset_jplist.sh を作成します。

cd $(dirname $0)
LISTNAME=jp-aggregated.zone
SETNAME=JPLIST
mv $LISTNAME $LISTNAME.old 2>/dev/null
curl -f -o $LISTNAME -z $LISTNAME.old https://www.ipdeny.com/ipblocks/data/aggregated/$LISTNAME || exit 1
if [ -f $LISTNAME ]; then
    /usr/sbin/ipset create -exist $SETNAME hash:net
    /usr/sbin/ipset f $SETNAME
    grep -v "^#" $LISTNAME | while read line;do /usr/sbin/ipset add $SETNAME $line; done < /dev/stdin
    /usr/sbin/ipset save > /etc/sysconfig/ipset
fi

次を実行します。

sh  set_ipset_jplist.sh

実行により、ipset のセット名 JPLIST で、日本国内のIPアドレスのリストを作成します。
日本国内のIPアドレスのリストは、IPdeny IP country blocks の https://www.ipdeny.com/ipblocks/data/aggregated/jp-aggregated.zone から取得しています。

また、ipsetのセット内容が、サーバー起動時に適用されるようにしています。(ipset save > /etc/sysconfig/ipset が実行されています)

iptablesでの準備

次を実行して iptables で ユーザー定義チェイン BLOCK_ABROADを作成します。

iptables -N BLOCK_ABROAD

次を実行しBLOCK_ABROAD チェインに2つのルールを追加します。
1つ目のルールは、先の手順「ipsetでの準備」で用意した日本国内のIPアドレスのリストにマッチしたら、ACCEPTします。
2つ目のルールは、1つ目のルールにマッチしなかった場合(=日本国内のIPアドレスでは無い=海外のIPアドレス)に、DROPします。

iptables -A BLOCK_ABROAD -m set --match-set JPLIST src -j ACCEPT
iptables -A BLOCK_ABROAD -j DROP

これにより、海外のIPアドレスの場合にブロックするルールを持つ、BLOCK_ABROAD チェインが作成されました。

海外からの接続をipset+iptablesでブロックする

以上で準備ができました。
あとは次のように iptables の INPUT チェインにルールを追加します。BLOCK_ABROAD チェインを適用させると、海外のIPアドレスの場合にブロックされます。

iptables -A INPUT -j BLOCK_ABROAD 

ただし、一律に海外からのアクセスをブロックすると、次の不都合があります。

・WEBサーバの場合:google等のクローラをブロックしてしまい、WEBページが検索で出てこなくなる
・メールサーバの場合:海外からのメールが届かなくなる

従って、上記のような場合は、80,443番ポート(WEBサーバの場合)、25番(メールサーバの場合)をブロックしないように、次のようにポート番号を限定するようにルールを書いてください。
この例では、22番(SSH)への海外からの接続をブロックします。

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j BLOCK_ABROAD 

最後に、設定したiptables のルールがサーバー再起動時に適用されるようにします。

iptables-save > /etc/sysconfig/iptables

運用

先の手順「ipsetでの準備」で、日本国内のIPアドレスのリストをIPdeny IP country blocks の https://www.ipdeny.com/ipblocks/data/aggregated/jp-aggregated.zone から取得していますが、このリストは毎日更新されています。

cronなどで、毎日下記を実行するようにしてください。

sh set_ipset_jplist.sh

set_ipset_jplist.sh ではリストに変更があった場合のみ、リストを再ダウンロードして、ipset でのセット名 JPLIST の更新を行います。

コメント