
설명하려는 문제는 일부 Java 단위 테스트를 실행할 때만 나타납니다. 하지만 원인은 Java가 아닌 OS-X 구성이라고 확신하므로 StackOverflow가 아닌 슈퍼유저에게 게시합니다.
임베디드 서버를 시작한 다음 에 요청하는 Java 단위 테스트가 있습니다 http://localhost:9324
. 요세미티로 업그레이드하기 전에는 이 테스트를 통과했지만 지금은 실패합니다. 내가 시도한 특정 증상 및 사항:
AWDL 인터페이스로 해결
나는 무엇이 포트 9324에 도달했는지 알아보기 위해 netstat를 살펴보았습니다. 이것을 발견했습니다:
localhost:platform oliver$ netstat -tn | grep 9324
tcp6 0 0 fe80::b8d2:8eff:.50602 fe80::b8d2:8eff:.9324 SYN_SENT
그래서 어떤 이유로 localhost가 IPV6 주소로 확인되었고 ifconfig
그것이 awdl0
. 약간의 인터넷 검색을 통해 이것이 Apple이 P2P 공유에 사용하는 인터페이스임을 보여줍니다. nslookup localhost
및 dig localhost
모두 예상 대로 dscacheutil -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
응답을 받지 못할 것입니다. 이 테스트를 위해 방화벽을 완전히 비활성화했기 때문에 이는 방화벽 설정 때문이 아닙니다.
연결이 거부됨
외부 주소를 이상하게 사용했음에도 불구하고 루프백을 사용하는 것처럼 보이는 올바른 연결이 있지만 ConnectionRefused
Java에서 오류가 발생합니다. 그러나 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 항목을 제거할 수 있습니다.로컬호스트또는 IPv6를 완전히 비활성화합니다. 그러나 이는 이상적인 솔루션이 아니며 사실상 앞으로 나아가는 것이 아니라 "뒤를 바라보는" 것입니다.
대신, 서비스가 IPv4 외에 IPv6에서도 실행되도록 구성되어 있는지 확인해야 합니다. 서비스를 허용하려면 IPv6 방화벽 규칙을 일부 조정해야 할 수도 있습니다. 이를 통해 IPv6가 IPv4를 주류 프로토콜로 대체할 미래를 준비할 수 있습니다.
답변2
캐시를 재설정 discoveryd
또는 플러시하거나 mDNSResponder(Yosemite 이전 DNS 확인자)로 되돌려보세요.
캐시 를 플러시하는 방법은 다음과 같습니다 discoveryd
.
sudo discoveryutil mdnsflushcache
mDNSResponder로 되돌리는 방법은 다음과 같습니다.