Apache (Linux) httpd 监听链路本地 IPv6 地址

Apache (Linux) httpd 监听链路本地 IPv6 地址

我想要 Apache 在特定接口上监听本地链路 ipv6 地址。我的 httpd.conf 中有以下行:

Listen [fe80::a00:16ff:fe89:420f]:80

它基于此处的 Apache 文档:https://httpd.apache.org/docs/2.4/bind.html“IPv6 地址必须用方括号括起来”

我的操作系统/Apache 版本详细信息如下:

$ httpd -v
Server version: Apache/2.4.18 (Unix)
Server built:   Dec 14 2015 08:05:54
$ uname -rv
4.3.3-3-ARCH #1 SMP PREEMPT Wed Jan 20 08:12:23 CET 2016

使用显示的结果journalctl -e是:

(22)无效参数:AH00072:make_sock:无法绑定到地址 [fe80.....

IPv6 可以正常工作,因为我有 sshd 和 dnsmasq 在监听。我尝试在地址后附加两个不同的范围 ID 后缀。您可以在和中使用接口 ID3或名称net1作为范围 ID 。ping6sshd

$ ip addr | grep -Po "^\d: \S+"
1: lo:
2: net0:
3: net1:

$ for scopeid in 3 net1; do ping6 -c 1 fe80::a00:16ff:fe89:420f%$scopeid; done | grep loss
1 packets transmitted, 1 received, 0% packet loss, time 0ms
1 packets transmitted, 1 received, 0% packet loss, time 0ms

sshd_config 可以与以下任一方式配合使用:ListenAddress fe80::a00:16ff:fe89:420f%3

或者:ListenAddress fe80::a00:16ff:fe89:420f%net1

考虑到这一切,我在 httpd.conf 中尝试了以下内容

收听 [fe80::a00:16ff:fe89:420f%3]:80

Listen [fe80::a00:16ff:fe89:420f%net1]:80

添加任一 scopeid 都会导致 Apache 在启动过程中早期失败。journalctl -e解析 httpd.conf 时显示语法错误,如下所示:

AH00526:/etc/httpd/conf/httpd.conf 第 52 行语法错误:
不支持范围 ID

如果我这样做,Apache 会在本地主机 ipv6 上进行监听Listen [::1]:80

我期望Listen 80Apache 能够同时绑定到 ipv4 和 ipv6,但事实并非如此。它仅绑定到 ipv6 地址 - netstat 显示:

tcp6  0  0    :::80    :::*     LISTEN

在这种情况下,Apache 确实会接受 net1 上的链路本地地址上的请求。我必须指定0.0.0.0:80一个特定的 ipv4 地址,以便它在 ipv4 上进行监听。

那么,我该如何让 Apache 绑定到一个特定的链路本地地址(不是全部 - 我想避免监听其他接口),或者 Apache 是否不可能监听链路本地 ipv6 地址?

答案1

在花了一些时间研究这个问题后,我发现 Apache 文档可能会产生误导,尽管我可能错过了一些东西。它说 IPv6 地址必须用方括号括起来。这对于非链路本地地址来说也是如此。但我现在发现可以使用链路本地地址,并且必须包含范围 ID,但没有方括号内。如下所示:

Apache 文档:

$ wget -q -O- https://httpd.apache.org/docs/2.4/bind.html | grep -Pao "(?<=p.)IPv6[ a-z]+"
IPv6 addresses must be enclosed in square brackets

我的配置:

$ grep -R ^Listen /etc/httpd/conf/
/etc/httpd/conf/httpd.conf:Listen fe80::a00:16ff:fe89:420f%3:80
/etc/httpd/conf/extra/httpd-ssl.conf:Listen fe80::a00:16ff:fe89:420f%net1:443

如您所见,我已将接口 ID 用于端口为 80 的范围 ID,并将接口名称用于端口为 443 的范围 ID。这只是为了表明接口 ID 或名称都可以成功用作范围 ID。

结果:

$ sudo netstat -pant | grep -i httpd
tcp6   0    0 fe80::a00:16ff:fe89::80 :::*  LISTEN   709/httpd
tcp6   0    0 fe80::a00:16ff:fe89:443 :::*  LISTEN   709/httpd

相关内容