GCPにて国単位でIPアドレスを弾く方法

GCPの無料枠を使う場合、特定国のIPアドレスを弾く必要があるようです。
元ネタはこちらになります→Google Cloud Platformで中国からの通信をブロック
フィルタ登録時の手打ちが面倒だったので、半自動にしてみました。

前提条件

  • 今回はwsl上での作業です
  • Google Cloud Functionsの環境が出来ていること
  • 次のファイルがカレントフォルダに置かれていること
    https://ipv4.fetus.jp/cn.txt
  • 時々リストを更新する必要があると思いますが、今回はそこまで考慮していません

手順

  1. 次のやっつけスクリプトをカレントフォルダに置きます
    #!/bin/bash
    #
    # CONST_PROJECT に、ご自分のプロジェクト名を入れて下さい。
    # カレントディレクトリに https://ipv4.fetus.jp/cn.txt を置いて下さい。
    # 出来上がった china_block_xx.txt を、cloud shell に投げ込んで下さい。
    #
    # wslからcloud shellを起動する自分メモ
    #   gcloud alpha cloud-shell ssh
    # vimで流し込む場合は(貼り付け前に次のコマンドで)
    # インデントを無効にしておいた方が良いと思います
    #   :set paste
    #
    CONST_PROJECT="MyProject"
    CONST_INPUTFILE="cn.txt"
    counterNo=1
    lineNo=0
    ruleNo=1
    ruleStr="000"
    FileNo=0
    fileStr="00"
    outputFile="foobar.txt"
    itemsCounter=0
    readData=""
    workFile="puyopuyo.txt"
    # curl https://ipv4.fetus.jp/cn.txt
    
    if [ ! -f $CONST_INPUTFILE ]; then
      echo "Input file not found..."
      exit 1
    fi
    
    workFile=$(mktemp "china-block.tmp.XXXXXX")
    sed '1,6d' $CONST_INPUTFILE > $workFile
    itemsCounter=`wc -l $workFile | cut -d " " -f 1`
    
    cat $workFile | while read readData
    do
      if [ $(($counterNo % 2500)) -eq 1 ]; then
        fileNo=`expr $fileNo + 1`;
        fileStr=`seq -f %02g $fileNo $fileNo`
        outputFile="china_block_$fileStr.txt"
        echo "File $outputFile"
      fi
      if [ $lineNo -eq 0 ]; then
        ruleStr=`seq -f %03g $ruleNo $ruleNo`
        echo "gcloud compute --project=$CONST_PROJECT firewall-rules create china-block-$ruleStr --description=\\中\\華\\圏\\のIP\\を\\弾\\く --direction=INGRESS --priority=10 --network=default --action=DENY --rules=all --source-ranges=\\" >> $outputFile
        lineNo=`expr $lineNo + 1`
        echo -n "Rule $ruleStr:"
      fi
      echo -n "$readData" >> $outputFile
      if [ $counterNo -eq $itemsCounter ]; then
        echo "" >> $outputFile
        echo ""
      else
        if [ $(($counterNo % 250)) -ne 0 ]; then
          if [ $(($counterNo % 5)) -eq 0 ]; then
            echo ",\\" >> $outputFile
            lineNo=`expr $lineNo + 1`
          else
            echo -n "," >> $outputFile
          fi
          echo -n "."
        else
          echo "" >> $outputFile
          echo ""
          lineNo=0
          ruleNo=`expr $ruleNo + 1`
        fi
      fi
      counterNo=`expr $counterNo + 1`
    done
    rm -f $workFile
    exit 0
  2. スクリプトのCONST_PROJECTの内容を、自分のプロジェクト名に差し替えます
  3. wsl上でスクリプトをキックすると、china_block_xx.txtなるファイルが出来上がります
  4. cloud shellを起動します
    gcloud alpha cloud-shell ssh
  5. 出来上がったchina_block_xx.txtを、cloud shellに投げ込みます
    ※一度に全部流し込んだらGCP側でリソース不足になったので、出力を分割しました
    vimで流し込む場合は、貼り付け前に

    :set paste

    にてインデントを無効にしておいた方が良いと思います。
  6. GCPの 『VPCネットワーク』→『ファイアウォールルール』にて、結果を確認します