2012-11-28 57 views
1

我在辦公室設置中有最奇怪的行爲,我無法訪問開關設備。當啓用IPv6時,socket.gethostbyname()失敗,並且socket.getaddrinfo()僅在長達10秒的超時後才返回IPv6地址。如果我手動禁用IPv6並刷新租約,他們都開始工作。當啓用ipv6時,socket.gethostbyname失敗

最新OS X使用有線以太網的MBP Mountain Lion 10.8.2。我最近注意到你不能關閉IPv6,只是設置爲鏈接本地。您可以使用networksetup將其關閉,但只能在重新啓動之前持續使用。

有關如何跟蹤此問題的任何想法?我認爲問題在於開關,而不是我的機器,但不知道下一步要看哪裏。

我的v4 DHCP服務設置爲8.8.8.8/8.8.4.4。

(nimbis)[email protected]:django-nimbis$ sudo dscacheutil -flushcache 
(nimbis)[email protected]:django-nimbis$ host www.google.com 
www.google.com has address 74.125.131.99 
www.google.com has address 74.125.131.103 
www.google.com has address 74.125.131.104 
www.google.com has address 74.125.131.147 
www.google.com has address 74.125.131.106 
www.google.com has address 74.125.131.105 
www.google.com has IPv6 address 2607:f8b0:400c:c03::63 

這裏gethostbyname失敗,getaddrinfo在長時間超時後返回。

(nimbis)[email protected]:django-nimbis$ sudo dscacheutil -flushcache 
(nimbis)[email protected]:django-nimbis$ python 
Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import socket 
>>> socket.gethostbyname('www.google.com') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
socket.gaierror: [Errno 8] nodename nor servname provided, or not known 
>>> socket.getaddrinfo('www.google.com', 80) 
[(30, 2, 17, '', ('2607:f8b0:400c:c03::63', 80, 0, 0)), (30, 1, 6, '', ('2607:f8b0:400c:c03::63', 80, 0, 0)), (30, 2, 17, '', ('2607:f8b0:400c:c03::63', 80, 0, 0)), (30, 1, 6, '', ('2607:f8b0:400c:c03::63', 80, 0, 0)), (30, 2, 17, '', ('2607:f8b0:400c:c03::93', 80, 0, 0)), (30, 1, 6, '', ('2607:f8b0:400c:c03::93', 80, 0, 0))] 
>>> ^D 

Ping失敗。

(nimbis)[email protected]:django-nimbis$ host www.google.com 
www.google.com has address 173.194.75.103 
www.google.com has address 173.194.75.99 
www.google.com has address 173.194.75.104 
www.google.com has address 173.194.75.106 
www.google.com has address 173.194.75.105 
www.google.com has address 173.194.75.147 
www.google.com has IPv6 address 2607:f8b0:400c:c03::93 
(nimbis)[email protected]:django-nimbis$ ping www.google.com 
ping: cannot resolve www.google.com: Unknown host 

關閉IPV6:

(nimbis)[email protected]:django-nimbis$ sudo networksetup -setv6off Ethernet 
(nimbis)[email protected]:django-nimbis$ sudo dscacheutil -flushcache 
(nimbis)[email protected]:django-nimbis$ ping www.google.com 
ping: cannot resolve www.google.com: Unknown host 
(nimbis)[email protected]:django-nimbis$ host www.google.com 
www.google.com has address 173.194.75.103 
www.google.com has address 173.194.75.99 
www.google.com has address 173.194.75.104 
www.google.com has address 173.194.75.106 
www.google.com has address 173.194.75.105 
www.google.com has address 173.194.75.147 
www.google.com has IPv6 address 2607:f8b0:400c:c03::68 

強制DHCP租約續約,平的gethostbyname,所有的getaddrinfo做工精細。

(nimbis)[email protected]:django-nimbis$ ping www.google.com 
PING www.google.com (173.194.75.103): 56 data bytes 
64 bytes from 173.194.75.103: icmp_seq=0 ttl=46 time=25.218 ms 
64 bytes from 173.194.75.103: icmp_seq=1 ttl=46 time=23.944 ms 
64 bytes from 173.194.75.103: icmp_seq=2 ttl=46 time=24.213 ms 
64 bytes from 173.194.75.103: icmp_seq=3 ttl=46 time=78.480 ms 
64 bytes from 173.194.75.103: icmp_seq=4 ttl=46 time=24.502 ms 
^C 
--- www.google.com ping statistics --- 
5 packets transmitted, 5 packets received, 0.0% packet loss 
round-trip min/avg/max/stddev = 23.944/35.271/78.480/21.608 ms 
[email protected]:django-nimbis$ python 
Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import socket 
>>> socket.gethostbyname('www.google.com') 
'173.194.75.147' 
>>> socket.getaddrinfo('www.google.com', 80) 
[(2, 1, 6, '', ('74.125.131.106', 80)), (2, 1, 6, '', ('74.125.131.147', 80)), (2, 2, 17, '', ('74.125.131.106', 80)), (2, 2, 17, '', ('74.125.131.99', 80)), (2, 1, 6, '', ('74.125.131.99', 80)), (2, 2, 17, '', ('74.125.131.104', 80)), (2, 1, 6, '', ('74.125.131.104', 80)), (2, 2, 17, '', ('74.125.131.105', 80)), (2, 1, 6, '', ('74.125.131.105', 80)), (2, 2, 17, '', ('74.125.131.103', 80)), (2, 1, 6, '', ('74.125.131.103', 80)), (2, 2, 17, '', ('74.125.131.147', 80)), (30, 1, 6, '', ('2607:f8b0:400c:c03::93', 80, 0, 0)), (30, 2, 17, '', ('2607:f8b0:400c:c03::93', 80, 0, 0))] 

回答

0

你得到一個正確的IPv4地址和默認路由,如果你有啓用了IPv6?它聽起來像你有NAT64運行一些奇怪的設置。如果使用AI_ADDRCONFIG調用,getaddrinfo將不返回IPv4地址。

host實用程序不使用系統查找例程,而是使用自己的網絡代碼,因此dscacheutil -flushcache不會影響它。