この記事は公開されてから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をつけます。
次に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レンジは定期的に変わるのであまりこれに依存したコードを書くと落とし穴に落ちる場合もありますが、こういう使い方もできる、ということで参考になさって下さい。