新しく更新されたAWSのIPレンジを取得する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。今日はちょっとした情報を共有いたします。

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をつけます。

ipcheck1

次にCloudFrontを立て、EC2のDNSを指定してオリジンとします。

ipcheck5

最後にRoute53でEC2とCloudFrontそれぞれに名前をつけてドメイン指定します。今回はEC2に[test]、CloudFrontに[testcdn]と付けました。

ipcheck2

次は中身をセットします。 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>

ブラウザからアクセスしてみます。

ipcheck11

ipcheck12

きちんとチェックできました。

まとめ

今回はサラッとした記事でした。IPレンジは定期的に変わるのであまりこれに依存したコードを書くと落とし穴に落ちる場合もありますが、こういう使い方もできる、ということで参考になさって下さい。

参考サイト