地方在住IT系ニート

bkds

海外IPブロックのメモ

はじめに

僕は、Raspberry Pi 4で個人利用のサーバを立てて運用しています。
セキュリティ対策の一環として、これまではWebサービスを提供しているNginxで国外ブロックの設定をしていました。
ですが、今回Web以外のポートも公開する必要が出てきたので、ファイアウォール機能を利用した国外ブロックを実現します。

今回利用するツールは、ipsetiptablesです。
それぞれのツールについては下記で簡単にします。

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:iphash: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
にほんブログ村 IT技術ブログ IT技術メモへPVアクセスランキング にほんブログ村