amazonaws を iptables で拒否

自宅サーバで公開しているサイトへの amazonaws からのアクセスが、かなりうざい。

amazonaws は、amazon がサービスしているウェブサービス aws からのアクセスとのこと。
そのサービスを使ってアクセスしてきているのは理解したけど、まともにページを表示するようなマネはしていなかった。
具体的には /js/lightbox.min.js のような、Web サービスを行うためのスクリプトだけが狙われてた。
思うに、google アナリティクスのようなサービスに検知されないための処理なんだろう。
あれは通常のページを開いて解析サイトにトラフィックを飛ばさないと解析できないもんだろうし。
それに、普通のユーザはコンテンツをすっ飛ばしてサイト情報を集めたりはしない*1

うん。これは amazonaws を拒否しておこう。

とは思ったものの、IPアドレスの範囲はかなり広い上に細かい。
なので、iptables で拒否するのを躊躇していたんだけど、amazon で情報が出てた。

https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html

Amazon Web Services (AWS) は、その現在の IP アドレス範囲を JSON 形式で公開します。現在の範囲を参照するには、.json ファイルをダウンロードします。

ということなので、時々チェックしないとダメみたい。
とりあえず肝心のデータは、次の URL で取得できた。

https://ip-ranges.amazonaws.com/ip-ranges.json

とはいえ、僕は JSON 形式のデータを解析する方法を知らないんだけど……
と思っていたら、同じページに jq コマンドによる解析例があった。
素晴らしい。

jq コマンドって、リポジトリにあるかな?

$ type apt-file || sudo apt install apt-file
$ sudo apt update
$ sudo apt-file search jq | grep "\/jq$"
jq: /usr/bin/jq

あった。

$ sudo apt install jq
(以下略)

うん、さくっとインストールできた。

次に、上記サイトで「例 3.すべての IPv4 アドレスを取得します」とのサンプルがあるので、試しに参照してみる。

$ wget -q -O /tmp/ip-ranges.json https://ip-ranges.amazonaws.com/ip-ranges.json
$ jq -r '.prefixes | .[].ip_prefix' < /tmp/ip-ranges.json
18.208.0.0/13
52.95.245.0/24
99.77.142.0/24
52.194.0.0/15
54.155.0.0/16
54.196.0.0/15
99.78.170.0/23
52.94.22.0/24
52.95.255.112/28
(以下略)

かなり長いな……
ってことで、行数をカウント。

$ jq -r '.prefixes | .[].ip_prefix' < /tmp/ip-ranges.json | wc
   1682    1682   25080

……重複とか、無いよね?
少し表示された内容を読んでて、重複がありそうだったので確認してみる。

$ jq -r '.prefixes | .[].ip_prefix' < /tmp/ip-ranges.json | sort -un | wc
    360     360    5140

……えーと。
こんなに重複があるとか、なんかの嫌がらせ?
と一瞬思ったけど、リージョン違いによる重複なんだろうな。

create-time を見れば更新されているかどうか分かるとのことなので、定期的に観測するなら create-time を参照すればよさそう。
このサイトだと、また amazonaws がログに表示されるようになったら更新を掛ける程度で。
Raspberry Pi だから、ファイルの更新が結構致命傷に繋がりやすいんだよね……。

iptables への設定については、シェルの for 文で一括登録しておく。

$ pTarget="$(jq -r '.prefixes | .[].ip_prefix' < /tmp/ip-ranges.json | sort -un)"
$ for s in ${pTarget}
do
  sudo iptables -A OUTPUT -d ${s} -o eth0 -j DROP
done
$ sudo iptables -n -L

確認コマンドとして iptables -L だけだと、名前の逆引きが行われてかなり表示が遅くなったので -n を加えた。

しばらく様子見。


あと、分割された CIDR をコマンドラインでまとめ直す方法があれば、調べておきたい。
たとえば、こんな CIDR 表記。

52.56.0.0/16
52.57.0.0/16
52.58.0.0/15
52.60.0.0/16
52.61.0.0/16
52.62.0.0/15

これって、連続してるんだから、CIDR として次のように書けるはずなんだよね。

52.56.0.0/13

もしかすると、IPアドレス 10 個をネットワークアドレス/ブロードキャストアドレスに消費しているのかもしれないけど、サイト管理者としては設定行数が増えるだけなのでメリットを感じられない。

*1:例を言えば、天気を知りたいのに、予報ではなく予報サイトの構成から調べるとか、なかなかトリッキーな性格の持ち主と思われる。