RData
Cloudflare Gatewayは、RData ↗というBase64エンコードされたバイナリ形式でDNSクエリ情報をログに記録します。各クエリに対して利用可能なリソースレコードフィールドは次のとおりです:
- クエリ名
- クエリタイプ
- クエリクラス
- レスポンスTTL
- レスポンスデータ
LogpushからRDataログを解析するには、以下のPythonスクリプトを実行し、希望するサンプルを指定します:
import dnslibimport base64
# Logpush出力からのサンプルsamples = [ {"type":"1","data":"BnJlZGRpdANjb20AAAEAAQAAALwABJdlwYw="}, {"type":"5","data":"BnNlY3VyZQV3bHhycwNjb20AAAUAAQAADggAIgZzZWN1cmUEYmFzZQV3bHhycwNjb20GYWthZG5zA25ldAA="}, {"type":"28","data":"Bmdvb2dsZQNjb20AABwAAQAAAGkAECYH+LBAIxAJAAAAAAAAAGU="}]
# LogpushのRData.dataフィールドをリソースレコードに解析します# https://www.ietf.org/rfc/rfc1035.txtの「4.1.3. リソースレコード形式」セクションを参照# クエリ名、クエリタイプ、クエリクラス、レスポンスTTL、レスポンスデータを含みますfor sample in samples: decoded = base64.b64decode(sample["data"]) buffer = dnslib.DNSBuffer(decoded) r = dnslib.RR.parse(buffer) print("== リソースレコードの全体を表示 ==") print(r) print("== リソースレコードの個々のコンポーネントを表示 ==") query_name = r.rname query_type = r.rtype query_class = r.rclass response_ttl = r.ttl response_data = r.rdata print(f"クエリ名: {query_name} | クエリタイプ: {query_type} | クエリクラス: {query_class} | ttl: {response_ttl} | rdata: {response_data}\n")スクリプトは、サンプルのリストを表示します。例えば:
== リソースレコードの全体を表示 ==reddit.com. 188 IN A 151.101.193.140== リソースレコードの個々のコンポーネントを表示 ==クエリ名: reddit.com. | クエリタイプ: 1 | クエリクラス: 1 | ttl: 188 | rdata: 151.101.193.140
== リソースレコードの全体を表示 ==secure.wlxrs.com. 3592 IN CNAME secure.base.wlxrs.com.akadns.net.== リソースレコードの個々のコンポーネントを表示 ==クエリ名: secure.wlxrs.com. | クエリタイプ: 5 | クエリクラス: 1 | ttl: 3592 | rdata: secure.base.wlxrs.com.akadns.net.
== リソースレコードの全体を表示 ==google.com. 105 IN AAAA 2607:f8b0:4023:1009::65== リソースレコードの個々のコンポーネントを表示 ==クエリ名: google.com. | クエリタイプ: 28 | クエリクラス: 1 | ttl: 105 | rdata: 2607:f8b0:4023:1009::65