GCEのAlways Freeは中国とオーストラリアは課金対象となってしまいます。

上記かつ、メールサーバなどを立てていると中国からのスパムが大量に来るため、
ファイアウォール機能を利用して一括で遮断する方法について記載していきます。

gcloudコマンドのインストール

https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu
と内容はほぼ同じ。

1
2
3
4
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee /etc/apt/sources.list.d/google-cloud-sdk.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
sudo apt-get update
sudo apt-get install google-cloud-sdk

ファイアウォールルールの追加

ブロックするIPアドレス一覧が必要になるので、
http://nami.jp/ipv4bycc/ で公開されているリストを利用させていただきます。

最新という意味では http://ftp.apnic.net/stats/apnic/delegated-apnic-extended-latest から作成するのが一番良いのですが、CIDR記法に変換するのが思いの外大変なため・・。

下記のスクリプトを実行してしばらく待てば完了です。

  • IPアドレス一覧から中国のものだけを$tempfileに書き出す
  • 256行ずつの単位で、gcloud compute firewall-rules create コマンドでIPアドレスを追加する
  • 全て終わったら$tempfileを削除

といった処理をおこなっています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cat << 'EOT' | bash
#!/bin/bash -eu

tempfile=$(mktemp)
curl -s 'http://nami.jp/ipv4bycc/cidr.txt' | grep '^CN' | cut -f2 > $tempfile

index=1
current_line=1

while [ -n "$(sed -n "${current_line},${current_line}p" $tempfile)" ]
do
  # 1つのルールに入る source-ranges は256個までなので、sedコマンドで区切って切り出す
  ranges=($(sed -n "${current_line},$(( $current_line + 255 ))p" $tempfile | xargs))

  # Firewallにdenyルールを追加
  gcloud compute firewall-rules create "deny-china-$(printf "%02d" "${index}")" \
    --action=DENY --rules=ALL --no-enable-logging --source-ranges="$(echo ${ranges[@]} | sed 's/ /,/g')"

  index=$(( $index + 1 ))
  current_line=$(( $current_line + 256 ))
done

rm $tempfile
EOT

コマンド実行が完了したら、
https://console.cloud.google.com/networking/firewalls/list
でもルールが追加されている事を確認してください。

参考サイト

http://nami.jp/ipv4bycc/

https://cloud.google.com/sdk/gcloud/reference/compute/firewall-rules/create