ãµãŒãã¹éã®ãããã¯ãŒã¯çžäºäœçšã®èšå®ã¯ç°¡åãªäœæ¥ã§ã¯ãªããå€ãã®å Žåãã·ã¹ãã ã®æ§ææ¹æ³ãšã©ã®èšå®ãäœã«åœ±é¿ããããæ·±ãçè§£ããã«è¡ãããŸãã Dockerã³ã³ããã®ãµãŒãã¹ãcentos 6ããcentos 7ã«ç§»è¡ããåŸãå¥åŠãªWebãµãŒããŒã®åäœã«ééããŸããã圌ã¯IPv6ãä»ããŠãµãŒãã¹ã«åå ããããšãããµãŒãã¹ã¯IPv4ã¢ãã¬ã¹ã®ã¿ããªãã¹ã³ããŸããã ãã®ç¶æ³ã§ã®æšæºçãªã¢ããã€ã¹ã¯ãIPv6ãµããŒããç¡å¹ã«ããããšã§ãã ããããããã¯å Žåã«ãã£ãŠã¯åœ¹ã«ç«ã¡ãŸããã ã©ãïŒ ãã®èšäºã§ã¯ãã¢ããªã±ãŒã·ã§ã³resolve
ã¢ãã¬ã¹ãresolve
ããæ¹æ³ãåéããŠè©³çްã«èª¬æããããšãç®æããŸããã
ãã®åºçç©ã¯ãåå¿è
ã®ç®¡çè
ããã³éçºè
ã«ãšã£ãŠæçšã§ãã
ãã®èšäºãèªãã åŸã次ã®ããšãåŠã³ãŸãã
- ãã¹ãåã解決ããããã®Linuxã¢ã«ãŽãªãºã ãšã¯äœã§ããïŒ
- ãã¹ãåãæ±ºå®ããããžãã¯ãåå®çŸ©ããæ¹æ³ã
- OSã䜿çšããæ©èœãšã©ã€ãã©ãªã
- æ§æäžã«ååšãããã©ãããšããããé²ãæ¹æ³ã
Linuxãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ã¯ããã¹ãåã§ã¢ãã¬ã¹ã決å®ããããã®ãœãŒã¹ãããã€ããããŸãã å®çŸ©ã«å¿
èŠãªãã¹ãŠã®æ©èœã¯GNU Cã©ã€ãã©ãªïŒglibcïŒã«ãããŸãã glibcã¯æ¬è³ªçã«ãã¬ãŒã ã¯ãŒã¯ã§ãããéçºè
ã«ãšã£ãŠäŸ¿å©ãªå€ãã®æ©èœãå®è£
ããéçºãç°¡çŽ åããç¬èªã®APIãæäŸããŸãã ãšããããglibcã¯POSIXãå®è£
ããŠããŸãã Glibcã¯ãLinuxã·ã¹ãã çšã®open
ã read
ã write
ã malloc
ã printf
ã getaddrinfo
ã dlopen
ã pthread_create
ã crypt
ã login
ã exit
ãªã©ã®æ©èœãæäŸããŸãã
å€ãã®äººã«ç¥ãããŠããhost
ã dig
ããã³nslookup
ãŠãŒãã£ãªãã£ã¯glibcã䜿çšããŸãããå¥ã
ã«æäŸãããŸãã
ãããŠãç§ã¯çµã³ã€ããããã° ãªãã§é»å ±ã«ã€ããŠã®é»å ±ãã£ã³ãã«ãè¡ã£ãŠããŸãã çµå¶äžã®åé¡ãšãã®è§£æ±ºæ¹æ³ã«ã€ããŠè©±ããã£ã³ãã«ã§ã¯ãããžãã¹äžã®åé¡ã解決ããéã®èãæ¹ã®ååã广çã§é«çµŠã®ã¹ãã·ã£ãªã¹ãã«ãªãæ¹æ³ã«ã€ããŠæžããŠããŸãã
éçºè
ãglibcããgetaddrinfo
ãã¡ããªãŒã®é¢æ°ãåŒã³åºããŠã¢ãã¬ã¹ã決å®ã§ããããã«ãªã£ãã®ã§ãæ»ãå€ãæ§æããå¿
èŠããããŸãã ããšãã°ã /etc/hosts
ã«äœ¿çšããããDNSãµãŒããŒãžã®ã¯ãšãªã䜿çšããã/etc/hosts
ã glibcã§ã¯ããã®æ§æã¯Name Service Switch ïŒNSSïŒãšåŒã°ããåè·¯ã䜿çšããŠè¡ãããŸãã
æã§èª¬æããå ŽåãNSSã䜿çšãããšãããŒã¿ããŒã¹ãšãããã®ããŒã¿ããŒã¹ã®æ€çŽ¢é åºãèšå®ããŠããµãŒãã¹ãæäŸã§ããŸãã ç§ãã¡ã®å ŽåããµãŒãã¹ã¯ãã¹ãåã«ããæ€çŽ¢ã§ãããããŒã¿ããŒã¹ã¯/etc/hosts
ãŸãã¯DNSãµãŒããŒã§ãã ããã¯ãNSSãä»ããŠèšå®ãããå¯äžã®ãµãŒãã¹ã§ã¯ãªããã¡ãŒã«ãšã€ãªã¢ã¹ãµãŒãã¹ããŠãŒã¶ãŒããã³ã°ã«ãŒãã®æ€çŽ¢ãµãŒãã¹ãæäŸãããŸãã ããã¥ã¢ã«ã®ãªã¹ããåç
§ããŠãã ããã
NSSã®ãããã§ãå®è¡æã«ã¢ããªã±ãŒã·ã§ã³ãåæ§ç¯ããããšãªããåè¿°ã®ããŒã¿ããŒã¹ãæ§æã§ããŸãã èšå®ã¯/etc/nsswitch.conf
ãã¡ã€ã«ã§/etc/nsswitch.conf
ããŸãã 以äžã¯ãCentos 7ã®æšæº/etc/nsswitch.conf
äŸã§ãã
$ grep ^hosts /etc/nsswitch.conf hosts: files dns myhostname
files ã dns ãããã³myhostnameã¯ãæ€çŽ¢ã®ããŒã¿ããŒã¹ãšã€ãªã¢ã¹ã§ãã ã»ãšãã©ã®ã·ã¹ãã äžã®ãã¡ã€ã«ã«ã¯/etc/hosts
䜿çšãå«ãŸãã dnsããŒã¹ã¯ãã¹ãåæ€çŽ¢ã¯ãšãªãå®è¡ãããDNSãµãŒããŒã§ããã myhostnameã¯æãçããããŒã¹ã§ããããã®ååšã¯ã»ãšãã©ç¥ãããŠããããglibcã®æšæºé
ä¿¡ã®äžéšã§ã¯ãããŸããã äžéšã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ã¯ã mdns4_minimalããŒã¿ããŒã¹ãååšããŸãã ãããã®ããŒã¿ããŒã¹ã®åæã以äžã«ç€ºããŸãã
ããŒã¿ããŒã¹ã¯/etc/nsswitch.conf
ã§å®£èšãããŠããé åºã§äœ¿çšãããã¬ã³ãŒããçŸåšã®ããŒã¿ããŒã¹ã§èŠã€ãã£ãå Žåããã§ãŒã³ã¯çµäºããçµæãè¿ãããŸãã çµæããªãå Žåããªã¹ãã®æ¬¡ã®ããŒã¹ã«ç§»åããŸãã ã©ã®ããŒã¿ããŒã¹ã«ãçµæãèŠã€ãããªãå Žåã¯ã getaddrinfo
颿°ã®glibcãªã¯ãšã¹ãã«ãã®ãããªçããgetaddrinfo
ãŸãã æ¬¡ã®ããŒã¿ããŒã¹ãžã®ç§»è¡ã®åäœãšãã®ãããªç§»è¡ã®æ¡ä»¶ã远å ã§æ§æã§ããŸããããšãã°ãDNSãå©çšã§ããªãå ŽåïŒã¬ã³ãŒãã®æ¬ åŠãšæ··åããªãããã«ïŒããã§ãŒã³ã宿ãããŸãã ãã®èšäºã§ /etc/nsswitch.conf
ã/ /etc/nsswitch.conf
æ¡ä»¶ãèšå®ããåçã®æç¢ºãã€ç°¡åãªèª¬æã瀺ããŸã ã
Centos 7ã®ããã©ã«ãã®ãã¡ã€ã«ããŒã¹ãç¹ã«/etc/hosts
ã¯æ¬¡ã®ããã«ãªããŸãã
$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
ããŒã«ã«ãã¹ãã«ã¯ã IPv4ã¢ãã¬ã¹ãšIPv6ã¢ãã¬ã¹ã®2ã€ã®ãšã³ããªãããããšã«æ³šæããŠãã ããã ããã¯ããªãã¯ã«ãªãå¯èœæ§ããããèšäºã®æåŸã§çç±ã説æããŸãã
ã¢ãã¬ã¹ã決å®ããéã dnsããŒã¹ã¯/etc/resolv.conf
æå®ãããããŒã ãµãŒããŒã䜿çšããŸãã ãã¹ãã·ã¹ãã äžã®/etc/resolv.conf
äŸã次ã«ç€ºããŸãã
$ cat /etc/resolv.conf # Generated by NetworkManager nameserver 127.0.0.1 nameserver 192.168.100.1
ããŒã ãµãŒããŒã¯ããã§ãŒã³å
ããã³å®£èšã®é åºã§ã䜿çšãããŸãã ç§ã®å Žåãæåã¯ããŒã«ã«DNSãµãŒããŒïŒç§ã¯dnsmasqã䜿çšïŒã§ãããŒã«ã«ã¢ãã¬ã¹.priv
ãŸãŒã³ãèšå®ããŸãã äžèŽãèŠã€ãã£ãå ŽåãããŒã«ã«ãããã¯ãŒã¯ããã¢ãã¬ã¹ãè¿ãããŸãã ä»ã®ãã¹ãŠã®ã¯ãšãªã¯ãã¢ãã¬ã¹192.168.100.1
ã¡ã€ã³DNSãµãŒããŒã«éä¿¡ãããŸãã
myhostnameããŒã¹ã¯ Centosããã³Ubuntuãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ååšããŸããã glibc
äžéšã§ã¯ãããŸããã ãã®äºå®ã«æ°ã¥ããã«ããã¹ããç¹å®ããããã«IPv6ã¢ãã¬ã¹ãè¿ãããçç±ãèŠã€ããããã«å€ãã®æéãè²»ãããŸããã æ¬¡ã®ããã«æ©èœããŸãã
- ããŒã«ã«ãã¹ãåïŒ
hostname
ã³ãã³ããè¿ããã®ïŒãèŠæ±ãããšããã©ã°ã€ã³ã¯ãããªãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®ãã¹ãŠã®IPã¢ãã¬ã¹ïŒã€ãŸããã«ãŒãããã¯ãé€ããã¹ãŠïŒ ::1
è¿ããŸãããã®ãããªã€ã³ã¿ãŒãã§ã€ã¹ããªãå ŽåãIPv4ã¢ãã¬ã¹127.0.0.2
ããã³IPv6ã¢ãã¬ã¹::1
è¿ãããŸãã - ãã¹ãåãèŠæ±ããããšã localhostãŸãã¯localhost.localdomainã¯IPv4ã¢ãã¬ã¹
127.0.0.1
ããã³IPv6ã¢ãã¬ã¹::1
è¿ããŸãã - .localhostãŸãã¯.localhost.localdomainã§çµãããã¹ãåãèŠæ±ãããšãIPv4ã¢ãã¬ã¹
127.0.0.1
ããã³IPv6ã¢ãã¬ã¹::1
ãè¿ãããŸãã
ããã¥ã¢ã«ã§ã¯ã圌ãã¯ãŸã _gateway hostnameã®åŠçã«é¢ããç¹å¥ãªããžãã¯ã«ã€ããŠæžããŠããŸãããæããã«ããã¯ããçš®ã®ãããã§ãã
Avahiãæ£ããæ©èœããã«ã¯ã mdns4_minimal baseãŸãã¯mdns_minimal baseãå¿
èŠã§ãã å¿
èŠã«å¿ããŠã Avahiã®Archããã¥ã¡ã³ããåç
§ã§ããŸããããã§ã¯ãç°¡æœãã€æç¢ºã«æ
å ±ãæäŸããŠããŸã
䜿çšäžã
äœæ¥ã®åºç€ãšååã«é¢ããæ
å ±ãæäŸãããã®ã§ãããŸããŸãªããŒã«ã®ã¢ãã¬ã¹ã®å®çŸ©ã®éãã«æ³šç®ãã䟡å€ããããå®è¡æã®åé¡ã«ã€ãªãããŸãã
éåžžã管çè
ã¯hostã³ãã³ãã䜿çšããŠãã¹ãåã確èªããŸãã ãã¹ãã¯ãdigã®ããã«DNS解決ã®ã¿ã䜿çšããNSSã¯äœ¿çšããªããããããã¯èª€ãã§ãã ããšãã°ãNginxã¯getaddrinfo颿°ã䜿çšããNSSã䜿çšããŸãã ããã«ããã /etc/hosts
ãã©ã€ãããããã¹ãåã¯nginxã§åäœ/etc/hosts
ããšãã§ã/etc/hosts
ããä»ã®æ¹æ³ã§ã¯è§£æ±ºãããŸããã ãã¹ãåã®IPv6ã¢ãã¬ã¹ã/etc/hosts
ã«éãããDNSèšå®ã§IPv4ã¢ãã¬ã¹ã®ã¿ãè¿ããããšãããã«æªåããŸãã ãã®å Žåã管çè
ã¯hostã³ãã³ããIPv4ã¢ãã¬ã¹ã®ã¿ãè¿ããèœã¡çãããšã確èªã§ããŸãããã®åŸãglibcã®getaddrinfo
ã䜿çšgetaddrinfo
ã¢ããªã±ãŒã·ã§ã³ãèµ·åããåããã¹ãåã®IPv4ããã³IPv6ã¢ãã¬ã¹ãèŠã€ããŸãã ãšã©ãŒã®åå ...
åããŒã¿ããŒã¹ããè¿ãããçµæã確èªããããã«ãããã¥ã¡ã³ãã§ã¯getentãŠãŒãã£ãªãã£ã®äœ¿çšãæšå¥šããŠããŸãã
以äžã¯ãIPv6ãæå¹ã«ããŠgetent
ã䜿çšããããã€ãã®äŸã§ãã
/etc/nsswitch.conf
ã¯ã次ã®ããŒã¿ããŒã¹ãã§ãŒã³ãå«ãŸããŠããŸãã
hosts: files dns myhostname
/etc/hosts
ã«ã¯æ¬¡ã®æ
å ±ãå«ãŸããŠããŸã
$ cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback
getent ahosts <hostname>
ã³ãã³ãã¯ãèŠã€ãã£ããã¹ãŠã®ã¢ãã¬ã¹ã®ãªã¹ãã衚瀺ããŸãã ãããã®èšå®ã«ããã以äžãåºåãããŸãã
$ getent ahosts localhost ::1 STREAM localhost ::1 DGRAM ::1 RAW 127.0.0.1 STREAM 127.0.0.1 DGRAM 127.0.0.1 RAW
ãã®ã³ãã³ãã䜿çšãããšãç¹å®ã®ããŒã¹ãç¹å®ããããŒã¹ã解決ãããã®ãèŠã€ããããšãã§ããŸãã åããŒã¿ããŒã¹ã®æ»ãå€ãèæ
®ããŠãã ããã
$ getent -s hosts:files ahosts localhost ::1 STREAM localhost ::1 DGRAM ::1 RAW 127.0.0.1 STREAM 127.0.0.1 DGRAM 127.0.0.1 RAW $ getent -s hosts:dns ahosts localhost ::1 STREAM localhost ::1 DGRAM ::1 RAW 127.0.0.1 STREAM 127.0.0.1 DGRAM 127.0.0.1 RAW $ getent -s hosts:myhostname ahosts localhost ::1 STREAM localhost ::1 DGRAM ::1 RAW 127.0.0.1 STREAM 127.0.0.1 DGRAM 127.0.0.1 RAW
/etc/hosts
ããlocalhostã®è¡ãåé€ãããšãåºåã倿ŽãããŸãã
$ getent -s hosts:files ahosts localhost $ getent -s hosts:dns ahosts localhost ::1 STREAM localhost ::1 DGRAM ::1 RAW 127.0.0.1 STREAM 127.0.0.1 DGRAM 127.0.0.1 RAW $ getent -s hosts:myhostname ahosts localhost ::1 STREAM localhost ::1 DGRAM ::1 RAW 127.0.0.1 STREAM 127.0.0.1 DGRAM 127.0.0.1 RAW
çŸåšã dnsããŒã¿ããŒã¹ãšmyhostnameã¯åçãè¿ãã ãã¡ã€ã«ããŒã¿ããŒã¹ã«ã¯ããŒã¿ãå«ãŸããŠããŸããã DNSã¯ãšãªã®å ŽåãããŒã ãµãŒããŒã¯ç§ã®ã³ã³ããã®/etc/resolv.conf
ã§èšå®ãããŸããäŸãã°
$ cat /etc/resolv.conf nameserver 127.0.0.11 options ndots:0
Dnsmasqã¯ãã¹ããã·ã³ã«ã€ã³ã¹ããŒã«ãããDNSãµãŒããŒã®å¿çããããã·ããã³ãã£ãã·ã¥ããŸãã DNSããã®å¿çã¯ãèŠæ±ãåä¿¡ããDNSãµãŒããŒã®èšå®ã«äŸåããŸãã RFC 1912ã§ã¯ã4.1ç¯ã§ãlocalhostã127.0.0.1ãæãããã«DNSãµãŒããŒãæ§æããããšãæšå¥šããŠããŸãã
ç¹å®ã®ãŸãŒã³ã¯ãããŒã ãµãŒããŒæ§æã«åžžã«ååšããå¿
èŠããããŸãã
primary localhost localhost primary 0.0.127.in-addr.arpa 127.0 primary 255.in-addr.arpa 255 primary 0.in-addr.arpa 0
ãããã¯ããç¹å¥ãã«ããŒã ãµãŒãã¹ãæäŸããããã«èšå®ãããŠããŸã
ãŸãã¯ããããŒããã£ã¹ããŸãã¯
ã«ãŒãããŒã ãµãŒããŒã«éä¿¡ãããããŒã«ã«ã¢ãã¬ã¹ã ãããã®ãã¹ãŠ
ãã¡ã€ã«ã«ã¯ãä»ã®ãŸãŒã³ãã¡ã€ã«ãšåæ§ã«NSããã³SOAã¬ã³ãŒããå«ãŸããŸã
ããªããç¶æããŸãããäŸå€ã¯ããããããªããSOAãäœãããšãã§ãããšããããšã§ã
ãã®ããŒã¿ã¯å€æŽãããªããããã¿ã€ããŒã¯éåžžã«é·ããªããŸãã
ãlocalhostãã¢ãã¬ã¹ã¯ãåžžã«åç
§ãããç¹å¥ãªãã¢ãã¬ã¹ã§ã
ããŒã«ã«ãã¹ãã æ¬¡ã®è¡ãå«ãŸããŠããå¿
èŠããããŸãã
localhost. IN A 127.0.0.1
ç§ã®å ŽåãRFCãæšå¥šããŠããããã«ãããã©ã«ãã®dnsmasqã«ã¯localhostã®ãšã³ããªãå«ãŸããŠããŸãã
$ dig +noall +answer localhost ANY @127.0.0.1 localhost. 0 IN A 127.0.0.1 localhost. 0 IN AAAA ::1
ããã¯ãDNSãµãŒããŒèªäœã®/etc/hosts
ãããšã³ããªãåé€ãããã /etc/hosts
/etc/dnsmasq.conf
no-hosts
ãªãã·ã§ã³ãno-hosts
ããšã«ãã/etc/dnsmasq.conf
ãŸãã
myhostnameããŒã¿ããŒã¹ã®getentãªãã·ã§ã³ãæå¹ã«ãããšã空ã§ãªãçµæãè¿ãããŸãããäžèšã®ããã«ã myhostnameãæå¹ã«ãªã£ãŠãããšãIPv4ããã³IPv6ã¢ãã¬ã¹ãè¿ãããŸãã éçIPã¢ãã¬ã¹ãæã€ã·ã¹ãã ã§ã¯ã myhostnameãã©ã°ã€ã³ãå®å
šã«ãªãã«ãã /etc/hosts
ã䜿çšããŠããŒã«ã«ãã¹ããæ§æã§ã/etc/hosts
ã å¥ã®æ¹æ³ã¯ãIPv6ãç¡å¹ã«ããããšã§ãã
ãµãŒããŒã®IPv6ã¹ããŒã¿ã¹ã¯ãã«ãŒãã«ãã©ã¡ãŒã¿ãŒããååŸã§ããŸãã IPv6ããªã³ã®å Žåã¯å€0ãè¿ããããªãã®å Žåã¯1ãè¿ãããŸãã
$ sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6 net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0
ifconfigåºåã§ã¯ãIPv6ãªã¹ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã«æååinet6ãå«ãŸããŠããŸãã 以äžã¯ãããããIPv6ããªãããã³ãªã³ã«ããå Žåã®åºåã®äŸã§ãã
# diabled $ ifconfig -a eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.101.5 netmask 255.255.255.0 broadcast 0.0.0.0 ether 02:42:c0:a8:65:05 txqueuelen 0 (Ethernet) RX packets 15789549 bytes 2553533549 (2.3 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 9783999 bytes 1318627420 (1.2 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1 (Local Loopback) RX packets 606047 bytes 67810892 (64.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 606047 bytes 67810892 (64.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # enabled $ ifconfig -a eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.101.5 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::42:c0ff:fea8:6505 prefixlen 64 scopeid 0x20<link> ether 02:42:c0:a8:65:05 txqueuelen 0 (Ethernet) RX packets 15787641 bytes 2553216408 (2.3 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 9782965 bytes 1318487919 (1.2 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1 (Local Loopback) RX packets 605949 bytes 67799887 (64.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 605949 bytes 67799887 (64.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ãåŒã³åºãããšã§IPv6ããªãã«ã§ããŸã
$ sysctl -w net.ipv6.conf.all.disable_ipv6=1 $ sysctl -w net.ipv6.conf.default.disable_ipv6=1
ã·ã£ããããŠã³åŸã«äœãå€ãããŸããïŒ ãã¹ãŠã®æ§æãæšæºã®æ§æã«ããŒã«ããã¯ããŸããã/etc/hostsã«ã¯IPv4ããã³IPv6ã¢ãã¬ã¹ãæã€localhostããããdnsmasqã§ã¯no-hosts
ãªãã·ã§ã³ããªãã«ãªã£ãŠããŸãã äžèšã®ã³ãã³ãã§IPv6ãç¡å¹ã«ãããšãgetentã®åºåã¯æ¬¡ã®ããã«ãªããŸãã
$ getent -s hosts:files ahosts localhost 127.0.0.1 STREAM localhost 127.0.0.1 DGRAM 127.0.0.1 RAW 127.0.0.1 STREAM 127.0.0.1 DGRAM 127.0.0.1 RAW $ getent -s hosts:dns ahosts localhost 127.0.0.1 STREAM localhost 127.0.0.1 DGRAM 127.0.0.1 RAW $ getent -s hosts:myhostname ahosts localhost 127.0.0.1 STREAM localhost 127.0.0.1 DGRAM 127.0.0.1 RAW
ãããŒãæåã®åºåã§ã¢ãã¬ã¹127.0.0.1ãè€è£œããŸããã ãããèµ·ããçç±ãçè§£ããã«ã¯ãglibcã®ãœãŒã¹ã³ãŒããšgetentãŠãŒãã£ãªãã£ã®ã³ãŒããåç
§ããå¿
èŠããããŸãã 以äžã¯ãgetentãŠãŒãã£ãªãã£ã³ãŒãã®äžéšã§ãã
/* This is for hosts, but using getaddrinfo */ static int ahosts_keys_int (int af, int xflags, int number, char *key[]) { // ... hint.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME | idn_flags | xflags); hint.ai_family = af; for (i = 0; i < number; ++i) { struct addrinfo *res; if (getaddrinfo (key[i], NULL, &hint, &res) != 0) result = 2; else { struct addrinfo *runp = res; while (runp != NULL) { // printf goes here } freeaddrinfo (res); } } return result;
ããŒã¿ããŒã¹ã®ããŒãªã³ã°ã®çµæãšããŠIPv6ã¢ãã¬ã¹ãèŠã€ãããªãã£ãå Žåã getaddrinfo颿°ã®AI_V4MAPPEDãã©ã°ã¯IPv6ã¢ãã¬ã¹ãIPv4ã«ãããããŸãã AI_ADDRCONFIGãã©ã°ã¯ãã·ã¹ãã ã§æ§æãããIPv6 / IPv4ã¢ãã¬ã¹ã®å¯çšæ§ãgetaddrinfoã«åŒ·å¶çã«ç¢ºèªãããå°ãªããšã1ã€ã®IPv6 / IPv4ã¢ãã¬ã¹ãæ¬ èœããŠããå Žåãã©ã®ç¹å®ã®ããŒã¿ããŒã¹ãå¿çãããã«é¢ä¿ãªããIPv6 / IPv4ã¯è¿ãããŸããã
getentã¯äž¡æ¹ã®ãã©ã°ãæå¹ã«ããŠããã /etc/hosts
localhostã¢ãã¬ã¹ã¯127.0.0.1
ããã³::1
ã§ãããããgetaddrinfoã¯NSSããŒã¿ããŒã¹ïŒäžèšã®äŸã§ã¯ãã®ããŒã¿ããŒã¹ã«ã€ããŠèª¬æããŸããïŒã 127.0.0.1
ããã³::1
ãããã¹ããååŸããŸã ::1
ãã·ã¹ãã å
ã®IPv6ã¢ãã¬ã¹ãæ€åºããïŒã«ãŒãã«ãã©ã¡ãŒã¿ãŒã«ãã£ãŠç¡å¹åïŒããããã³ã°::1
> 127.0.0.1
ãã®æŠå¿µãããããçè§£ããããã«ã ai_flagsãšai_familyã®èšå®ãå€ããŠãåãã·ã¹ãã ã§getaddrinfoãåºåããäŸã瀺ããŸãã /etc/hosts
ãlocalhostã®IPv4ããã³IPv6ã¢ãã¬ã¹ãå«ãŸããŠããŸãã
ãœãŒã¹ã³ãŒãã¯ç§ã®githubã«ãããŸãã
# ./getaddrinfo localhost IP addresses for localhost: [AF_INET] AI_V4MAPPED IPv4: 127.0.0.1 IPv4: 127.0.0.1 [AF_INET] AI_V4MAPPED AI_ALL IPv4: 127.0.0.1 IPv4: 127.0.0.1 [AF_INET] AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1 [AF_INET] AI_V4MAPPED AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1 [AF_INET] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1 -------------- [AF_INET6] AI_V4MAPPED IPv6: ::1 [AF_INET6] AI_V4MAPPED AI_ALL IPv6: ::ffff:127.0.0.1 IPv6: ::ffff:127.0.0.1 IPv6: ::1 [AF_INET6] AI_ADDRCONFIG getaddrinfo: Name or service not known [AF_INET6] AI_V4MAPPED AI_ADDRCONFIG getaddrinfo: Name or service not known [AF_INET6] AI_V4MAPPED AI_ALL AI_ADDRCONFIG getaddrinfo: Name or service not known -------------- [AF_UNSPEC] AI_V4MAPPED IPv4: 127.0.0.1 IPv6: ::1 [AF_UNSPEC] AI_V4MAPPED AI_ALL IPv4: 127.0.0.1 IPv6: ::1 [AF_UNSPEC] AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1 [AF_UNSPEC] AI_V4MAPPED AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1 [AF_UNSPEC] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 127.0.0.1 IPv4: 127.0.0.1 --------------
åºåã¯ã_ai ãã¡ããªãŒã_AI UNSPEC ïŒIPv4ãšIPv6ã®äž¡æ¹ãè¿ãïŒã«çãããAI_ADDRCONFIGãã©ã°ããªãå Žåã getaddrinfo
ã2ã€ã®ã¢ãã¬ã¹ãIPv4ãšIPv6ãè¿ãããšã瀺ããŠããŸãã ããã¯ãã«ãŒãã«èšå®ã§IPv6ããªãã«ãªã£ãŠãããã©ããã«é¢ä¿ãªãèµ·ãããŸãã /etc/hosts
ã®ã¢ãã¬ã¹::1
ãåé€ãããšãIPv6ã¢ãã¬ã¹ãgetaddrinfo
åºåããå®å
šã«æ¶ããŸãïŒ AF_UNSPEC
ãã©ã°ä»ãïŒã
IPv6ãæå¹ã§ã /etc/hosts
ã«::1
ãååšããå ŽåãIPv4ãšIPv6ãè¿ãããŸãã IPv6ã¢ãã¬ã¹ãè¿ãããªãããã«ããã«ã¯ã /etc/hosts
IPv6ã¢ãã¬ã¹ãã³ã¡ã³ãåã/etc/hosts
ã ã¢ãã¬ã¹ã/etc/hosts
ã§èŠã€ãã£ãå ŽåãglibcããŒã¿ããŒã¹ã¯dnsãšmyhostnameã§ã¯ããŒã«ããŸããã
dnsããŒã¿ããŒã¹ã«å¯Ÿããgetaddrinfo
åäœã確èªããããšã¯æ®ã£ãŠããŸãã ãããè¡ãã«ã¯ã ãã¹ãçšã«/etc/nsswitch.conf
dnsããŒã¿ããŒã¹ã®ã¿ãæ®ããgoogle.comã解決ããŸã ã 以äžã®åºåã¯ãIPv6ãæå¹ã«ãªã£ãŠããå Žåã§ãã
$ sysctl -w net.ipv6.conf.default.disable_ipv6=0 $ sysctl -w net.ipv6.conf.all.disable_ipv6=0 $ ./getaddrinfo google.com IP addresses for google.com: [AF_INET] AI_V4MAPPED IPv4: 216.58.215.78 [AF_INET] AI_V4MAPPED AI_ALL IPv4: 216.58.215.78 [AF_INET] AI_ADDRCONFIG IPv4: 216.58.215.78 [AF_INET] AI_V4MAPPED AI_ADDRCONFIG IPv4: 216.58.215.78 [AF_INET] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 216.58.215.78 -------------- [AF_INET6] AI_V4MAPPED IPv6: 2a00:1450:401b:806::200e [AF_INET6] AI_V4MAPPED AI_ALL IPv6: ::ffff:216.58.215.78 IPv6: 2a00:1450:401b:806::200e [AF_INET6] AI_ADDRCONFIG IPv6: 2a00:1450:401b:806::200e [AF_INET6] AI_V4MAPPED AI_ADDRCONFIG IPv6: 2a00:1450:401b:806::200e [AF_INET6] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv6: ::ffff:216.58.215.78 IPv6: 2a00:1450:401b:806::200e -------------- [AF_UNSPEC] AI_V4MAPPED IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e [AF_UNSPEC] AI_V4MAPPED AI_ALL IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e [AF_UNSPEC] AI_ADDRCONFIG IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e [AF_UNSPEC] AI_V4MAPPED AI_ADDRCONFIG IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e [AF_UNSPEC] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e --------------
次ã«ãIPv6ããªãã«ããå Žåã®åºåã瀺ããŸãã
$ sysctl -w net.ipv6.conf.all.disable_ipv6=1 $ sysctl -w net.ipv6.conf.default.disable_ipv6=1 $ ./getaddrinfo google.com IP addresses for google.com: [AF_INET] AI_V4MAPPED IPv4: 216.58.215.78 [AF_INET] AI_V4MAPPED AI_ALL IPv4: 216.58.215.78 [AF_INET] AI_ADDRCONFIG IPv4: 216.58.215.78 [AF_INET] AI_V4MAPPED AI_ADDRCONFIG IPv4: 216.58.215.78 [AF_INET] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 216.58.215.78 -------------- [AF_INET6] AI_V4MAPPED IPv6: 2a00:1450:401b:806::200e [AF_INET6] AI_V4MAPPED AI_ALL IPv6: ::ffff:216.58.215.78 IPv6: 2a00:1450:401b:806::200e [AF_INET6] AI_ADDRCONFIG getaddrinfo: Name or service not known [AF_INET6] AI_V4MAPPED AI_ADDRCONFIG getaddrinfo: Name or service not known [AF_INET6] AI_V4MAPPED AI_ALL AI_ADDRCONFIG getaddrinfo: Name or service not known -------------- [AF_UNSPEC] AI_V4MAPPED IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e [AF_UNSPEC] AI_V4MAPPED AI_ALL IPv4: 216.58.215.78 IPv6: 2a00:1450:401b:806::200e [AF_UNSPEC] AI_ADDRCONFIG IPv4: 216.58.215.78 [AF_UNSPEC] AI_V4MAPPED AI_ADDRCONFIG IPv4: 216.58.215.78 [AF_UNSPEC] AI_V4MAPPED AI_ALL AI_ADDRCONFIG IPv4: 216.58.215.78 --------------
ã芧ã®ãšãããAI_ADDRCONFIGã®ç¶æ³ã¯éåžžã«äŒŒãŠããŸãã
çµè«ãšããŠãåé¡ã«çªå
¥ããããã«ãäžèšã®ãã¹ãŠãèæ
®ã«å
¥ããªãæ¹æ³ã®äŸã瀺ããŸãã IPv6ãæå¹ã§ã/ /etc/nsswitch.conf
æšæºã§ãã
$ cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback $ grep hosts /etc/nsswitch.conf hosts: files dns myhostname $ cat /etc/resolv.conf nameserver 127.0.0.11 options ndots:0 $ sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6 net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0
host localhost
ãè¿ããã®ããŸãã¯host localhost
dig ANY localhost
ãã®ã¯äœã§ããïŒ ããšãã°ãnginxã®ãããªãã©ã°ãããå Žåã getaddrinfo
äœãè¿ããŸããïŒ
$ dig +noall +answer ANY localhost @127.0.0.11 localhost. 0 IN A 127.0.0.1 $ host localhost localhost has address 127.0.0.1 $ ./getaddrinfo localhost IP addresses for localhost: [AF_UNSPEC] AI_ADDRCONFIG IPv6: ::1 IPv4: 127.0.0.1
nginxã¯ã 127.0.0.1
ãš::1
2ã€ã®ã¢ãã¬ã¹ãžã®æ¥ç¶ã詊ã¿ãŸãããã¢ããªã±ãŒã·ã§ã³ã¯ãããäºæããªãå ŽåããããŸãã ãšã©ãŒã®ãœãŒã¹ã
æžããããã¹ãŠã®ãã®ããã©ããªçµè«ãåŒãåºãããšãã§ããŸããïŒ
- ãããã¯ãŒã¯ã§åäœããã¢ããªã±ãŒã·ã§ã³ãéçºããŠããå ŽåãIPv6ãç¡å¹ã«ã§ããããšã«æ³šæããŠãã ããã
- ãµãŒããŒãã»ããã¢ãããããšãã¯ãNSSã®ååšãšãã§ãã¯ã®ã·ãŒã±ã³ã¹ãèæ
®ããgetentãŸãã¯ç§ã®ã³ãŒãã䜿çšããŠãã§ãã¯ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®åäœãããããªãå ŽåããœãŒã¹ã³ãŒããããå Žåã¯ãã©ã®ãã©ã°ã解決ãããŠãããã確èªã§ããŸã
ã¢ãã¬ã¹ãšã·ã¹ãã èšå®ã®ç¢ºèª; - ãœãŒã¹ã³ãŒãããªãå Žåã¯ãstraceåºåã®åäœã§äœ¿çšããããã©ã°ã«ã€ããŠæšæž¬ã§ããŸãã
PSç§ã®ãã£ã³ãã«ã賌èªããŠãã ããã ITããžãã¹ã®åºæ¬çãªåé¡ãšãã®è§£æ±ºæ¹æ³ãæé²ã®èŠæ±ããããŒãžã£ãŒãŸãã¯ããªãèªèº«ã®ããžãã¹ãšããŠã®ãã£ãªã¢ã®æ§ç¯ã«ã€ããŠã話ããŸãã