新しく更新されたAWSのIPレンジを取得する
こんにちは、せーのです。今日はちょっとした情報を共有いたします。
AWSのIPレンジは公開されている
AWSのリソース同士を認識して使いたい時、例えばCloudFrontからのアクセスのみ受け付けたい、というような制限をする時に、VPC外からのアクセスなどでは現状はIP制限をするのが一番現実的な解となります。 AWSのIPレンジは公開されています。先日このIPレンジが更新されました。IPレンジはJSON方式で書かれています。
ポイント
このIPレンジには
- AMAZON
- EC2
- ROUTE53
- ROUTE53_HEALTHCHECKS
- CLOUDFRONT
が使用しているIPレンジが表示されています。JSON形式なのでプログラム内で使用しやすいですね。 こちらからデータを持ってきてRDBやmemcache等に置いておき、IPチェックを動的にかけたりしても良いかと思います。 今回はEC2のIPが13,065,550分載っています。 ちなみにWindowsからだとこのレンジの活用はより簡単になります。くわしくはこちらの記事を御覧ください。
EC2から取得してみる
このIPレンジの使い方の一例としてEC2でIPチェックをしてみたいと思います。 まずEC2を立ててEIPをつけます。
次にCloudFrontを立て、EC2のDNSを指定してオリジンとします。
最後にRoute53でEC2とCloudFrontそれぞれに名前をつけてドメイン指定します。今回はEC2に[test]、CloudFrontに[testcdn]と付けました。
次は中身をセットします。 EC2にhttpdとphpを入れます。
ssh ec2-user@52.68.149.99 -i ~/dev/key/cm_experimentation.pem [ec2-user@ip-10-0-1-241 ~]$ sudo yum update [root@ip-10-0-1-241 ~]# yum install httpd php -y [root@ip-10-0-1-241 ~]# service httpd start httpd を起動中: [ OK ] [root@ip-10-0-1-241 ~]# vi /var/www/html/index.php
次にphpファイルを作り、HTMLソースとIPによるチェックを書きます。IPレンジのマッチングはここから拾いました。
<?php require_once __DIR__ . '/cidr.php'; $cidr = new cidr(); $url = "https://ip-ranges.amazonaws.com/ip-ranges.json"; $jsondata = file_get_contents($url); $data = json_decode($jsondata); $ip = $_SERVER["REMOTE_ADDR"]; $match = false; foreach($data->prefixes as $prefix){ $arg = $prefix->ip_prefix; $range = split("/", $arg); $network = $cidr->cidr2network($range[0], $range[1]); if($cidr->cidr_match($ip, $network, $range[1])){ var_dump($ip); var_dump($arg); $match = true; break; } } ?> <html> <head> </head> <body> <h1> <?php if ($match){ echo "HTTP CDN"; }else{ echo "HTTP DIRECT"; } ?> </h1> </body> </html>
ブラウザからアクセスしてみます。
きちんとチェックできました。
まとめ
今回はサラッとした記事でした。IPレンジは定期的に変わるのであまりこれに依存したコードを書くと落とし穴に落ちる場合もありますが、こういう使い方もできる、ということで参考になさって下さい。