0

我目前正在尝试设置必须使用 IPv6 的内部 Prometheus 监控系统。我的静态配置不起作用:

- targets: ['[fe80::3086:7bff:fed8:f402]:9100']

这失败并出现错误

获取http://[fe80::3086:7bff:fed8:f402]:9100/metrics : 拨号 tcp [fe80::3086:7bff:fed8:f402]:9100: connect: 无效参数


我尝试使用 CURL 来查看是否可以连接到运行 node-exporter 的远程服务器。

这没有用:curl -g -6 'http://[fe80::3086:7bff:fed8:f402]:9100/metrics'

但这确实有效:curl -g -6 'http://[fe80::3086:7bff:fed8:f402%ens17]:9100/metrics'

这表明我实际上能够连接到服务器,但必须将连接 IPv6 网络顶部的网络接口添加到 URL 中。老实说,我不知道为什么。

但是现在,同样的 URL 对 prometheus 不起作用,仍然有一个错误:

- targets: ['[fe80::3086:7bff:fed8:f402%ens17]:9100']

Get http://[fe80::3086:7bff:fed8:f402%25ens17]:9100/metrics: dial tcp [fe80::3086:7bff:fed8:f402%ens17]:9100: connect: invalid argument
4

1 回答 1

2

由于您使用的是 IPv6 链路本地寻址,因此您必须添加区域 ID(%ens17在您的情况下)以解释所指的接口。每个接口都将具有相同的 Link-Local 网络,因此您必须区分哪个接口,并且区域 ID 会为您做到这一点。

这在几个 RFC 中有详细说明。您至少应该熟悉RFC 2732, Format for Literal IPv6 Addresses in URL , RFC 4007, IPv6 Scoped Address ArchitectureRFC 6874, Representing IPv6 Zone Identifiers in Address Literals and Uniform Resource Identifiers


不幸的是,似乎并非所有东西都赶上了这一点,并且%经常将其用作转义字符。您真正应该做的是将 ULA 寻址 ( fc00::/7) 分配给您的主机。将该L位设置为 1 ( fd00::/8),然后选择一个随机的 40 位全局 ID ( fdxx:xxxx:xxxx:xxxx::/64),并根据您派生的前缀为您的主机分配地址。如果您有多个网络,您可以使用相同的方法为每个网络获取前缀,并且您可以在您自己的站点内路由 ULA 寻址(与 Link-Local 寻址不同)。

RFC 4193,唯一本地 IPv6 单播地址解释了 IPv6 ULA 寻址。

于 2019-08-19T13:30:58.997 回答