(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【gcloud】Could not fetch resource: Value for field 'resource.sourceRanges is too largeというエラー

スポンサーリンク

事象

Googleクラウドにて以下のように特定セグメントからのIPアドレスを遮断するため、source-rangesにIP群を書き連ねれて実行すると

$ gcloud compute firewall-rules create cnblock   --action=DENY   --rules=ALL   --direction=INGRESS   --priority=10   --no-enable-logging   --source-ranges=1.0.1.0/24,1.0.2.0/23,1.0.8.0/21...

下記のエラーでファイアウォールポリシーの作成に失敗する。

Creating firewall...failed.
ERROR: (gcloud.compute.firewall-rules.create) Could not fetch resource:
 - Value for field 'resource.sourceRanges' is too large: maximum size 256 element(s); actual size 5430.
環境情報
  • Google Cloud SDK 320.0.0

原因/解決策

カンマ区切りで指定したIPアドレスが256を超えていることが原因。

解決策にて、IPアドレスが一行ずつ書かれたファイルを200行毎にカンマ区切りで一行に置き換えるワンライナーで行数を減らして

cat ip_list.txt | awk 'NR%200 != 0{printf "%s ", $1} NR%200 == 0 {printf "%s\n",$1}' | sed -e s/" "/,/g> ip_list2.txt

以下のシェルスクリプトを実行することで制限に超過せずにファイアウォールルールを生成できる。

#!/bin/sh
i=0
while read line
do
i=$(expr $i + 1)
gcloud compute firewall-rules create cnblock$i --action=DENY --rules=ALL --direction=INGRESS --priority=10 --no-enable-logging --source-ranges=$line
done < ./ip_list2.txt

以下、補足です。

補足

中国や豪州からのアクセスが仮想マシンにあるとGoogleCloudにて課金が発生してしまいます。

よって各国のIPリストが記載されているファイルを取得することで送信元IPにて絞るFWのルールを生成することにしました。

以下にてテキスト情報が表示できますがそのままだと5000行を超えるため

$ wget -O -  https://ipv4.fetus.jp/cn.txt 2>/dev/null

解決策のようにIPを区切ることでルールを小分けに作成しました。(ファイアウォールルール数も100で上限あり)

コマンドが通ると以下のように作成したルール一覧が確認ができ

$ gcloud compute firewall-rules list
NAME                    NETWORK  DIRECTION  PRIORITY  ALLOW                         DENY  DISABLED
cnblock1                default  INGRESS    10                                      all   False
cnblock10               default  INGRESS    10                                      all   False
cnblock11               default  INGRESS    10                                      all   False
...

ルールの詳細は以下にてJSON形式で確認できます。

$ gcloud compute firewall-rules list --format=json --filter=cnblock1

またルールを削除する時は以下のようにすれば機械的に削除も可能です。

$ gcloud compute firewall-rules delete cnblockX --quiet

以上、ご参考になれば幸いです。