サイトアイコン 協栄情報ブログ

CNAMEレコードのip解析


この記事は公開されてから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
モバイルバージョンを終了