Mac OS X Yosemite에서 로컬 호스트 이름 컬링

Mac OS X Yosemite에서 로컬 호스트 이름 컬링

방금 Mavericks에서 Yosemite로 업그레이드했는데 이제 curl루프백 호스트 이름을 볼 수 없습니다.

테스트할 간단한 http 서버를 설정하십시오.

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

이제 크롬에서 localhost:8000을 칠 수 있습니다. 나는 그것을 얻을 수도 있습니다. 하지만 컬에서는 이런 일이 발생합니다.

$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused

그러나 이것은 작동합니다:

$ curl 127.0.0.1:8000

나는 읽었다wget 프록시 설정에 대한 이 답변, 하지만 도움이 되지 않았습니다. 왜냐하면 이것이 작동하기 때문입니다:

$ wget --proxy=off localhost:8000

로컬에서 앱을 개발할 수 있도록 파일 에 몇 가지 다른 루프백 호스트 이름이 나열되어 있고 /etc/hosts컬을 사용하여 디버깅하는 데 익숙하기 때문에 이는 정말 실망스럽습니다.

나는 osx와 함께 제공되는 컬 버전을 사용해 보았습니다.

$ curl --version
curl 7.37.1 (x86_64-apple-darwin14.0) libcurl/7.37.1 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM NTLM_WB SSL libz

$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused

$ curl 127.0.0.1 # works

그리고 Brew를 사용하여 컬을 컴파일해 보았습니다.

$ /usr/local/Cellar/curl/7.38.0/bin/curl --version
curl 7.38.0 (x86_64-apple-darwin14.0.0) libcurl/7.38.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL libz

$ /usr/local/Cellar/curl/7.38.0/bin/curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused

$ /usr/local/Cellar/curl/7.38.0/bin/curl 127.0.0.1:8000 # works

답변1

/etc/hosts 파일에서 IPv6 루프백 라인 중 하나를 주석 처리하여 작동하게 했습니다.

#fe80::1%lo0    localhost

이제 localhost뿐만 아니라 모든 루프백 호스트 이름이 작동합니다. 이게 무슨 일인지 궁금해요?

답변2

대안(sudo 또는 수정이 필요하지 않음 /etc/hosts)- 컬이 더 똑똑해질 때까지 항상 ipv4를 사용하십시오.

$ echo '--ipv4' >> ~/.curlrc

(그러면 모든 것이 원하는 대로 작동할 것입니다)

답변3

우선 0.0.0.0"모든 IPv4 주소"를 의미하는 특수 주소입니다.

소켓은 IPv4 또는 IPv6 프로토콜에 바인딩될 수 있습니다. 소켓이 에 바인딩되어 있으면 0.0.0.0연결을 시도하는 모든 IPv4를 수신한다는 의미이며 다음과 같이 표시됩니다.

$ nc -l 0.0.0.0 8085
$ lsof -i4 -Pnl | grep 8085
  nc        23994 [xxx]    3u  IPv4 [xxx]      0t0  TCP *:8085 (LISTEN)

기호 는 IPv4의 기호 *와 동일합니다 0.0.0.0.

IPv6의 경우:

$ nc -l :: 8085
$ lsof -i6 -Pnl | grep 8085
  nc        24145 [xxx]    3u  IPv6 [xxx]      0t0  TCP *:8085 (LISTEN)

부호 는 IPv6 *과 동일합니다 .::공식 사양에 나온 대로.

그 이유는 에서 curl임의의 항목을 확인하려고 시도하고 @NickRetallack이 언급했듯이 해당 항목은 기본 모드(가장 먼저 확인되는 IPv6 또는 IPv4)에서 확인할 때 선택되는 항목이기 때문입니다.localhost/etc/hostscurllocalhost

--ipv4@CharlesHebdough가 제안한 대로 모드 로 강제 설정하면 curl해결 localhost됩니다 ( 에 127.0.0.1대한 다른 IPv4 항목이 없다고 가정 ).localhost/etc/hosts

각 구현은 localhost원하는 대로 해결되므로 다양한 도구를 사용하여 간헐적으로 성공할 수 있습니다.

가장 정확하게 하려면 127.0.0.1localhost 대신을 사용하십시오. 그러나 이렇게 하면 IPv4에 바인딩됩니다. localhost는 IPv6 및 IPv4 프로토콜 모두에서 작업할 수 있는 유연성을 제공하지만 일부 구현에서는 특정 버전의 curl.

관련 정보