Upgrade to Pro — share decks privately, control downloads, hide ads and more …

_PythonでつくるDNSリゾルバ__20190718b_公開用_.pdf

Nobuyuki Inoue
July 18, 2019
520

 _PythonでつくるDNSリゾルバ__20190718b_公開用_.pdf

Nobuyuki Inoue

July 18, 2019
Tweet

Transcript

  1. DNSリゾルバの例 TCP/IPが実装されているOSでは、各種TCP/IPの通信処理の作成のためにAPIが提供 さている。代表的なものとして BSD Socket(UNIX系OS) や WinSock(MS-Windows) などがある。 Pythonでは、これらのAPI呼び出しをモジュール化したsocketモジュールが提供さ れている。

    名前解決の関数例) 正引き gethostbyname() 逆引き gethostbyaddr()  単独のコマンドとして提供されているもの  nslookupコマンド(そのうち無くなるかもと言われ続け10年以上…)  digコマンド(BIND9での推奨。ただし、MS-Windowsには入っていない) 6
  2. Pythonのsoketモジュールでの名前解決例 Socketモジュールでの名前解決例 PS Z:¥> python … … >>> import socket

    >>> result = socket.gethostbyname("www.connpass.com") >>> print(result) xx.xxx.xxx.xx >>> result = socket.gethostbyaddr("xx.xx.xx.xx") >>> print(result) ('ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com', [], [‘xx.xxx.xxx.xx']) >>> print(result[0]) ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com >>> 8 入力したコマンドの実際の文字色は白 色ですが、この資料では、見やすいよ うに黄色に変更しています。 gethostbyname()やgethostbyaddr()は、 単純な正引きや逆引きの処理のみで DNSのレコードの種類などは指定できない。
  3. DNSで扱うレコードの種類(主なもの) タイプ 値(10進数) 機能 A 1 名前に対するIPv4 IPアドレス NS 2

    権威ネームサーバ CNAME 5 別名に対する正式名 SOA 6 ゾーンの権威の開始 PTR 12 IPアドレスに対する名前 MX 15 ドメインのメール転送エージェント(MTA)のリストとドメイン名を マッピングーンのメールサーバ TXT 16 テキスト形式のレコード AAAA 28 名前に対するIpv6 IPアドレス 9
  4. DNSで扱うレコードの種類(主なもの) タイプ 値(10進数) 機能 SRV 33 プロトコルに使用される汎用サービスロケーションレコード DS 43 委任ゾーンのDNSSEC署名鍵を識別するために使用されるレコード

    RRSIG 46 DNSSECで保護されたレコードセットの署名。 DNSKEY 48 DNSSECで使用される鍵レコード。 NSEC3 50 zonewalkingを許可しないで名前のための非存在の証明を可能にする DNSSECへの拡張 NSEC3PARAM 51 NSEC3で使用するためのパラメータレコード * 255 ネームサーバーが保持している全てのタイプのすべてのレコードを回 答する。"ANY"と呼ばれることもある。 CAA 257 ホスト/ドメインに対して許容できるCAを制限する、DNS証明機関の承 認 10
  5. digコマンド実行例1(引数なし) digコマンド実行例(引数なしでは .<Root> の NSレコードを問い合わせ) PS Z:¥> dig ; <<>>

    DiG 9.15.1 <<>> ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60625 ;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 498445 IN NS g.root-servers.net. . 498445 IN NS b.root-servers.net. . 498445 IN NS f.root-servers.net. . 498445 IN NS m.root-servers.net. . 498445 IN NS d.root-servers.net. . 498445 IN NS h.root-servers.net. . 498445 IN NS a.root-servers.net. . 498445 IN NS i.root-servers.net. . 498445 IN NS j.root-servers.net. . 498445 IN NS l.root-servers.net. . 498445 IN NS k.root-servers.net. . 498445 IN NS c.root-servers.net. . 498445 IN NS e.root-servers.net. ;; Query time: 74 msec ;; SERVER: xx.xx.xx.xx#53(xx.xx.xx.xx) ;; WHEN: Fri Jul 12 20:28:49 東京 (標準時) 2019 ;; MSG SIZE rcvd: 239 11 引数無しだと、Root<.>ゾーンの NSレコードを問い合わせ
  6. digコマンド実行例2(dig jp) digコマンド実行例(1階層分を指定。デフォルトは Aレコード) PS Z:¥> dig jp ; <<>>

    DiG 9.15.1 <<>> jp ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52896 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;jp. IN A ;; AUTHORITY SECTION: jp. 795 IN SOA z.dns.jp. root.dns.jp. 1562917502 3600 900 1814400 900 ;; Query time: 27 msec ;; SERVER: xx.xx.xx.xx#53(xx.xx.xx.xx) ;; WHEN: Fri Jul 12 16:56:47 東京 (標準時) 2019 ;; MSG SIZE rcvd: 78 12 ドメイン名だけだと、Aレコードで問い合わせ “jp.” の Aレコードが見つからなかったので、 回答としてSOAレコードが返されている。
  7. digコマンド実行例4(dig jp any) jp の ANY レコードを問い合わせ PS Z:¥> dig

    jp any ; <<>> DiG 9.15.1 <<>> jp any ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38158 ;; flags: qr rd ra; QUERY: 1, ANSWER: 18, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;jp. IN ANY ;; ANSWER SECTION: jp. 80507 IN RRSIG DNSKEY 8 1 86400 20190905184500 20190706184500 54004 jp. tynFuindpW5ddt8vNFOEGfWEb tleksHNcVwAAiCh9oGYlmU44p10oMgt oUhzxJawkq5zH0zoN2BCmAaB/FLsxPdNcicMPFhy7OS8vwy5KXgQlAEt aJq/1jInLXsUh4/QuEBdSkVUhlVHED6wAqkgWw8zF SBH3ZupfGY6IR6A PmC5sjGlhK7KyESJ2YMA/tD4zQxH6k/Ek0C0tCHTaUVlf10crySsm3AS p2dKChQ3PBOQ0B5ilMULibhxUyAB8b5xlm+7UsYvg+Pz5X0LB17VF/lR fxCc1Q8G5FzoORSt6pu8Kw7ehiIO6FiuV2kUTDqfpOfkFWpIMLVwLwlO f2Lt/w== jp. 80507 IN DNSKEY 256 3 8 AwEAAdsTPPJFhwoBmjsULoSV5PNXNNs3w0PPlGSfqwdVq5ThANHcXVkV bDsOkyJA8XkOKKt4R oz3U1r7ti6rJvxf/nu7npB2XrUXWqGzBSBXkCUR eTs/sPprOwT3eDGcDPy3ctE/LtLN/1xcy0P0uL23hZHxc9kU8HkVoo9H qmsc5DGR jp. 80507 IN DNSKEY 256 3 8 AwEAAfWRu769ojIHGh0HfbJkSReeVMfvkHNJcUfrEyZoi4CfpfdXwL3A tsfxcslbagHirNacy PciUWAQQEHikPLtHHkAXrF9+0aRBxDYtrPySs49 LYLdZvHdDn7K66dg+347muShmRfpSTHHDz5L1R1W0PX7+pC6Z285/zhe q+KyLGoR jp. 80507 IN DNSKEY 257 3 8 AwEAAda2k1JzUQzBpcWNtstQZj2/TKvFLps5lcGvcaig+GCD8ig/wPZr lJcPP2Nwb/tuXGD9B IoRVF3cfTKHdN7UCmnFd/cPylXSdUdQQetDLgV9 y269GwWPGq4dvMQZeKWW6DQDin1FwPzW+R1jo6EdOu9vMBnIYbgUZ48J jSK5oRxagOLvQN0ypAt/Kt3j/07yAvFbj 6IiNtB4o4hUGXO5KCy2nPrC MjigrNXb8beMOGBw360vMf1V5w8mhUkU1DiXlkFFflJYzz5dg3QWQFtI ctqHSae5os+ucbXIg3fWv2f/aajP7oW9HPTOzNLm5GTEU8bl/ PuGr1ZN eBwdltpjdt8= jp. 75085 IN RRSIG SOA 8 1 86400 20190805174502 20190706174502 378 jp. FXNlqPYsag0ZzEnECINY5+hZ2I2jQx PqimQqtnnM2Q6qRUG1FMmjqYbt M3vwnWTVKbN2klcX+XHbG4wP3igcmCjIA0U2hlAisPSh0by/tmmm10i2 lISHzRw7hW+F2kHlVYxbWnq+YMYk5oD67ehlLuuqa19zYp AkSj2xfPGa jPM= 14 “jp.” の ANYレコード 回答として複数の種類のレコードが返されている。
  8. digコマンド実行例4(続き) jp. 75085 IN SOA z.dns.jp. root.dns.jp. 1562906702 3600 900

    1814400 900 jp. 72913 IN RRSIG NS 8 1 86400 20190805174502 20190706174502 378 jp. dj4SWB6EO5Br3DkTj+zbrNuVWfcboQW HeZTI646a5/Tjy2rzCsOEx3uz V1Mk/rc0hJOPFQPbWic7Nl7onaT5RC5C+AWxRYMRo9GCkhePCZC6W2D9 eVQhZPD0tcn2k2kemcv6yFXvLESxmjDV6DeM/Qhx+oOcI9g UIp8OKOBa 3wM= jp. 86391 IN DS 54004 8 2 5F4B24F667BC70880720D10DF317DC8FF80C63E586D504E6BBFE53F0 B9ECC040 jp. 86391 IN DS 54004 8 1 0EC348CC7E6D3213CC89E5867088043FC7D5C111 jp. 86391 IN RRSIG DS 8 1 86400 20190725050000 20190712040000 59944 . KruGfTOXw4xuHEUK8866CJM+idIi5Ba E5SwPVdsm+NUsNyWNBTHU5Nse +blxnuAirSGp678WY8ZcgHW9DAYxchtGY5gNEoZ7dPgiRZYAcPCwhv7/ 3GLL9QtfBNlyPQzseKLmXZQvMPMYw9lLKZz+KT5+WwLyMnU zwzClTmUR XsGXZ5ymcy0zs7i/cpF2fDQN0CgmsXeCV8UZm6YWZX62QdlHYWQUWeeQ qaITfWEp4sv5bCDQ8ZDMEfusI0fMoWZFk1f05cPZrFP/Ple6oTcIrB4c Lp7T6k 9IKUMEoPr+QQzPH0fw5ft0fVV6DIieMl/5ArAMP+AG4nkObO2a pY8pig== jp. 72913 IN NS g.dns.jp. jp. 72913 IN NS e.dns.jp. jp. 72913 IN NS d.dns.jp. jp. 72913 IN NS h.dns.jp. jp. 72913 IN NS f.dns.jp. jp. 72913 IN NS a.dns.jp. jp. 72913 IN NS b.dns.jp. jp. 72913 IN NS c.dns.jp. ;; Query time: 34 msec ;; SERVER: xx.xx.xx.xx#53(xx.xx.xx.xx) ;; WHEN: Fri Jul 12 22:07:18 東京 (標準時) 2019 ;; MSG SIZE rcvd: 1763 15
  9. digコマンド実行例4(dig ec2-52-1-2-3.compute-1.amazon.com a ) digコマンド実行例(ec2-52-1-2-3.compute-1.amazon.com の Aレコードを問い合わせ) PS Z:¥> dig

    ec2-52-1-2-3.compute-1.amazonaws.com a ; <<>> DiG 9.15.1 <<>> ec2-52-1-2-3.compute-1.amazonaws.com a ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44659 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;ec2-52-1-2-3.compute-1.amazonaws.com. IN A ;; ANSWER SECTION: ec2-52-1-2-3.compute-1.amazonaws.com. 603946 IN A 52.1.2.3 ;; Query time: 18 msec ;; SERVER: xx.xx.xx.xx#53(xx.xx.xx.xx) ;; WHEN: Fri Jul 12 19:24:40 東京 (標準時) 2019 ;; MSG SIZE rcvd: 81 PS Z:¥> 16 FQDN(ホスト名+ドメイン名)の Aレコード
  10. digコマンド実行例4(dig 3.2.1.52.in-addr.arpa ptr) digコマンド実行例(3.2.1.52.in-addr.arpa の PTRレコードを問い合わせ) PS Z:¥> dig 3.2.1.52.in-addr.arpa

    ptr ; <<>> DiG 9.15.1 <<>> 3.2.1.52.in-addr.arpa ptr ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5458 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;3.2.1.52.in-addr.arpa. IN PTR ;; ANSWER SECTION: 3.2.1.52.in-addr.arpa. 300 IN PTR ec2-52-1-2-3.compute-1.amazonaws.com. ;; Query time: 137 msec ;; SERVER: xx.xx.xx.xx#53(xx.xx.xx.xx) ;; WHEN: Fri Jul 12 19:29:03 東京 (標準時) 2019 ;; MSG SIZE rcvd: 100 Z:¥> 17 逆引きの場合は、 IPアドレスを逆順に並べ、 “in-addr.arpa”を付加して ゾーン名とする。
  11. Python3でDNSリゾルバを作ってみよう♪  Dnspython – A DNS toolkit for Python を利用する

     Example_dnspython https://github.com/NobuyukiInoue/Example_dnspython  Soketモジュールを利用して、直接パケットを送受信する  pyDNSdump https://github.com/NobuyukiInoue/pyDNSdump せっかくなので、受信結果だけでなく、  先頭からのアドレス  各フィールドの16進数表示  翻訳結果 も表示する 18
  12. Dnspython - A DNS toolkit for Python  dnspython http://www.dnspython.org/

     dnspython - Example http://www.dnspython.org/examples.html  dnspython - github https://github.com/rthalley/dnspython  DNS Python のインストール pip install dnspython 19
  13. Dnspythonを利用した問い合わせ例(“.”, “ns”) 20 PS Z:¥> python … >>> >>> import

    dns.resolver >>> answers = dns.resolver.query(".", "ns") >>> print(answers) <dns.resolver.Answer object at 0x01E7AA90> >>> flds = [data for data in answer] >>> print(flds) [<DNS IN NS rdata: j.root-servers.net.>, <DNS IN NS rdata: f.root-servers.net.>, <DNS IN NS rdata: l.root-servers.net.>, <DNS IN NS rdata: h.root-servers.net.>, <DNS IN NS rdata: c.root-servers.net.>, <DNS IN NS rdata: a.root-servers.net.>, <DNS IN NS rdata: k.root- servers.net.>, <DNS IN NS rdata: i.root-servers.net.>, <DNS IN NS rdata: m.root- servers.net.>, <DNS IN NS rdata: e.root-servers.net.>, <DNS IN NS rdata: b.root- servers.net.>, <DNS IN NS rdata: d.root-servers.net.>, <DNS IN NS rdata: g.root- servers.net.>] >>> DnsPythonでは、 DNSの応答パケットのフォーマットに合わせて、 Classが定義されている。 結果は、オブジェクトに格納されて返される。
  14. Responseの内容を表示 21 >>> print(answers.response) id 48281 opcode QUERY rcode NOERROR

    flags QR RD RA ;QUESTION . IN NS ;ANSWER . 492608 IN NS b.root-servers.net. . 492608 IN NS g.root-servers.net. . 492608 IN NS j.root-servers.net. . 492608 IN NS l.root-servers.net. . 492608 IN NS d.root-servers.net. . 492608 IN NS h.root-servers.net. . 492608 IN NS f.root-servers.net. . 492608 IN NS a.root-servers.net. . 492608 IN NS e.root-servers.net. . 492608 IN NS i.root-servers.net. . 492608 IN NS k.root-servers.net. . 492608 IN NS c.root-servers.net. . 492608 IN NS m.root-servers.net. ;AUTHORITY ;ADDITIONAL >>> responseの出力結果
  15. Dnspythonを利用した問い合わせ例("ec2-52-1-2-3.compute-1.amazonaws.com", "a") 22 >>> answers = dns.resolver.query("ec2-52-1-2-3.compute-1.amazonaws.com", "a") >>> flds

    = [data for data in answers] >>> print(flds) [<DNS IN A rdata: 52.1.2.3>] >>> print(answers.response) id 6129 opcode QUERY rcode NOERROR flags QR RD RA ;QUESTION ec2-52-1-2-3.compute-1.amazonaws.com. IN A ;ANSWER ec2-52-1-2-3.compute-1.amazonaws.com. 604800 IN A 52.1.2.3 ;AUTHORITY ;ADDITIONAL >>> "compute-1.amazonaws.com"ゾーンの Aレコード
  16. Dnspythonを利用した問い合わせ例("3.2.1.52.in-addr.arpa", "ptr") 23 >>> answers = dns.resolver.query("3.2.1.52.in-addr.arpa", "ptr") >>> flds

    = [data for data in answers] >>> print(flds) [<DNS IN PTR rdata: ec2-52-1-2-3.compute-1.amazonaws.com.>] >>> print(answers.response) id 40200 opcode QUERY rcode NOERROR flags QR RD RA ;QUESTION 3.2.1.52.in-addr.arpa. IN PTR ;ANSWER 3.2.1.52.in-addr.arpa. 300 IN PTR ec2-52-1-2-3.compute-1.amazonaws.com. ;AUTHORITY ;ADDITIONAL >>> responseの出力結果
  17. Dnspythonを利用した問い合わせ例(“jp”, “a”) 24 >>> answers = dns.resolver.query("jp", "soa") >>> print(answers.response)

    id 30939 opcode QUERY rcode NOERROR flags QR RD RA ;QUESTION jp. IN SOA ;ANSWER jp. 70753 IN SOA z.dns.jp. root.dns.jp. 1562906702 3600 900 1814400 900 ;AUTHORITY ;ADDITIONAL >>> "jp"ゾーンのSOAレコード
  18. Dnspythonを利用した問い合わせ例(“jp”, “dnskey”) 25 >>> answers = dns.resolver.query("jp", "dnskey") >>> print(answers.response)

    id 38872 opcode QUERY rcode NOERROR flags QR RD RA ;QUESTION jp. IN DNSKEY ;ANSWER jp. 76008 IN DNSKEY 256 3 8 AwEAAfWRu769ojIHGh0HfbJkSReeVMfv kHNJcUfrEyZoi4CfpfdXwL3Atsfxcslb agHirNacyPciUWAQQEHikPLtHHkAXrF9 +0a RBxDYtrPySs49LYLdZvHdDn7K66dg +347muShmRfpSTHHDz5L1R1W0PX7+pC6 Z285/zheq+KyLGoR jp. 76008 IN DNSKEY 257 3 8 AwEAAda2k1JzUQzBpcWNtstQZj2/TKvF … … …
  19. Dnspythonを利用した問い合わせ例(存在しないレコード) 26 >>> answer = dns.resolver.query("jp", "a") Traceback (most recent

    call last): File "C:¥xxxxxx¥AppData¥Local¥Programs¥Python¥Python37¥lib¥site- packages¥dns¥resolver.py", line 213, in __init__ rdclass, rdtype) File "C:¥Users¥sprin¥AppData¥Local¥Programs¥Python¥Python37¥lib¥site- packages¥dns¥message.py", line 341, in find_rrset raise KeyError KeyError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:¥xxxxx¥xxxxx¥Python¥Python37¥lib¥site-packages¥dns¥resolver.py", line 223, in __init__ dns.rdatatype.CNAME) ... ... 指定したレコードがみつからない場合は、 エラーになります。
  20. Dnspython - A DNS toolkit for Python そのほか、DynamicDNSにも対応していて、DNSサーバにレコードの登録 リクエストを送ることもできます。 参考記事)

    Python: dnspythonでAレコードを追加して削除する https://www.hiroom2.com/2017/02/19/python- dnspython%E3%81%A7a%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%8 2%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E5%89%8A%E9%99%A4% E3%81%99%E3%82%8B/ 27
  21. Soketモジュールを利用して 直接パケットを送受信する(pyDNSdump) https://github.com/NobuyukiInoue/pyDNSdump pyDNSdump This program sends a DNS UDP

    request and outputs a response.  How to execute pyDNSdump.py python pyDNSdump.py [dnsserver] [target] [recordtype]  Supported record types ANY(255), A(1), NS(2), CNAME(5), SOA(6), PTR(12), HINFO(13), MX(15), TXT(16), AAAA(28), SRV(33), DS(43), RRSIG(46), NSEC(47), DNSKEY(48), NSEC3(50), NSEC3PARAM(51), CAA(257) 28
  22. sokectモジュールを使って、直接DNSの パケットを送受信する(主な流れ) Import socket # 送信するデータをbytes型で準備する。 data_s = b'01000001000000…….00' #

    ソケットを作成 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDPのパケットを送信 s.sendto(data_s, (“xx.xx.xx.xx”, 53)) # UDPのパケットを受信(送信したパケットに対する応答を待つ data_r, address = s.recvfrom(受信バッファサイズ) 29
  23. rfc1034 DOMAIN NAMES - CONCEPTS AND FACILITIES 6.2. Example standard

    queries 6.2.1. QNAME=SRI-NIC.ARPA, QTYPE=A The query would look like: +---------------------------------------------------+ Header | OPCODE=SQUERY | +---------------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=A | +---------------------------------------------------+ Answer | <empty> | +---------------------------------------------------+ Authority | <empty> | +---------------------------------------------------+ Additional | <empty> | +---------------------------------------------------+ 31
  24. rfc1034 DOMAIN NAMES - CONCEPTS AND FACILITIES The response from

    C.ISI.EDU would be: +---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +---------------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=A | +---------------------------------------------------+ Answer | SRI-NIC.ARPA. 86400 IN A 26.0.0.73 | | 86400 IN A 10.0.0.51 | +---------------------------------------------------+ Authority | <empty> | +---------------------------------------------------+ Additional | <empty> | +---------------------------------------------------+ 32
  25. DNSパケットを直接送受信(“jp” の “any”レコード)(1) 33 PS Z:¥pyDNSdump> python .¥pyDNSdump.py xx.xx.xx.xx jp

    any ============================================================================================ DNS Server = xx.xx.xx.xx:53 resolv string = jp record type = ANY ============================================================================================ Reply from : xx.xx.xx.xx:53 length : 0x0136(310) bytes. Response time : 19.001007[ms] ============================================================================================ 0000: Header: 0000: 0001 Transaction ID: 1 0002: 8380 Flags: 0b1000001110000000 /* [bit 0] QR (1) ... Response [bit 1-4] OPCODE (0) ... standard query [bit 5] AA (0) ... Not Authoritative [bit 6] TC (1) ... Flagment occur [bit 7] RD (1) ... Repeat Query [bit 8] RA (1) ... Recursion Available is False [bit 9] Reserve (0) [bit 10] Authentic Data(0) [bit 11] Checking Disable(0) [bit 12-15] RCODE (0) ... No Error */
  26. DNSパケットを直接送受信(“jp” の “any”レコード)(2) 34 0004: 0001 Questions: 1 0006: 0001

    Answer RRS: 1 0008: 0000 Authority RRS: 0 000a: 0000 Additional RRS: 0 000c: Querys: 000c: 026a7000 Name: jp 0010: 00ff Type: ANY(255) 0012: 0001 Class: IN(1) 0014: Answers: 0014: c00c Name: jp 0016: 002e Type: RRSIG(46) 0018: 0001 Class: IN(1) 001a: 0001227d Time to live: 0 day 20:39:25(74365) 001e: 0116 data_length: 278 0020: 0030 Type covered: 48 0022: 0008 Algorithm: SHA256(8) 0023: 01 Labels: 1 0024: 00015180 Original TTL: 1 day 00:00:00(86400) 0028: 5d7157ac fld_Signature_expiration: 1567709100 002c: 5d20ec2c Time signed: 1562438700 0030: 0000d2f4 Id of signing key: 54004
  27. DNSパケットを直接送受信(“jp” の “any”レコード)(3) 35 Signer's name: jp 0036: b729c5ba29dda56e5d76df2f34538419f5846ed95e92c1cd715c000220a1f68198966538e29d74a0c82da14873c496b092ae731f4ce8376042980681fc 52

    ecc4f74d72270c3c5872ece4bcbf0cb929781094012d689abfd632272d7b14878fd0b8405d4a4554865547103eb002a9205b0f33152047dd9ba97c663a 211e803e 60b9b231a584aecac84489d98300fed0f8cd0c47ea4fc49340b4b421d36945657f5d1caf24ac9b7012a7674a0a14373c1390d01e6294c50b89b8715320 01f1be71 966fbb52c62f83e3f3e57d0b075ed517f9517f109cd50f06e45ce83914adea9bbc2b0ede86220ee858ae5769144c3a9fa4e7e4156a4830b5702f094e7f 62edff Signature: b7 29 c5 ba 29 dd a5 6e 5d 76 df 2f 34 53 84 19 f5 84 6e d9 5e 92 c1 cd 71 5c 00 02 20 a1 f6 81 98 96 65 38 e2 9d 74 a0 c8 2d a1 48 73 c4 96 b0 92 ae 73 1f 4c e8 37 60 42 98 06 81 fc 52 ec c4 f7 4d 72 27 0c 3c 58 72 ec e4 bc bf 0c b9 29 78 10 94 01 2d 68 9a bf d6 32 27 2d 7b 14 87 8f d0 b8 40 5d 4a 45 54 86 55 47 10 3e b0 02 a9 20 5b 0f 33 15 20 47 dd 9b a9 7c 66 3a 21 1e 80 3e 60 b9 b2 31 a5 84 ae ca c8 44 89 d9 83 00 fe d0 f8 cd 0c 47 ea 4f c4 93 40 b4 b4 21 d3 69 45 65 7f 5d 1c af 24 ac 9b 70 12 a7 67 4a 0a 14 37 3c 13 90 d0 1e 62 94 c5 0b 89 b8 71 53 20 01 f1 be 71 96 6f bb 52 c6 2f 83 e3 f3 e5 7d 0b 07 5e d5 17 f9 51 7f 10 9c d5 0f 06 e4 5c e8 39 14 ad ea 9b bc 2b 0e de 86 22 0e e8 58 ae 57 69 14 4c 3a 9f a4 e7 e4 15 6a 48 30 b5 70 2f 09 4e 7f 62 ed ff ============================================================================================ PS Z:¥Example_dnspython>
  28. DNSパケットを直接送受信(“jp” の “ns”レコード)(1) 36 PS Z:¥pyDNSdump> python .¥pyDNSdump.py xx.xx.xx.xx jp

    ns ============================================================================================ DNS Server = xx.xx.xx.xx:53 resolv string = jp record type = NS ============================================================================================ Reply from : xx.xx.xx.xx:53 length : 0x0098(152) bytes. Response time : 60.575724[ms] ============================================================================================ 0000: Header: 0000: 0001 Transaction ID: 1 0002: 8180 Flags: 0b1000000110000000 /* [bit 0] QR (1) ... Response [bit 1-4] OPCODE (0) ... standard query [bit 5] AA (0) ... Not Authoritative [bit 6] TC (0) ... Did not Flagment [bit 7] RD (1) ... Repeat Query [bit 8] RA (1) ... Recursion Available is False [bit 9] Reserve (0) [bit 10] Authentic Data(0) [bit 11] Checking Disable(0) [bit 12-15] RCODE (0) ... No Error */
  29. DNSパケットを直接送受信(“jp” の “ns”レコード)(2) 37 0004: 0001 Questions: 1 0006: 0008

    Answer RRS: 8 0008: 0000 Authority RRS: 0 000a: 0000 Additional RRS: 0 000c: Querys: 000c: 026a7000 Name: jp 0010: 0002 Type: NS(2) 0012: 0001 Class: IN(1) 0014: Answers: 0014: c00c Name: jp 0016: 0002 Type: NS(2) 0018: 0001 Class: IN(1) 001a: 00014716 Time to live: 0 day 23:15:34(83734) 001e: 0008 data_length: 8 0020: 016103646e73c00c Name: a.dns[.jp] 0028: Answers: 0028: c00c Name: jp 002a: 0002 Type: NS(2) 002c: 0001 Class: IN(1) 002e: 00014716 Time to live: 0 day 23:15:34(83734) 0032: 0004 data_length: 4 0034: 0163c022 Name: c[.dns[.jp]] 016103646e73c00c 0x01 … 文字列の長さ(1文字) 0x61 … ‘a’ 0x03 … 文字列の長さ(3文字) 0x64 … ‘d’ 0x6e … ‘n’ 0x7c … ‘s’ 0xc00c 000c … 参照先のオフセットアドレス "a" + "." + "dns" + "." + "jp" ⇓ "a.dns.jp" 026a7000 0x02 … 文字列の長さ(2文字) 0x6a … ‘j’ 0x70 … ‘p’ 0x00 … 文字列の終わり
  30. DNSパケットを直接送受信(“jp” の “ns”レコード)(3) 38 0038: Answers: 0038: c00c Name: jp

    003a: 0002 Type: NS(2) 003c: 0001 Class: IN(1) 003e: 00014716 Time to live: 0 day 23:15:34(83734) 0042: 0004 data_length: 4 0044: 0168c022 Name: h[.dns[.jp]] 0048: Answers: 0048: c00c Name: jp 004a: 0002 Type: NS(2) 004c: 0001 Class: IN(1) 004e: 00014716 Time to live: 0 day 23:15:34(83734) 0052: 0004 data_length: 4 0054: 0167c022 Name: g[.dns[.jp]] 0058: Answers: 0058: c00c Name: jp 005a: 0002 Type: NS(2) 005c: 0001 Class: IN(1) 005e: 00014716 Time to live: 0 day 23:15:34(83734) 0062: 0004 data_length: 4 0064: 0165c022 Name: e[.dns[.jp]]
  31. DNSパケットを直接送受信(“jp” の “ns”レコード)(4) 39 0068: Answers: 0068: c00c Name: jp

    006a: 0002 Type: NS(2) 006c: 0001 Class: IN(1) 006e: 00014716 Time to live: 0 day 23:15:34(83734) 0072: 0004 data_length: 4 0074: 0164c022 Name: d[.dns[.jp]] 0078: Answers: 0078: c00c Name: jp 007a: 0002 Type: NS(2) 007c: 0001 Class: IN(1) 007e: 00014716 Time to live: 0 day 23:15:34(83734) 0082: 0004 data_length: 4 0084: 0162c022 Name: b[.dns[.jp]] 0088: Answers: 0088: c00c Name: jp 008a: 0002 Type: NS(2) 008c: 0001 Class: IN(1) 008e: 00014716 Time to live: 0 day 23:15:34(83734) 0092: 0004 data_length: 4 0094: 0166c022 Name: f[.dns[.jp]] ============================================================================================ PS Z:¥pyDNSdump>
  32. DNSパケットを直接送受信(“ec2-52-1-2-3.compute-1.amazonaws.com”の”A”レコード)(1) 40 PS Z:¥pyDNSdump> python .¥pyDNSdump.py xx.xx.xx.xx ec2-52-1-2-3.compute1.amazonaws.com a ============================================================================================

    DNS Server = xx.xx.xx.xx:53 resolv string = ec2-52-1-2-3.compute-1.amazonaws.com record type = A ============================================================================================ Reply from : xx.xx.xx.xx:53 length : 0x0046(70) bytes. Response time : 21.001339[ms] ============================================================================================ 0000: Header: 0000: 0001 Transaction ID: 1 0002: 8180 Flags: 0b1000000110000000 /* [bit 0] QR (1) ... Response [bit 1-4] OPCODE (0) ... standard query [bit 5] AA (0) ... Not Authoritative [bit 6] TC (0) ... Did not Flagment [bit 7] RD (1) ... Repeat Query [bit 8] RA (1) ... Recursion Available is False [bit 9] Reserve (0) [bit 10] Authentic Data(0) [bit 11] Checking Disable(0) [bit 12-15] RCODE (0) ... No Error */
  33. DNSパケットを直接送受信(“ec2-52-1-2-3.compute-1.amazonaws.com”の”A”レコード)(2) 41 0004: 0001 Questions: 1 0006: 0001 Answer RRS:

    1 0008: 0000 Authority RRS: 0 000a: 0000 Additional RRS: 0 000c: Querys: 000c: 0c6563322d35322d312d322d3309636f6d707574652d3109616d617a6f6e61777303636f6d00 Name: ec2-52-1-2-3.compute- 1.amazonaws.com 0032: 0001 Type: A(1) 0034: 0001 Class: IN(1) 0036: Answers: 0036: c00c Name: ec2-52-1-2-3.compute-1.amazonaws.com 0038: 0001 Type: A(1) 003a: 0001 Class: IN(1) 003c: 00093352 Time to live: 6 day 23:29:22(602962) 0040: 0004 data_length: 4 0042: 34010203 Addr: 52.1.2.3 ============================================================================================ PS Z:¥pyDNSdump>
  34. DNSパケットを直接送受信(“3.2.1.52.in-addr.arpa”の”PTR”レコード)(1) 42 PS Z:¥pyDNSdump> python .¥dns_send_udp_request.py xx.xx.xx.xx 52.1.2.3 ptr ============================================================================================

    DNS Server = xx.xx.xx.xx:53 Target = 3.2.1.52.in-addr.arpa record type = PTR ============================================================================================ Reply from : xx.xx.xx.xx:53 length : 0x0059(89) bytes. Response time : 45.002699[ms] ============================================================================================ 0000: Header: 0000: 0001 Transaction ID: 1 0002: 8180 Flags: 0b1000000110000000 /* [bit 0] QR (1) ... Response [bit 1-4] OPCODE (0) ... standard query [bit 5] AA (0) ... Not Authoritative [bit 6] TC (0) ... Did not Flagment [bit 7] RD (1) ... Repeat Query [bit 8] RA (1) ... Recursion Available is False [bit 9] Reserve (0) [bit 10] Authentic Data(0) [bit 11] Checking Disable(0) [bit 12-15] RCODE (0) ... No Error */
  35. DNSパケットを直接送受信(“3.2.1.52.in-addr.arpa”の”PTR”レコード)(2) 43 0004: 0001 Questions: 1 0006: 0001 Answer RRS:

    1 0008: 0000 Authority RRS: 0 000a: 0000 Additional RRS: 0 000c: Querys: 000c: 01330132013102353207696e2d61646472046172706100 Name: 3.2.1.52.in-addr.arpa 0023: 000c Type: PTR(12) 0025: 0001 Class: IN(1) 0027: Answers: 0027: c00c Name: 3.2.1.52.in-addr.arpa 0029: 000c Type: PTR(12) 002b: 0001 Class: IN(1) 002d: 0000012c Time to live: 0 day 00:05:00(300) 0031: 0026 data_length: 38 0033: 0c6563322d35322d312d322d3309636f6d707574652d3109616d617a6f6e61777303636f6d00 Domain Name: ec2-52-1-2-3.compute-1.amazonaws.com ============================================================================================ PS Z:¥pyDNSdump>