shut out

ここ数ヶ月、このサーバーへのアクセスの半分がとある国からのアクセスだ。
そして、アクセスログによると、それらは平和的なアクセスではないようなのだ。

どういう経緯でかは知らないけれど、blogのとあるページにアクセスが集中している。
他にもblogも凝った対策をしていないのでコメントスパムやら、変なトラックバックやらがくる。

サーバーのログを見てみると、とあるIPアドレスからのアクセスが多く、
さらにいろいろ調べると、どうやらいくつかの近隣諸国から来ていると判明したわけだ。

そんなわけで、非常に申し訳ないのですが、
国名に「民」の字が入るいくつかの国からのアクセスは拒否するように設定しました。
まぁ、日本語しか無いWebサイトなので、中身を読みたくてしているアクセスもほとんど無いだろうし。

加えて今のところそれらの国に行く予定は無いので、自分でそのエリアから見たいこともないかと。

だって、実害があるのだもの。差別でなく区別だということに...。

参考にしたのは、Fedoraで自宅サーバー構築などなど。

うちのサーバーではiptablesを設定するシェルスクリプトを別に用意してあって、
それを実行した後に、↓の内容のシェルスクリプトを実行するような運用を考えています。
なので、iptablesの設定はこれだけではないです。
これだけだと全ポートが開けっ放しなので、要注意。

シェルスクリプトもiptablesもよく分かっていないのでコメントが不適切かもしれない↓

# APNICで公開されているアジア圏の国別IPアドレスリストを取得
wget -q http://ftp.apnic.net/stats/apnic/delegated-apnic-latest

# iptablesに新しいchainを定義
iptables -N NEWCONNECTION
iptables -N LOG_DENYHOST

# 新規接続は受け付ける
iptables -A NEWCONNECTION -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -j NEWCONNECTION

# LOG_DENYHOSTに所属するIPアドレスからのアクセスだった場合はログを残してDROP
iptables -A LOG_DENYHOST -j LOG --log-prefix "iptable/Host-Rejected: "
iptables -A LOG_DENYHOST -j DROP

# LOG_DENYHOSTは...
# COUNTRYLISTに含まれる国のIP
COUNTRYLIST='CN KR KP'

# 国ごとにiptablesのLOG_DENYHOST chainに追加
# for中身はよく分かりません...。
# delegated-apnic-latestに記されたアドレスをiptables用に変換しているはず
for country in $COUNTRYLIST
do
	for ip in `cat delegated-apnic-latest | grep "apnic|$country|ipv4|"`
	do
		FILTER_ADDR=`echo $ip |cut -d "|" -f 4`
		TEMP_CIDR=`echo $ip |cut -d "|" -f 5`
		FILTER_CIDR=32
		while [ $TEMP_CIDR -ne 1 ];
		do
			TEMP_CIDR=$((TEMP_CIDR/2))
			FILTER_CIDR=$((FILTER_CIDR-1))
		done
		iptables -I INPUT -s $FILTER_ADDR/$FILTER_CIDR -j LOG_DENYHOST
	done
done

# もうこれは要らないので削除
rm -f delegated-apnic-latest

# iptablesに保存
# 保存しなくても再起動するまでは有効(?)
/etc/rc.d/init.d/iptables save