iptables - 国内からの接続のみ許可して海外からの接続を遮断する

ALL
スポンサーリンク

iptablesで日本国内からのみ接続させ、海外からは接続させないようにするための設定についてです。

設定スクリプト

前回(iptablesサンプル)の setip.sh実行に引き続いて、sh jp_only.sh を実行してください。
setip.sh内で -j ACCEPT_FILTER と記述されていた箇所では、日本国内からの接続のみを許可するようになり、海外からの接続は拒否します。
設定後、iptables設定内容の保存を忘れないようにして下さい。保存方法については、前回を参照してください。

jp_only.sh

#!/bin/sh
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
    $IPTABLES -F ACCEPT_FILTER
    sed -n 's/^JP\t//p' cidr.txt | while read address; do
        $IPTABLES -A ACCEPT_FILTER -s $address -j ACCEPT
    done
    $IPTABLES -A ACCEPT_FILTER -j DROP
fi

説明

jp_only.sh を実行すると、次のようなiptablesコマンドが実行されます。
x.x.x.x/yy の箇所が IPアドレス(のCIDR表記)です。

/sbin/iptables -F ACCEPT_FILTER
/sbin/iptables -A ACCEPT_FILTER -s x.x.x.x/yy -j ACCEPT
/sbin/iptables -A ACCEPT_FILTER -s x.x.x.x/yy -j ACCEPT
      :
/sbin/iptables -A ACCEPT_FILTER -j DROP

/sbin/iptables -F ACCEPT_FILTER
ACCEPT_FILTERチェインの内容を全消去します。

/sbin/iptables -A ACCEPT_FILTER -s x.x.x.x/yy -j ACCEPT
x.x.x.x/yy の箇所が日本国内のIPアドレス(のCIDR表記)で記述されています。このような記述の行がたくさん続きます。
これらの行により、接続元が日本国内のIPアドレスの場合、ACCEPT(パケット受信を許可)します。

/sbin/iptables -A ACCEPT_FILTER -j DROP
/sbin/iptables -A ACCEPT_FILTER -s x.x.x.x/yy -j ACCEPT で列挙されているIPアドレスのどれでも無い場合は、日本国内のIPアドレスでは無い(海外のIPアドレス)ので、DROP(パケットを破棄)します。

2014/1/26 追記

WEBサーバとして公開している場合

一般に公開するWEBサーバの場合、海外からの接続を遮断すると、google/yahoo/bingなどのクローラのアクセスまでブロックします。
その為、検索にひっかからないようになりますので、WEBへのアクセスは海外からも接続できるようにします。
前回(iptablesサンプル)の setip.sh の内容を以下のように修正して下さい。

変更前

#Webサーバの場合:http,https許可
$IPTABLES -A INPUT -p tcp -m multiport --dport 80,443 -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

これで、google/yahoo/bingで WEBの内容が検索にひっかかるようになります。

参考

iptablesで海外からのhttpアクセスを拒否する
世界の国別 IPv4 アドレス割り当てリスト

コメント

  1. 藤堂 正樹 より:

    度々申し訳ございません。
    お力を貸して頂くメッセージを書き込ませて頂きました。
    前回のiptablesサンプルを実行して希望通りにはなりましたが、上記の設定を
    行った後、今度は特定のサーバ(192.***.***.***)からsshで内部のWebサーバへの
    接続をしようと思ったのですが、sshが接続できません。
    ssh,ping(icmp)は内部のみOKをして、webサーバのみ国内からのアクセスを
    許可するようにしたいのですが、どうしたらすればよろしいのでしょうか。

  2. 藤堂 正樹 より:

    大変申し訳ございません。
    よく考えたら、さっきと同じで特定のサーバのIPを記載すればよかったのですね。
    解決いたしました。
    前回、今回の質問はクローズでお願いします。
    今後ともよろしくお願いします。