AWS IP アドレスの範囲
Amazon Web Services (AWS) は、その現在の IP アドレス範囲を JSON 形式で公開します。現在の範囲を参照するには、.json
ファイルをダウンロードします。履歴を管理するには、連続したバージョンの .json
ファイルをシステムに保存します。ファイルを最後に保存してから変更があるかどうかを確認するには、現在のファイルの公開時刻を確認し、それを最後に保存したファイルの公開時刻と比較します。
ダウンロード
ip-ranges.json をダウンロードします。
プログラムを使用してこのファイルにアクセスする場合、サーバーが提供した TLS 証明書を正しく確認した後にアプリケーションがファイルをダウンロードすることを保証する必要があります。
構文
ip-ranges.json
の構文は次のとおりです。
{ "syncToken": "
0123456789
", "createDate": "yyyy
-mm
-dd
-hh
-mm
-ss
", "prefixes": [ { "ip_prefix": "cidr
", "region": "region
", "service": "subset
" } ], "ipv6_prefixes": [ { "ipv6_prefix": "cidr
", "region": "region
", "service": "subset
" } ] }
- syncToken
-
UNIX エポック時刻形式での公開時刻。
型: 文字列
例:
"syncToken": "1416435608"
- createDate
-
公開日時。
型: 文字列
例:
"createDate": "2014-11-19-23-29-02"
- prefixes
-
IPv4 アドレス範囲の IP プレフィックス。
型: 配列
- ipv6_prefixes
-
IPv6 アドレス範囲の IP プレフィックス。
型: 配列
- ip_prefix
-
CIDR 表記でのパブリック IPv4 アドレス範囲。AWS はさらに特定の範囲でプレフィックスをアドバタイズする場合があります。たとえば、プレフィックス 96.127.0.0/17 が含まれるファイルでは、96.127.0.0/21、96.127.8.0/21、96.127.32.0/19、および 96.127.64.0/18 としてアドバタイズされる場合があります。
型: 文字列
例:
"ip_prefix": "198.51.100.2/24"
- ipv6_prefix
-
CIDR 表記でのパブリック IPv6 アドレス範囲。AWS はさらに特定の範囲でプレフィックスをアドバタイズする場合があります。
型: 文字列
例:
"ipv6_prefix": "2001:db8:1234::/64"
- リージョン
-
AWS リージョンまたはエッジロケーションの
GLOBAL
。CLOUDFRONT
およびROUTE53
範囲はGLOBAL
であることに注意してください。型: 文字列
有効な値:
ap-northeast-1
|ap-northeast-2
|ap-northeast-3
|ap-south-1
|ap-southeast-1
|ap-southeast-2
|ca-central-1
|cn-north-1
|cn-northwest-1
|eu-central-1
|eu-north-1
|eu-west-1
|eu-west-2
|eu-west-3
|sa-east-1
|us-east-1
|us-east-2
|us-gov-east-1
|us-gov-west-1
|us-west-1
|us-west-2
|GLOBAL
例:
"region": "us-east-1"
- サービス
-
IP アドレス範囲のサブセット。すべての IP アドレス範囲を取得するには
AMAZON
を指定します (たとえば、EC2
サブセットの範囲は、AMAZON
サブセットにも含まれます)。一部の IP アドレス範囲は、AMAZON
サブセットのみに含まれていることに注意してください。型: 文字列
有効な値:
AMAZON
|AMAZON_CONNECT
|CLOUD9
|CLOUDFRONT
|CODEBUILD
|EC2
|GLOBALACCELERATOR
|ROUTE53
|ROUTE53_HEALTHCHECKS
|S3
例:
"service": "AMAZON"
JSON ファイルのフィルタ
情報をフィルタして目的のものを見つけやすくするコマンドラインツールをダウンロードできます。
Windows
AWS Tools for Windows PowerShell には、この JSON ファイルを解析するコマンドレット Get-AWSPublicIpAddressRange
が含まれています。以下はその使用例です。詳細については、「Querying the Public IP Address Ranges for AWS」および「Get-AWSPublicIpAddressRange」を参照してください。
例 1.作成日を取得します
PS C:\>
Get-AWSPublicIpAddressRange -OutputPublicationDate
Wednesday, August 22, 2018 9:22:35 PM
例 2.特定のリージョンの情報を取得します
PS C:\>
Get-AWSPublicIpAddressRange -Region us-east-1
IpPrefix Region Service -------- ------ ------- 23.20.0.0/14 us-east-1 AMAZON 50.16.0.0/15 us-east-1 AMAZON 50.19.0.0/16 us-east-1 AMAZON ...
例 3. すべての IP アドレスを取得します
PS C:\>
(Get-AWSPublicIpAddressRange).IpPrefix
23.20.0.0/14 27.0.0.0/22 43.250.192.0/24 ... 2406:da00:ff00::/64 2600:1fff:6000::/40 2a01:578:3::/64 2600:9000::/28
例 4.すべての IPv4 アドレスを取得します
PS C:\>
Get-AWSPublicIpAddressRange | where {$_.IpAddressFormat -eq "Ipv4"} | select IpPrefix
IpPrefix -------- 23.20.0.0/14 27.0.0.0/22 43.250.192.0/24 ...
例 5.すべての IPv6 アドレスを取得します
PS C:\>
Get-AWSPublicIpAddressRange | where {$_.IpAddressFormat -eq "Ipv6"} | select IpPrefix
IpPrefix -------- 2a05:d07c:2000::/40 2a05:d000:8000::/40 2406:dafe:2000::/40 ...
例 6.特定のサービスのすべての IP アドレスを取得します
PS C:\>
Get-AWSPublicIpAddressRange -ServiceKey CODEBUILD | select IpPrefix
IpPrefix -------- 52.47.73.72/29 13.55.255.216/29 52.15.247.208/29 ...
Linux
以下のサンプルコマンドは jq ツールを使用して JSON ファイルのローカルコピーを解析しています。
例 1.作成日を取得します
$
jq .createDate < ip-ranges.json
"2016-02-18-17-22-15"
例 2.特定のリージョンの情報を取得します
$
jq '.prefixes[] | select(.region=="us-east-1")' < ip-ranges.json
{ "ip_prefix": "23.20.0.0/14", "region": "us-east-1", "service": "AMAZON" }, { "ip_prefix": "50.16.0.0/15", "region": "us-east-1", "service": "AMAZON" }, { "ip_prefix": "50.19.0.0/16", "region": "us-east-1", "service": "AMAZON" }, ...
例 3.すべての IPv4 アドレスを取得します
$
jq -r '.prefixes | .[].ip_prefix' < ip-ranges.json
23.20.0.0/14 27.0.0.0/22 43.250.192.0/24 ...
例 4.すべての IPv6 アドレスを取得します
$
jq -r '.ipv6_prefixes | .[].ipv6_prefix' < ip-ranges.json
2a05:d07c:2000::/40 2a05:d000:8000::/40 2406:dafe:2000::/40 ...
例 5.特定のサービスのすべての IPv4 アドレスを取得します
$
jq -r '.prefixes[] | select(.service=="CODEBUILD") | .ip_prefix' < ip-ranges.json
52.47.73.72/29 13.55.255.216/29 52.15.247.208/29 ...
例 6.特定のリージョンで、サービスのすべての IPv4 アドレスを取得します
$
jq -r '.prefixes[] | select(.region=="us-east-1") | select(.service=="CODEBUILD") | .ip_prefix' < ip-ranges.json
34.228.4.208/28
出口側のコントロールの実装
インスタンスに AWS のサービスのみへのアクセスを許可するには、EC2
リストの CIDR ブロックを除く、AMAZON
リストの CIDR ブロックへのアウトバウンドトラフィックを許可するルールでセキュリティグループを作成します。EC2
リストの IP アドレスは、EC2 インスタンスに割り当てることができます。
Windows PowerShell
以下の PowerShell の例では、AMAZON
リストに含まれるが、EC2
リストには含まれない IP アドレスの取得方法を示します。スクリプトをコピーし、Select_address.ps1
という名前のファイルに保存します。
$amazon_addresses = Get-AWSPublicIpAddressRange -ServiceKey amazon $ec2_addresses = Get-AWSPublicIpAddressRange -ServiceKey ec2 ForEach ($address in $amazon_addresses) { if( $ec2_addresses.IpPrefix -notcontains $address.IpPrefix) { ($address).IpPrefix } }
このスクリプトは次のように実行できます。
PS C:\>
.\Select_address.ps1
13.32.0.0/15 13.35.0.0/16 13.248.0.0/20 13.248.16.0/21 13.248.24.0/22 13.248.28.0/22 27.0.0.0/22 43.250.192.0/24 43.250.193.0/24 ...
jq
以下の例では、すべてのリージョンで、AMAZON
リストに含まれるが、EC2
リストには含まれない IP アドレスの取得方法を示します。
jq -r '[.prefixes[] | select(.service=="AMAZON").ip_prefix] - [.prefixes[] | select(.service=="EC2").ip_prefix] | .[]' < ip-ranges.json
52.94.22.0/24 52.94.17.0/24 52.95.154.0/23 52.95.212.0/22 54.239.0.240/28 54.239.54.0/23 52.119.224.0/21 ...
次の例では、1 つのリージョンに結果を限定するフィルタを適用する方法を示します。
jq -r '[.prefixes[] | select(.region=="us-east-1" and .service=="AMAZON").ip_prefix] - [.prefixes[] | select(.region=="us-east-1" and .service=="EC2").ip_prefix] | .[]' < ip-ranges.json
Python
以下の python スクリプトは、AMAZON
リストに含まれるが、EC2
リストには含まれない IP アドレスの取得方法を示します。スクリプトをコピーし、get_ips.py
という名前のファイルに保存します。
#!/usr/bin/env python import requests ip_ranges = requests.get('https://ip-ranges.amazonaws.com/ip-ranges.json').json()['prefixes'] amazon_ips = [item['ip_prefix'] for item in ip_ranges if item["service"] == "AMAZON"] ec2_ips = [item['ip_prefix'] for item in ip_ranges if item["service"] == "EC2"] amazon_ips_less_ec2=[] for ip in amazon_ips: if ip not in ec2_ips: amazon_ips_less_ec2.append(ip) for ip in amazon_ips_less_ec2: print(str(ip))
このスクリプトは次のように実行できます。
$
python ./get_ips.py
13.32.0.0/15 13.35.0.0/16 13.248.0.0/20 13.248.16.0/21 13.248.24.0/22 13.248.28.0/22 27.0.0.0/22 43.250.192.0/24 43.250.193.0/24 ...
AWS の IP アドレス範囲の通知
AWS の IP アドレス範囲に変更があるたびに、AmazonIpSpaceChanged
トピックのサブスクライバーに通知が送信されます。ペイロードには次の形式の情報が含まれています。
{ "create-time":"
yyyy
-mm
-dd
Thh
:mm
:ss
+00:00", "synctoken":"0123456789
", "md5":"6a45316e8bc9463c9e926d5d37836d33
", "url":"https://ip-ranges.amazonaws.com/ip-ranges.json" }
- create-time
-
作成日時。
通知は、誤った順序で配信される場合があります。したがって、正しい順序を保証するためにタイムスタンプを確認することをお勧めします。
- synctoken
-
UNIX エポック時刻形式での公開時刻。
- md5
-
ip-ranges.json
ファイルの暗号ハッシュ値。この値を使用して、ダウンロードしたファイルが破損しているかどうかを確認できます。 - url
-
ip-ranges.json
ファイルの場所。
AWS の IP アドレス範囲に変更があるたびに通知を受け取るには、次のように Amazon SNS を使用して通知を受け取るように受信登録できます。
AWS の IP アドレス範囲の通知を受信登録するには
-
https://console.aws.amazon.com/sns/v2/home にある Amazon SNS コンソールを開きます。
-
ナビゲーションバーで、必要に応じてリージョンを [米国東部(バージニア北部)] に変更します。購読する SNS 通知がこのリージョンで作成されているため、このリージョンを選択する必要があります。
-
ナビゲーションペインで [Subscriptions] を選択します。
-
[Create subscription] を選択します。
-
[Create subscription] ダイアログボックスで、次の操作を行います。
-
トピックの ARN には、以下の Amazon リソースネーム (ARN) をコピーします。
arn:aws:sns:us-east-1:806199016981:AmazonIpSpaceChanged
-
プロトコルには、使用するプロトコルを選択します (たとえば、
Email
)。 -
エンドポイントには、通知を受け取るエンドポイントを入力します (たとえば、E メールアドレス)。
-
[Create subscription] を選択します。
-
-
指定したエンドポイントに接続されて、登録を確認するように求められます。たとえば、E メールアドレスを指定した場合は、件名に
AWS Notification - Subscription Confirmation
と表示された E メールメッセージが届きます。指示に沿って操作し、登録を確認します。
通知はエンドポイントの可用性によって異なります。そのため、JSON ファイルを定期的に確認して、常に最新の範囲を入手した方がよいでしょう。Amazon SNS の信頼性について詳しくは、https://aws.amazon.com/sns/faqs/#Reliability を参照してください。
通知が不要になった場合は、次の手順で受信登録を解除します。
AWS の IP アドレス範囲の通知の受信登録を解除するには
-
https://console.aws.amazon.com/sns/v2/home にある Amazon SNS コンソールを開きます。
-
ナビゲーションペインで [Subscriptions] を選択します。
-
サブスクリプションのチェックボックスをオンにします。
-
[Actions]、[Delete subscriptions] の順に選択します。
-
確認を求めるメッセージが表示されたら、[Delete] を選択します。
Amazon SNS の詳細については、『Amazon Simple Notification Service 開発者ガイド』を参照してください。