悠悠楠杉
域名检测工具源码:区分解析异常与网站访问故障
域名有解析记录,网页仍然打不开
排查域名故障时,把“检测成功”定义为解析到了 IP,容易漏掉后续问题。DNS 只负责把域名转换为地址;浏览器访问网站,还要建立连接、完成 HTTPS 握手,并收到服务器响应。因此,域名检测工具至少要把解析结果和访问结果分开输出。
下面的源码使用 Python 标准库,无须安装依赖。输入的是域名,不是完整网址;程序会查询当前运行环境能解析到的地址,再请求该域名的 HTTPS 首页。它关闭了自动跳转,便于保留首次响应状态和 Location 地址。
分开记录 DNS 与 HTTPS 结果
将代码保存为 domain_check.py:
```python
import socket
import ssl
import sys
import urllib.error
import urllib.request
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, request, fp, code, msg, headers, newurl):
return None
def check(domain):
domain = domain.strip().rstrip(".")
try:
host = domain.encode("idna").decode("ascii")
labels = host.split(".")
if (
len(host) > 253
or len(labels) < 2
or any(
not label
or len(label) > 63
or label.startswith("-")
or label.endswith("-")
for label in labels
)
):
raise ValueError("域名格式不符合要求")
except (UnicodeError, ValueError) as exc:
print(f"输入错误:{exc}")
return
try:
records = socket.getaddrinfo(host, 443, type=socket.SOCK_STREAM)
addresses = sorted({item[4][0] for item in records})
print("DNS 地址:", ", ".join(addresses))
except socket.gaierror as exc:
print(f"DNS 解析失败:{exc}")
return
opener = urllib.request.build_opener(NoRedirect)
request = urllib.request.Request(
f"https://{host}/",
headers={"User-Agent": "DomainCheck/1.0"},
)
try:
with opener.open(request, timeout=5) as response:
print("HTTPS 状态:", response.status)
print("跳转地址:", response.headers.get("Location", "无"))
except urllib.error.HTTPError as exc:
print("HTTPS 状态:", exc.code)
print("跳转地址:", exc.headers.get("Location", "无"))
except urllib.error.URLError as exc:
print(f"HTTPS 访问失败:{exc.reason}")
except (TimeoutError, ssl.SSLError, OSError) as exc:
print(f"连接失败:{exc}")
if name == "main":
if len(sys.argv) != 2:
print("用法:python domain_check.py example.com")
sys.exit(1)
check(sys.argv[1])
```
运行 python domain_check.py example.com 即可查看输出。代码中的超时时间限制了单次访问的等待,但并不代表网站超过这个时间就属于故障;网络位置不同,结果也可能不同。
解析正常后,怎样看访问失败
假设某个域名在办公室打不开,运行工具后出现了 DNS 地址,但 HTTPS 报超时。此时已获得一条明确线索:当前运行环境完成了解析,连接或响应阶段仍未完成。维护人员可以从同一网络再访问一次,并核对服务器监听状态及防火墙记录,而不必立即修改域名解析。若另一网络能够访问,两处网络路径的差异也要保留下来。
输出 301 或 302 时,记录跳转地址,检查它指向的域名是否符合预期;输出 403 表示服务器已返回拒绝响应,不能写成“域名无法解析”。证书校验失败同样发生在解析之后,需核对证书覆盖的域名和有效期。这份脚本请求的是首页,首页正常也不能代替具体业务接口的检查。
代码适合本地排查。若要做成供他人输入域名的在线服务,不能直接把这份源码接到公开接口:请求可能触及内网地址,跳转和 DNS 结果也可能变化。上线前需限制实际连接的目标地址、控制请求次数,并记录异常请求;否则,先将工具留在受控环境中使用。

