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