海外からの接続を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 の更新を行います。
コメント