海外IPブロックのメモ
目次
はじめに
僕は、Raspberry Pi 4で個人利用のサーバを立てて運用しています。
セキュリティ対策の一環として、これまではWebサービスを提供しているNginxで国外ブロックの設定をしていました。
ですが、今回Web以外のポートも公開する必要が出てきたので、ファイアウォール機能を利用した国外ブロックを実現します。
今回利用するツールは、ipset
とiptables
です。
それぞれのツールについては下記で簡単にします。
ipset
ipsetは、IPアドレスやポート番号等などのセットを作成し、高速なパケット処理を実現できます。
そのため、ファイアウォールで許可する国内IPのセットを作成し、iptablesを用いてアクセス制御を実現できます。
ipsetは、Linuxカーネルでサポートされているため、様々な環境で利用できます。
iptables
iptablesは、パケットフィルタリングによりファイアウォールとして機能するツールです。
パケットの送受信の際に、フィルタリングや転送、変換などを行います。
今回は、ipsetで作成した国内IPのみがアクセスできるようにフィルタリングします。
こちらも、Linuxカーネルでサポートされているため、様々な環境で利用できます。
インストール
apt install ipset
# ipsetの永続化のため
apt install ipset-persistent
ipset -v
# ipset v7.10, protocol version: 7
国内IPレンジのセットを作成
国別コードとネットワークレンジがまとめられたリストを下記コマンドでダウンロードします。
# ファイルのダウンロード
wget http://nami.jp/ipv4bycc/cidr.txt.gz
# ファイルの解凍
gunzip cidr.txt.gz
# ファイル確認
tail -n5 cidr.txt
# ZW 196.201.1.0/24
# ZW 196.216.224.0/23
# ZW 196.220.96.0/19
# ZW 197.157.204.0/22
# ZW 197.221.224.0/19
ipsetで国内IPのセットを作成します。
-exist
オプションにより、すでにセットがあった場合に発生するエラーを無視するようにしています。
hash:net
は、IPアドレスのレンジを指定する際に利用します。
他にも、hash:ip
とhash:ip,port
があります。
ipset create -exist WHITELIST hash:net
次に、作成したセットに対して、国内のIPアドレスレンジのみを登録します。
最初のsed
コマンドでJPの部分を置換し、置換後のJPのIPアドレスレンジを出力します。
その後、ループでセットに登録していきます。
# セットに国内IPレンジを登録
sed -n 's/^JP\t//p' cidr.txt | while read ADDRESS; do
ipset add WHITELIST $ADDRESS
done
# セットの確認
ipset list WHITELIST | tail -n5
# 202.78.176.0/20
# 61.47.64.0/23
# 61.208.0.0/13
# 123.108.84.0/22
# 175.158.112.0/20
iptablesのルール変更
ここでは、先程作成した国内IPレンジのセットを利用するようにルールを変更します。
vim /etc/iptables/rules.v4
# -A INPUT -p tcp -m tcp --dport 443 -m set --match-set WHITELIST src -j ACCEPT
# -A INPUT -p tcp -m tcp --dport 80 -m set --match-set WHITELIST src -j ACCEPT
# 反映
netfilter-persistent reload