技術

firewalldで中国からのアクセスを全部カットしちゃう

chatagiriiiです。
自宅サーバ運用を始めて2年ほど経ち、syslogやlastlogあたりに出力される不正SSH試行ログを眺めていたんですが、
ログ記載のIPをwhoisで引いてみてみると中国IPからの不正ログイン試行の多い事多い事。

ログに書かれてるIPを週1ペースでfirewalldに食わせて遮断してたんですが、あまりにも多種多様なIPアドレスでログイン試行してくるので、キリがなくまさにいたちごっこ。

そもそもこのblogもサーバも包括的に中国IPからの接続は不要なので、firewall-cmdを使って中国からの接続は全部遮断しようと思います。

中国IPのリストはどこかな

遮断するにも中国IPのアドレスレンジリストが必要です。探してみると、
APNICさんに国別IPレンジリストが公開されてました。

ので、これを有効活用させてもらって、中国からの接続を遮断しましょう。

では...中国IPを...裁いていくゥ(閻魔クック)

APNICさんのIPリストは下記な感じに降ってきます。

apnic|CN|ipv4|223.201.0.0|65536|20100721|allocated
apnic|VN|ipv4|45.122.220.0|1024|20150710|allocated
apnic|JP|ipv4|45.122.224.0|1024|20150710|allocated
apnic|AU|ipv4|45.122.228.0|512|20150710|allocated

ので、第2フィールドが"CN" 且つ 第3フィールドが"ipv4"な行を取り、第4フィールド目(IPレンジの始点),第5フィールド(IP割り当て個数==2の対数==rangeを計算)を取ってあげれば、ChinaなIPレンジリストが作れそうですね。

スクリプトを書いてみましょう。

#!/bin/bash

COUNTRY_IP=$(curl -sG http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | grep ipv4 | grep CN )

while read LINE ; do
  ADDR=$(cut -d '|' -f 4 <<< "$LINE")
  RANGE_RAW=$(cut -d '|' -f 5 <<< "$LINE")
  ## 5フィールド目、IPアドレスレンジ内のアドレスの個数をipレンジに直す(256個=8, 32-8 = /24network)
  RANGE_PREFIX=$(echo | awk -v RANGE=${RANGE_RAW} "{ printf 32 - log(RANGE)/log(2)}")
  echo "$ADDR/$RANGE_PREFIX"
done <<< "$COUNTRY_IP"

これを叩くと "xxx.xxx.xxx.xxx/yy" なIPレンジリストが返ってくるので、firewall-cmd に喰わせてあげれば優勝です。

$ while read LINE ; do sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address="$LINE" reject" ; done <(./get_china.sh)
$ sudo firewall-cmd reload

-技術