動かざることバグの如し

近づきたいよ 君の理想に

NginxでAWSとGCPからの全アクセスを拒否する設定

やりたいこと

クローラー対策としてVPSサーバーであるGCPAWSIPアドレスからのアクセスが来たときは403を返す

IPアドレス帯域の取得

まずはGCPAWSIPアドレスを知る必要がある。

AWS

これは簡単で、以下の公式サイトにもあるように、https://ip-ranges.amazonaws.com/ip-ranges.jsonJSONファイルにすべて記載されている。

あとは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

GCPIPアドレスについては以下の公式ドキュメントに載ってる。

#!/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 すればGCPAWSからのアクセスはすべて403になる。

参考リンク