サービス間のネットワーク相互作用の設定は簡単な作業ではなく、多くの場合、システムの構成方法とどの設定が何に影響するかを深く理解せずに行われます。 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ビジネスの基本的な問題とその解決方法、昇進の要求、マネージャーまたはあなた自身のビジネスとしてのキャリアの構築についてお話します。