やりたいこと
クローラー対策としてVPSサーバーであるGCP、AWSのIPアドレスからのアクセスが来たときは403を返す
IPアドレス帯域の取得
AWS
これは簡単で、以下の公式サイトにもあるように、https://ip-ranges.amazonaws.com/ip-ranges.json のJSONファイルにすべて記載されている。
あとはJSONのパースにjqコマンドを使って
json=`curl -Ss https://ip-ranges.amazonaws.com/ip-ranges.json` echo $json | jq -r '.prefixes | .[].ip_prefix'
すると
18.208.0.0/13 52.95.245.0/24 52.194.0.0/15 54.155.0.0/16 54.196.0.0/15 52.94.22.0/24 52.95.255.112/28 13.210.0.0/15 52.94.17.0/24 52.95.154.0/23 (略)
のようにv4のアドレスだけ取得できる。
GCP
GCPのIPアドレスについては以下の公式ドキュメントに載ってる。
#!/bin/bash # https://cloud.google.com/compute/docs/faq#find_ip_range # nslookup -q=TXT _cloud-netblocks.googleusercontent.com 8.8.8.8 myarray=() for LINE in `dig txt _cloud-netblocks.googleusercontent.com +short | tr " " "\n" | grep include | cut -f 2 -d :` do myarray+=($LINE) for LINE2 in `dig txt $LINE +short | tr " " "\n" | grep include | cut -f 2 -d :` do myarray+=($LINE2) done done for LINE in ${myarray[@]} do dig txt $LINE +short | tr " " "\n" done | grep ip4 | sort -n | cut -f 2 -d : # changing target to _spf.google.com, you can get a simliar range now for Google Apps mail servers. # https://support.google.com/a/answer/60764 # changing it to _netblocks.google.com will help get all the ip ranges google uses for its services.
すると同じく
104.154.0.0/15 104.196.0.0/14 107.167.160.0/19 107.178.192.0/18 108.170.192.0/20 108.170.208.0/21 108.170.216.0/22 108.170.220.0/23 108.170.222.0/24 108.59.80.0/20 (略)
Nginxの設定
あとはこれをnginxが読める形に変換すればいいので、
./list_gcp_iprange.sh |sed -E 's/^/deny /g' | gsed -E 's/$/;/g' > gcp_ips.txt
とかで行頭に「deny」をつけて、行末に「;」をつければおk
deny 104.154.0.0/15; deny 104.196.0.0/14; deny 107.167.160.0/19; deny 107.178.192.0/18; deny 108.170.192.0/20; deny 108.170.208.0/21; deny 108.170.216.0/22; deny 108.170.220.0/23; deny 108.170.222.0/24; deny 108.59.80.0/20;
みたいになればおk
あとはこれをaws_gcp_blacklist.txtとかで保存して、弾きたいNginxがあるサーバーにおいて
server { #~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~ include /etc/nginx/conf.d/aws_gcp_blacklist.txt; #~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~ }
でsystemctl nginx reload
すればGCPとAWSからのアクセスはすべて403になる。