Какая IPv6 альтернатива socket.getfqdn в Python?

1

socket.getfqdn() отлично работает с IPv4-адресами, например:

>>> import socket
>>> socket.getfqdn("8.8.8.8")
'google-public-dns-a.google.com'

Однако он не работает для адресов IPv6.

>>> socket.getfqdn("2404:6800:8004::68")
'2404:6800:8004::68'
>>> socket.has_ipv6
True

Как я могу сделать это с помощью IPv6? В идеале с использованием только модулей в стандартной библиотеке.

  • 0
    Странный. Я посмотрел адрес с помощью стороннего инструмента, и он нашел имя хоста. Я думаю, может быть, это был анализ данных whois за кулисами или что-то в этом роде. Я не могу закрыть это как недействительное, поэтому я думаю, что это должно остаться открытым.
Теги:
dns
sockets
ipv6

2 ответа

3
Лучший ответ

Вы уверены, что у ipv6-адреса есть какой-либо обратный DNS, связанный с ним? dig сообщает, что нет:

$ dig -x 2404:6800:8004::68

; <<>> DiG 9.4.3-P5 <<>> -x 2404:6800:8004::68
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 35573
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;8.6.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.4.0.0.8.0.0.8.6.4.0.4.2.ip6.arpa. IN PTR

;; Query time: 364 msec
;; SERVER: 12.165.58.2#53(12.165.58.2)
;; WHEN: Thu Sep  2 03:45:50 2010
;; MSG SIZE  rcvd: 90

edit: Наконец-то найден адрес ipv6 с обратным DNS-соединением. Короче говоря, works4me.

>>> import socket
>>> socket.has_ipv6
True
>>> socket.getfqdn('2001:838:2:1::30:67')
'gatey.sixxs.net'

И от dig:

$ dig -x 2001:838:2:1::30:67

; <<>> DiG 9.4.3-P5 <<>> -x 2001:838:2:1::30:67
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 934
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 1

;; QUESTION SECTION:
;7.6.0.0.0.3.0.0.0.0.0.0.0.0.0.0.1.0.0.0.2.0.0.0.8.3.8.0.1.0.0.2.ip6.arpa. IN PTR

;; ANSWER SECTION:
7.6.0.0.0.3.0.0.0.0.0.0.0.0.0.0.1.0.0.0.2.0.0.0.8.3.8.0.1.0.0.2.ip6.arpa. 43200 IN PTR gatey.sixxs.net.

;; AUTHORITY SECTION:
.                       517204  IN      NS      e.root-servers.net.
.                       517204  IN      NS      m.root-servers.net.
.                       517204  IN      NS      a.root-servers.net.
.                       517204  IN      NS      l.root-servers.net.
.                       517204  IN      NS      c.root-servers.net.
.                       517204  IN      NS      h.root-servers.net.
.                       517204  IN      NS      j.root-servers.net.
.                       517204  IN      NS      g.root-servers.net.
.                       517204  IN      NS      f.root-servers.net.
.                       517204  IN      NS      i.root-servers.net.
.                       517204  IN      NS      d.root-servers.net.
.                       517204  IN      NS      b.root-servers.net.
.                       517204  IN      NS      k.root-servers.net.

;; ADDITIONAL SECTION:
a.root-servers.net.     604222  IN      A       198.41.0.4

;; Query time: 383 msec
;; SERVER: 12.165.58.2#53(12.165.58.2)
;; WHEN: Thu Sep  2 03:55:03 2010
;; MSG SIZE  rcvd: 343
1

Угадайте, что: этот адрес не имеет обратного DNS. Для более понятного вывода, чем dig:

$ host 2404:6800:8004::68
Host 8.6.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.4.0.0.8.0.0.8.6.4.0.4.2.ip6.arpa not found: 3(NXDOMAIN)

Вот пример адреса, который имеет обратный DNS:

$ host 2001:470:0:64::2
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.4.6.0.0.0.0.0.0.0.7.4.0.1.0.0.2.ip6.arpa domain name pointer ipv6.he.net.

И hey presto, он работает с вашим примером Python:

>>> import socket
>>> socket.getfqdn("2001:470:0:64::2")
'ipv6.he.net'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню