はじめに

curl google.com やChromeでgoogle.comへアクセスする際など、アプリケーションがドメイン名を利用しようとするとき、内部的にはC標準ライブラリのgetaddrinfoにこのドメイン名が渡されて、IPアドレスに解決されている。 この際の挙動をいつも忘れるのでメモする。

本文

概要

ドメイン名を渡したりIPアドレスを渡したりすると、様々な設定を用いて、そのドメイン名やIPアドレスが対応するIPアドレスを1つ以上返してくれる。

基本的な使い方

インターフェース

int getaddrinfo(const char *restrict node,
                const char *restrict service,
                const struct addrinfo *restrict hints,
                struct addrinfo **restrict res);

実際の値のイメージ

node = "google.com"
service = "http"

フローのイメージ

  1. curl google.com が呼ばれる
  2. ダイナミックリンクされている、libc.soのgetaddrinfo(“google.com”, “http”)が呼ばれる
  3. libresolv が呼ばれる
  4. libresolv が、/etc/nsswitch.confを読み込む(備考のように書かれていたとする)
  5. まずfiles、すなわち/etc/hostsで解決が試みられる
  6. 次にresolve、すなわちsystemd-resolvedで解決が試みられる。具体的には、ネットワークインターフェースごとにドメインが設定してあるので、そのドメインに該当した場合はそのインターフェースに設定されたDNSのIPアドレスにドメイン解決クエリを発行する。
  7. dns、すなわち/etc/resolv.confに記載されたDNSのIPアドレスにドメイン解決クエリを発行する。備考の場合、127.0.0.53である。
  • 備考1

/etc/nsswitch.conf

hosts:          files resolve dns
  • 備考2

全体的に未検証だが、systemd-resolvedにおいては、ネットワークインターフェースごとでなく、全体のフォールバックとしてのDNSサーバのIPアドレスを設定できる。そのため、resolveが設定されていれば、その後ろにdnsは置かなくてよいらしい。

  • 備考3

/etc/resolv.conf

nameserver 127.0.0.53