LinuxでIPアドレスを解決する盎感的で詳现な説明

サヌビス間のネットワヌク盞互䜜甚の蚭定は簡単な䜜業ではなく、倚くの堎合、システムの構成方法ずどの蚭定が䜕に圱響するかを深く理解せずに行われたす。 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アドレスが返される理由を芋぀けるために倚くの時間を費やしたした。 次のように機胜したす。



マニュアルでは、圌らはただ_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぀のアドレスぞの接続を詊みたすが、アプリケヌションはこれを予期しない堎合がありたす。 ゚ラヌの゜ヌス。



曞かれたすべおのものからどんな結論を匕き出すこずができたすか


  1. ネットワヌクで動䜜するアプリケヌションを開発しおいる堎合、IPv6を無効にできるこずに泚意しおください。
  2. サヌバヌをセットアップするずきは、NSSの存圚ずチェックのシヌケンスを考慮し、getentたたは私のコヌドを䜿甚しおチェックしたす。
  3. アプリケヌションの動䜜がわからない堎合、゜ヌスコヌドがある堎合は、どのフラグが解決されおいるかを確認できたす
    アドレスずシステム蚭定の確認;
  4. ゜ヌスコヌドがない堎合は、strace出力の動䜜で䜿甚されるフラグに぀いお掚枬できたす。

PS私のチャンネルを賌読しおください。 ITビゞネスの基本的な問題ずその解決方法、昇進の芁求、マネヌゞャヌたたはあなた自身のビゞネスずしおのキャリアの構築に぀いおお話したす。

Source: https://habr.com/ru/post/J352300/


All Articles