首页 > 解决方案 > 获取与 IP 关联的所有主机名

问题描述

我想检索与 IP 关联的所有主机名。

在 python 中使用requests模块时遇到错误。错误包含的数据我想要那个数据。

首先我得到了 youtube.com 的 IP 我想只使用 ip 地址获取网页所以使用 ping 我得到了youtube.com的 IP 地址

知识产权172.217.163.78

然后我提出了要求

import requests
session_ = requests.Session()
res_ = session_.get('https://172.217.163.78')

错误

\Python3.7.2\lib\site-packages\requests\adapters.py", line 514, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='172.217.163.78', port=443): 
Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError("hostname '172.217.163.78'
 doesn't match either of '*.google.com', '*.android.com',
 '*.appengine.google.com', '*.cloud.google.com', '*.g.co', '*.gcp.gvt2.com', '*.ggpht.cn', '*.google-analytics.com',
 '*.google.ca', '*.google.cl', '*.google.co.in', 
 '*.google.co.jp', '*.google.co.uk', '*.google.com.ar', 
 '*.google.com.au', '*.google.com.br', '*.google.com.co',
 '*.google.com.mx', '*.google.com.tr', '*.google.com.vn',
 '*.google.de', '*.google.es', '*.google.fr', '*.google.hu',
 '*.google.it', '*.google.nl', '*.google.pl', '*.google.pt',
 '*.googleadapis.com', '*.googleapis.cn', 
 '*.googlecommerce.com', '*.googlevideo.com', '*.gstatic.cn',
 '*.gstatic.com', '*.gstaticcnapps.cn', '*.gvt1.com', 
 '*.gvt2.com', '*.metric.gstatic.com', '*.urchin.com', 
 '*.url.google.com', '*.youtube-nocookie.com', 
 '*.youtube.com', '*.youtubeeducation.com', 
 '*.youtubekids.com', '*.yt.be', '*.ytimg.com', 
 'android.clients.google.com', 'android.com', 
 'developer.android.google.cn', 
 'developers.android.google.cn', 'g.co', 'ggpht.cn', 'goo.gl', 
 'google-analytics.com', 'google.com', 'googlecommerce.com'
 , 'source.android.google.cn', 'urchin.com', 'www.goo.gl',
 'youtu.be', 'youtube.com', 'youtubeeducation.com', 
 'youtubekids.com', 'yt.be'")))

有没有办法获取上述所有主机名,有没有办法解决我遇到的SSLError问题

标签: python-3.x

解决方案


这对你有用吗?

import requests
session_ = requests.Session()
res_ = session_.get('https://172.217.163.78', verify=False)
print (res_.url)

#Output
# http://www.google.com

您是否担心使用套接字而不是请求?

import socket
from pprint import pprint

ip_address = socket.gethostbyname('www.abc.com')
pprint (socket.gethostbyaddr(ip_address))

sys.exit(0)

输出

('www.pitchsharktank.com',
['250.132.181.199.in-addr.arpa',
'www.disneycampusrep.com',
'www.disneycollateral.com',
'www.disneyinternsinfo.com',
'www.missiontimekeeper.com',
'www.watchdisneyjunior.go.com',
'www.disneycastingscout.com',
'www.disneyimaginations.com',
'www.disneyprogramsblog.com',
'www.disneyvacationclub.disney.go.com',
'www.watchdisneychannel.go.com',
'www.wdwcollegeprogramecard.com',
'www.wdwcollegeprogramecard2.com',
'www.disneyinternationalepresentation.com',
 many many more here],
['199.181.132.250'])

更新

我花了半天多的时间研究主机名问题。我发现这个问题很复杂,尤其是对于分配给 Google 的 IP 地址。

例如:

ping www.youtube.com
PING youtube-ui.l.google.com (64.233.185.93): 56 data bytes
64 bytes from 64.233.185.93: icmp_seq=0 ttl=41 time=19.820 ms

#############################################################

nslookup www.youtube.com
www.youtube.com canonical name = youtube-ui.l.google.com.
Name:   youtube-ui.l.google.com
Address: 172.217.11.142
Name:   youtube-ui.l.google.com
Address: 64.233.176.190
Name:   youtube-ui.l.google.com
Address: 64.233.177.91
Name:   youtube-ui.l.google.com
Address: 64.233.177.93
Name:   youtube-ui.l.google.com
Address: 64.233.177.190
Name:   youtube-ui.l.google.com
Address: 64.233.185.91
Name:   youtube-ui.l.google.com
Address: 64.233.185.93
Name:   youtube-ui.l.google.com
Address: 64.233.185.136
Name:   youtube-ui.l.google.com
Address: 64.233.185.190
Name:   youtube-ui.l.google.com
Address: 74.125.138.190
Name:   youtube-ui.l.google.com
Address: 74.125.196.91
Name:   youtube-ui.l.google.com
Address: 108.177.122.91
Name:   youtube-ui.l.google.com
Address: 108.177.122.93
Name:   youtube-ui.l.google.com
Address: 108.177.122.136
Name:   youtube-ui.l.google.com
Address: 108.177.122.190
Name:   youtube-ui.l.google.com
Address: 172.217.0.78

#############################################################

dig www.youtube.com
;; QUESTION SECTION:
;www.youtube.com.       IN  A

;; ANSWER SECTION:
www.youtube.com.    9446    IN  CNAME   youtube-ui.l.google.com.
youtube-ui.l.google.com. 132    IN  A   64.233.185.190
youtube-ui.l.google.com. 132    IN  A   74.125.138.136
youtube-ui.l.google.com. 132    IN  A   74.125.138.190
youtube-ui.l.google.com. 132    IN  A   74.125.196.91
youtube-ui.l.google.com. 132    IN  A   74.125.196.93
youtube-ui.l.google.com. 132    IN  A   172.217.0.78
youtube-ui.l.google.com. 132    IN  A   172.217.0.142
youtube-ui.l.google.com. 132    IN  A   172.217.2.46
youtube-ui.l.google.com. 132    IN  A   172.217.4.14
youtube-ui.l.google.com. 132    IN  A   172.217.164.78
youtube-ui.l.google.com. 132    IN  A   173.194.219.136
youtube-ui.l.google.com. 132    IN  A   173.194.219.190
youtube-ui.l.google.com. 132    IN  A   64.233.177.91
youtube-ui.l.google.com. 132    IN  A   64.233.177.93
youtube-ui.l.google.com. 132    IN  A   64.233.177.136
youtube-ui.l.google.com. 132    IN  A   64.233.177.190

您在原始问题中提供的 IP 地址不会出现在 ping、nslookup 或 dig 结果中。

在 Apple Safari、Google Chrome 和 Mozilla Firefox 中,URL https://172.217.163.78返回https://www.google.com

Mozilla Firefox 中的 ShowIP 扩展显示https://www.youtube.com的 IP 地址是 2607:f8b0:4002:c00::88,这是一个 IPv6 地址。

我还发现了这个:

       FQDN:  youtube.com
Domain Name:  youtube.com
Name servers: ns1.google.com
              ns2.google.com
              ns3.google.com
              ns4.google.com
IP numbers:   2404:6800:4003:805::200e
              2404:6800:4004:801::200e
              2404:6800:4006:809::200e
              2607:f8b0:4004:802::200e
              2607:f8b0:4005:807::200e
              2607:f8b0:400a:804::200e
              2800:3f0:4001:80a::200e
              2a00:1450:4009:812::200e
              2a00:1450:400b:c01::be
              74.125.193.91
              74.125.193.93
              74.125.193.136
              74.125.193.190
              172.217.7.238
              172.217.24.78
              172.217.30.78
              216.58.195.78
              216.58.197.174
              216.58.203.110
              216.58.206.46
              216.58.217.46

LOOKUP 完全限定域名:

import socket

##############################################
# IP addresses linked to YouTube on 01-28-2019
##############################################
ip_addresses =['2404:6800:4003:805::200e',
               '2404:6800:4004:801::200e',
               '2404:6800:4006:809::200e',
               '2607:f8b0:4004:802::200e',
               '2607:f8b0:4005:807::200e',
               '2607:f8b0:400a:804::200e',
               '2800:3f0:4001:80a::200e',
               '2a00:1450:4009:812::200e',
               '2a00:1450:400b:c01::be',
               '74.125.193.91',
               '74.125.193.93',
               '74.125.193.136',
               '74.125.193.190',
               '172.217.7.238',
               '172.217.24.78',
               '172.217.30.78',
               '216.58.195.78',
               '216.58.197.174',
               '216.58.203.110',
               '216.58.206.46',
               '216.58.217.46']

for iP_address in ip_addresses:
  fully_qualified_domain_name = socket.getfqdn(str(iP_address))
  print (fully_qualified_domain_name)

# OUTPUT
sin10s06-in-x0e.1e100.net
nrt12s02-in-x0e.1e100.net
syd09s15-in-x0e.1e100.net
iad23s58-in-x0e.1e100.net
sfo07s16-in-x0e.1e100.net
sea15s08-in-x0e.1e100.net
2800:3f0:4001:80a::200e
lhr35s10-in-x0e.1e100.net
2a00:1450:400b:c01::be
ig-in-f91.1e100.net
ig-in-f93.1e100.net
ig-in-f136.1e100.net
ig-in-f190.1e100.net
iad23s58-in-f14.1e100.net
sin10s06-in-f14.1e100.net
gru06s34-in-f14.1e100.net
sfo07s16-in-f78.1e100.net
nrt12s02-in-f14.1e100.net
syd09s15-in-f14.1e100.net
lhr35s10-in-f14.1e100.net
sea15s08-in-f14.1e100.net

如您所见,这些 FQDN 中没有一个等于 youtube.com。

我还决定通过 ARIN 查找分配给 YouTube 的 IP 地址。下面的代码循环通过这些地址。

import socket
import ipaddress
from dns import reversename, resolver

# IPv4 addresses listed at whois.arin.net for YouTube
# 64.15.112.0/20 = number of hosts 4,096
# 104.237.160.0/19 = number of hosts 8,192
# 208.65.152.0/22 = number of hosts 1,024
# 208.117.224.0/19 = number of hosts 8,192
youtube_IPv4_addresses = ['64.15.112.0/20','104.237.160.0/19', '208.65.152.0/22', '208.117.224.0/19']

# IPv6 addresses listed at whois.arin.net for YouTube
# Start Range: 2620:11a:a000:0:0:0:0:0
# End Range: 2620:11a:a0ff:ffff:ffff:ffff:ffff:ffff
# No. of host: 309485009821345068724781056
youtube_IPv6_addresses = ['2620:11A:A000::/40']

#############################################
# This function is designed to query the IPv4
# address blocks assigned to YouTube for their
# corresponding PTR records, which are used
# for the Reverse DNS (Domain Name System)
#############################################
def get_ipv4_hostnames():
  for network in youtube_IPv4_addresses:
    ip_addresses = ipaddress.IPv4Network(network)
    for ip_address in ip_addresses:
      try:
        rev_name = reversename.from_address(str(ip_address))
        reversed_dns = str(resolver.query(rev_name,"PTR")[0])
        print (reversed_dns)
      except Exception as error:
        print ('The following error occurred: \n {}'.format(error))

#############################################
# WARNING  WARNING  WARNING  WARNING  WARNING
#############################################
#  There are 309485009821345068724781056
#  possible hosts within the IPv6 address
#  range assigned to YouTube at ARIN
#############################################
# WARNING  WARNING  WARNING  WARNING  WARNING
#############################################
#############################################
def get_ipv6_hostnames():
  for network in youtube_IPv6_addresses:
    ip_addresses = ipaddress.IPv6Network(network)
    for ip_address in ip_addresses:
      try:
         fully_qualified_domain_name = socket.getfqdn(str(ip_address))
         if fully_qualified_domain_name != str(ip_address):
          print (fully_qualified_domain_name)

      except Exception as error:
         print('The following error occurred: \n {}'.format(error))

推荐阅读