可用于网络应用中执行非阻塞 DNS 查询或并行处理多个查询。它是现代 DNS 存根解析器库,抽象 DNS 协议细节,支持多操作系统,注重安全性与最新 RFC 标准,适合各类软件集成。【此简介由AI生成】
概览
c-ares 是一个用 C 语言编写的现代 DNS( stub )解析库。它提供了异步查询的接口,同时试图抽象底层 DNS 协议的复杂性。它最初是为了满足那些需要进行 DNS 查询而不阻塞的应用程序,或需要并行执行多个 DNS 查询的应用程序的需求。
c-ares 的一个目标是成为一个比您使用的任何系统提供的 DNS 解析器都更好的工具。我们建议在网络应用程序中使用 c-ares 库,即使异步解析的初始目标对您的应用程序不是必需的。
c-ares 可以在任何 C89 编译器上构建,并遵循 MIT 许可,这使得它既适合免费软件,也适合商业软件。c-ares 在 Linux、FreeBSD、OpenBSD、MacOS、Solaris、AIX、Windows、Android、iOS 以及许多其他操作系统上运行。
c-ares 对安全性有很高的关注,实现了整个代码中使用的安全解析器和数据构建器,从而避免了其他 C 库中常见的许多陷阱。通过使用我们的广泛测试框架进行自动测试,c-ares 常年由一系列静态和动态分析器进行验证,并且不断由 OSS Fuzz 进行模糊测试。
尽管 c-ares 已经存在超过 20 年,但它一直在积极维护,无论是关于最新的 DNS RFCs,还是更新以遵循最新的 C 编码标准。
代码
完整的源代码和修订历史可在我们的 GitHub 仓库 中找到。我们的签名版本可在 发布存档 中获取。
请查看 INSTALL.md 文件获取构建信息。
交流
问题 和 功能请求 应报告至我们的 GitHub Issues 页面。
关于 c-ares 及其使用的讨论,可在 GitHub Discussions 或 邮件列表 中进行。邮件列表存档 在此。 请勿私下向志愿者发送有关 c-ares 的邮件。
安全漏洞 将根据我们的 安全流程 处理,如果您怀疑存在漏洞,请发送邮件至 c-ares-security at haxx.se。
发布密钥
c-ares 发布者的主要 GPG 密钥(一些发布者使用子密钥签名):
- Daniel Stenberg <daniel@haxx.se>
27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2 - Brad House <brad@brad-house.com>
DA7D64E4C82C6294CB73A20E22E3D13B5411B7CA
要导入完整的受信任发布密钥集(包括可能用于签名发布的子密钥):
gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys 27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2 # Daniel Stenberg
gpg --keyserver hkps://keys.openpgp.org --recv-keys DA7D64E4C82C6294CB73A20E22E3D13B5411B7CA # Brad House
验证签名
对于每个版本 c-ares-X.Y.Z.tar.gz,都有一个相应的 c-ares-X.Y.Z.tar.gz.asc 文件,其中包含该版本的分离签名。
在获取所有可能有效的签名密钥并将其按照上一节指导加载到您的密钥库之后,您只需对下载的软件包和分离签名运行以下命令:
% gpg -v --verify c-ares-1.29.0.tar.gz.asc c-ares-1.29.0.tar.gz
gpg: enabled compatibility flags:
gpg: Signature made Fri May 24 02:50:38 2024 EDT
gpg: using RSA key 27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2
gpg: using pgp trust model
gpg: Good signature from "Daniel Stenberg <daniel@haxx.se>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 27ED EAF2 2F3A BCEB 50DB 9A12 5CC9 08FD B71E 12C2
gpg: binary signature, digest algorithm SHA512, key algorithm rsa2048
特性
支持的 RFC 和提案
- RFC1035。 初始/基础 DNS RFC
- RFC2671、 RFC6891。 EDNS0 选项(元-RR)
- RFC3596。
IPv6 地址。
AAAA记录。 - RFC2782。
服务器选择。
SRV记录。 - RFC3403。
命名权威指针。
NAPTR记录。 - RFC6698。
基于DNS的命名实体认证(DANE)传输层安全(TLS)协议。
TLSA记录。 - RFC9460。
通用服务绑定,适用于 HTTPS 的服务绑定类型。
SVCB和HTTPS记录。 - RFC7553。
统一资源标识符。
URI记录。 - RFC6844。
认证机构授权。
CAA记录。 - RFC2535、
RFC2931。
SIG0记录。仅有基本解析器,非完整实现。 - RFC7873、 RFC9018。 DNS Cookie 非路径 DNS 污染和放大缓解。
- draft-vixie-dnsext-dns0x20-00。 DNS 0x20 查询名称大小写随机化,以防止缓存投毒攻击。
- RFC7686。
拒绝查询
.onion域名,返回NXDOMAIN。 - RFC2606、
RFC6761。
对
localhost/.localhost的特殊处理。 - RFC2308、 RFC9520。 对 DNS 解析失败的消极缓存。
- RFC6724。
由
ares_getaddrinfo()使用的 IPv6 地址排序。 - RFC7413。 用于 0-RTT TCP 连接恢复的 TCP 快速打开(TFO)。