OS-X のローカルホストが奇妙に解決される

OS-X のローカルホストが奇妙に解決される

これから説明する問題は、Java ユニット テストを実行したときにのみ発生します。ただし、原因は Java ではなく OS-X の構成にあると確信しているため、StackOverflow ではなくスーパーユーザーに投稿します。

組み込みサーバーを起動し、 に対してリクエストを行う Java ユニット テストがありますhttp://localhost:9324。これらのテストは、Yosemite にアップグレードする前は合格していましたが、現在は失敗します。具体的な症状と試したこと:

AWDLインターフェースへの解決

netstat を見て、ポート 9324 にアクセスしているものが何なのか確認しました。次のことがわかりました。

localhost:platform oliver$ netstat -tn | grep 9324
tcp6       0      0  fe80::b8d2:8eff:.50602 fe80::b8d2:8eff:.9324  SYN_SENT   

何らかの理由で localhost が IPV6 アドレスに解決され、ifconfigそれが のアドレスであると表示されますawdl0。Google で少し検索すると、それが Apple がピアツーピア共有に使用するインターフェイスであることがわかります。、、nslookup localhostおよびdig localhostdscacheutil -q host -a name localhostすべて期待どおりに返されることに注意してください127.0.0.1。つまり、何らかの理由で Java コードが名前解決を別の方法で行っているか何かでしょうか (つまり、これは Java に関する質問かもしれません)???

外部アドレスへの解決

AWDL インターフェイスをオフにすると、sudo ifconfig awdl0 downコードのハングが停止し、netstat は基本的に正しい情報を報告するようになりました。

tcp4       0      0  192.168.0.124.52137    192.168.0.124.9324     SYN_SENT   
tcp4       0      0  127.0.0.1.9324         127.0.0.1.52135        ESTABLISHED
tcp4       0      0  127.0.0.1.52135        127.0.0.1.9324         ESTABLISHED

しかし、何らかの理由で、localhostアドレスを使用するローカルコードがヒットしていることに注意してください192.168.0.124外部のIP アドレスとそのコードはスタックされSYN_SENT、ハングして応答が得られなくなります。このテストではファイアウォールを完全に無効にしているため、これはファイアウォールの設定によるものではないことに注意してください。

接続拒否

外部アドレスの奇妙な使用にもかかわらず、ループバックを使用しているように見える正しい接続がありますが、ConnectionRefusedJava からエラーが発生します。ただし、curl http://localhost:9324正常に接続され、応答が返されます。

質問

かなり困惑しています。これは Java の問題かもしれませんが、OS-X のネットワーク設定が何らかの理由で壊れているのではないかと思います。

ああ、これが私の /etc/resolv.conf です:

#
# Mac OS X Notice
#
# This file is not used by the host name and address resolution
# or the DNS query routing mechanisms used by most processes on
# this Mac OS X system.
#
# This file is automatically generated.
#
nameserver 10.1.10.1
nameserver 2001:558:feed::1
nameserver 2001:558:feed::2

私の /private/etc/resolv.conf は同一です。

/etc/hosts は次のとおりです:

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1   localhost
255.255.255.255 broadcasthost
::1             localhost 
fe80::1%lo0     localhost

出力は次のようになりますifconfig -a:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 ::1 prefixlen 128 
    inet 127.0.0.1 netmask 0xff000000 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    nd6 options=1<PERFORMNUD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 3c:15:c2:da:29:0c 
    nd6 options=1<PERFORMNUD>
    media: autoselect (<unknown type>)
    status: inactive
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 72:00:04:0f:34:70 
    media: autoselect <full-duplex>
    status: inactive
en2: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 72:00:04:0f:34:71 
    media: autoselect <full-duplex>
    status: inactive
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
    ether 0e:15:c2:da:29:0c 
    media: autoselect
    status: inactive
awdl0: flags=8902<BROADCAST,PROMISC,SIMPLEX,MULTICAST> mtu 1452
    ether ba:d2:8e:05:03:6c 
    nd6 options=1<PERFORMNUD>
    media: autoselect
    status: inactive
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=63<RXCSUM,TXCSUM,TSO4,TSO6>
    ether 3e:15:c2:ad:9e:00 
    Configuration:
        id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
        maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
        root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
        ipfilter disabled flags 0x2
    member: en1 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 5 priority 0 path cost 0
    member: en2 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 6 priority 0 path cost 0
    nd6 options=1<PERFORMNUD>
    media: <unknown type>
    status: inactive
en5: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=23<RXCSUM,TXCSUM,TSO4>
    ether 00:24:9b:0f:3c:02 
    inet6 fe80::224:9bff:fe0f:3c02%en5 prefixlen 64 scopeid 0xc 
    inet 192.168.0.50 netmask 0xffffff00 broadcast 192.168.0.255
    inet6 2601:1c0:c901:980e:224:9bff:fe0f:3c02 prefixlen 64 autoconf 
    inet6 2601:1c0:c901:980e:4041:88e9:46e8:a893 prefixlen 64 autoconf temporary 
    nd6 options=1<PERFORMNUD>
    media: autoselect (1000baseT <full-duplex,flow-control,energy-efficient-ethernet>)
    status: active

答え1

IPv4 以降の世界へようこそ。nslookup や dig などのユーティリティを使用すると、デフォルトでは「A」レコードが返されます。ただし、最新の IPv6 対応オペレーティング システムとアプリケーションでは、通常、IPv4 リソースに頼る前に、まず「AAAA」レコードをチェックして、リソースが IPv6 経由で利用可能かどうかを確認します。

つまり、IPv4エントリとIPv6エントリの両方がローカルホストシステム上では、ほとんどの場合 IPv6 が優先されます。

では、これについて何ができるでしょうか?いくつかの選択肢があります。ローカルホストまたは IPv6 を完全に無効にすることもできますが、これは理想的な解決策とは言えず、事実上前進するのではなく「過去を振り返る」ことになります。

代わりに、サービスが IPv4 だけでなく IPv6 でも実行されるように構成されていることを確認する必要があります。また、サービスを許可するには、IPv6 ファイアウォール ルールにいくつかの調整を加える必要がある場合もあります。これにより、将来 IPv4 が主流のプロトコルとして IPv6 に取って代わったときに備えることができます。

答え2

キャッシュをリセットdiscoverydまたはフラッシュするか、mDNSResponder (Yosemite 以前の DNS リゾルバ) に戻してみてください。

キャッシュをフラッシュする方法は次のとおりですdiscoveryd

sudo ディスカバリーユーティリティ mdnsflushcache

mDNSResponder に戻す方法については、以下で説明します。

Ars Technica OS X 発見を元に戻す

関連情報