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
      
      





filesdns 、および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が必要です。 必要に応じて、 AvahiArchドキュメントを参照できます。ここでは、簡潔かつ明確に情報を提供しています

使用中。







作業の基礎と原則に関する情報が提供されたので、さまざまなツールのアドレスの定義の違いに注目する価値があり、実行時の問題につながります。







通常、管理者は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_flagsai_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ビジネスの基本的な問題とその解決方法、昇進の要求、マネージャーまたはあなた自身のビジネスとしてのキャリアの構築についてお話します。








All Articles