ICTSC2024 二次予選 問題解説: [MYS] DNSって難しい。

問題文

あなたは、若手社員にキャッシュDNSサーバの更改を依頼し、検証環境でテストするよう指示しました。

  • 要件

    • ミドルウェアは unbound で構築すること。
    • DNSSECを実装すること。
    • Public DNSへ再帰問い合わせができること。
    • 上記テストのため、server1はInternetに接続すること。しっかりパケットフィルタすること。
    • 検証リソースが限られているため、最小限の構成で組むこと。
  • 構成図

無事、検証環境の構築が終わったようなのですが、若手社員が困っているようです。
話を聞いてみると、テストを実施したようですが、上手く動かないところがあるそうです。

  • テスト内容・結果
    • 試しにインターネット(yahoo.co.jp、google.co.jp)へpingしてみたが、応答が返ってこない。
    • 上記のFQDNを、構築したDNSサーバに問い合わせしてみたが、応答がすごく遅く、大体がエラーとなる。

先輩として、サクッと問題解消してカッコイイところを見せてあげましょう。

前提条件

  • PC1の設定を変更してはいけない。
  • server1の/etc/hosts, unboundの設定を変更してはいけない。
  • server1のパケットフィルターに対し、必要以上の設定変更を行ってはいけない。

初期状態

  • PCから yahoo.co.jp 宛てへpingしたが応答がない
user@PC1:~$ ping yahoo.co.jp
ping: yahoo.co.jp: Name or service not known

終了状態

  • PCから yahoo.co.jp をDNS問い合わせすることができる
user@PC1:~$ dig yahoo.co.jp

; <<>> DiG 9.18.28-0ubuntu0.24.04.1-Ubuntu <<>> yahoo.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4121
;; flags: qr rd ra; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;yahoo.co.jp.                   IN      A

;; ANSWER SECTION:
yahoo.co.jp.            299     IN      A       182.22.25.124
yahoo.co.jp.            299     IN      A       183.79.249.124
yahoo.co.jp.            299     IN      A       182.22.31.124
~(中略)~

;; Query time: 3343 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sun Nov 03 22:35:22 JST 2024
;; MSG SIZE  rcvd: 264

  • PCから yahoo.co.jp 宛てへのping疎通が確認できる。
user@PC1:~$ ping yahoo.co.jp
PING yahoo.co.jp (182.22.25.252) 56(84) bytes of data.
64 bytes from 182.22.25.252: icmp_seq=1 ttl=56 time=1.50 ms
64 bytes from 182.22.25.252: icmp_seq=2 ttl=56 time=0.937 ms
64 bytes from 182.22.25.252: icmp_seq=3 ttl=56 time=1.01 ms
64 bytes from 182.22.25.252: icmp_seq=4 ttl=56 time=1.27 ms
64 bytes from 182.22.25.252: icmp_seq=5 ttl=56 time=1.08 ms
^C
--- yahoo.co.jp ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 10496ms
rtt min/avg/max/mdev = 0.937/1.159/1.495/0.201 ms

解説

DNSSEC実装によりDNSメッセージサイズが増加する傾向にあります。
メッセージサイズ増加により、「512の壁」と呼ばれる問題が顕著化し、その対処方法として以下2つがあります。

  • TCPフォールバック
  • EDNS0

本問題では意図的にEDNS上限サイズを512byteに制限してあり、TCPフォールバックを引き起こすよう構築されております。
TCPフォールバックでは TCP:53 で通信できる必要がありますが、通信要件として拾いきれずiptablesの許可しなかった、というシチュエーションです。
大きいサイズのメッセージがやりとりできないため、問い合わせに時間がかかったり、問い合わせ先によっては問い合わせ不可に陥るケースとなりました。

模範解答

iptables で TCPフォールバックに利用する、宛先ポートTCP 53 を開放する。

ictsc@server1:~$ sudo iptables -I OUTPUT 7 -p tcp --dport 53 -j ACCEPT
ictsc@server1:~$
ictsc@server1:~$ sudo iptables -L -v --line-numbers
sudo iptables -L -v --line-numbers

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1      186 32599 ACCEPT     icmp --  any    any     anywhere             anywhere
2    37474 3125K ACCEPT     all  --  any    any     192.168.255.52       anywhere
3    20758 1584K ACCEPT     all  --  lo     any     anywhere             anywhere
4    23899 1976K ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
5        0     0 ACCEPT     udp  --  any    any     anywhere             anywhere             udp dpt:domain
6        3   180 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
7    18968 6222K DROP       all  --  any    any     anywhere             anywhere

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1      704  122K ACCEPT     icmp --  any    any     anywhere             anywhere
2    35689 3083K ACCEPT     all  --  any    any     anywhere             192.168.255.52
3    20758 1584K ACCEPT     all  --  any    lo      anywhere             anywhere
4        0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
5        0     0 ACCEPT     udp  --  any    any     anywhere             anywhere             udp spt:domain
6    11023  709K ACCEPT     udp  --  any    any     anywhere             anywhere             udp dpt:domain
7       88  5859 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:domain ★
8     2141  163K ACCEPT     udp  --  any    any     anywhere             anywhere             udp dpt:ntp
9    11399 1036K ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
10   15109  927K DROP       all  --  any    any     anywhere             anywhere
ictsc@server1:~$