この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
CNAMEレコードとは?
CNAMEレコードはCanonical Name Recordの省略であり、あるドメイン名 (alias) を別のドメイン名 (Canonical Name) にマップするドメインネームシステム(DNS) のリソースレコードの一種です。
メリット:単一の IP アドレスから複数のサービス (それぞれが異なるポートで実行される FTP サーバーや Web サーバーなど) を実現できること。IPアドレスが変更された場合、変更をネットワーク内の1か所 (DNSのAレコード) に記録するだけで済みます。
注意点:CNAMEレコードは常に別のドメイン名を指す必要があり、IPアドレスを直接指すことはありません。
DNSのCNAMEレコードはRFC 1034で指定され、RFC 2181のセクション 10で明確化されています。
CNAMEレコードは、DNSで特別に処理され、その使用にはいくつかの制限があります。DNSリゾルバーは、通常のリソースレコードを探している時にCNAMEレコードを検出すると、該当名前ではなくCanonical Nameを使用してクエリを再開します。Canonical Nameの行き先は、異なるDNSゾーンのローカルサーバーまたリモートサーバーかどうかに関係なく、DNSのどこにでもある可能性があります。
たとえば、次のような DNS ゾーンがあるとします。
名前 | タイプ | 値 |
---|---|---|
heaven.example.jp | CNAME | happyboy.example.jp |
happyboy.example.jp | A | 192.0.1.188 |
heaven.example.jpがAレコードルックアップ実行されると、リゾルバーはCNAMEレコードを確認し、happyboy.example.jpでチェックを再開し、192.0.1.188 を返します。
CNAMEのip解析の用途
①AWS Network FirewallのルールグループのStatefulルール設定
CNAMEレコードのheaven.example.jpをip取得次第、Statefulルール自動設定できること
pass ssh 192.0.2.166/32 any –> 192.0.1.188 22 (sid:10000001;rev:1;)
②CDNのdomainデータ活用
訪問者アクセス分析など
等々
CNAMEレコードのip取得python部分コード(参考用)
from socket import AI_CANONNAME, getaddrinfo, gaierror
def iplookup (domainlist):
iplists=[]
for domain in domainlist:
try:
ipinfolist = getaddrinfo (domain, None, 0, 0, 0, AI_CANONNAME)
except gaierror:
print ('{0} -> *** NOT FOUND ***'.format (domain))
continue
for family, kind, proto, canonical, sockaddr in ipinfolist:
if canonical == domain or canonical == '':
print ('{0} ==> {1}'.format (domain, sockaddr[0]))
else:
print ('{0} --> {1}'.format (domain, canonical))
iplookup ([canonical,])
break