事象
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
以上、ご参考になれば幸いです。