Apache-2.4

Apache (Linux) httpd 監聽連結本地 IPv6 地址

  • August 13, 2018

我希望 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 。ping6``sshd

$ 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 會在 localhost ipv6 上偵聽Listen [::1]:80

我希望Listen 80讓 Apache 綁定到 ipv4 和 ipv6,但事實並非如此。它只綁定到 ipv6 地址 - netstat 顯示:

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

在這種情況下,Apache 確實接受 net1 上鍊接本地地址上的請求。我必須指定0.0.0.0:80或特定的 ipv4 地址才能在 ipv4 上偵聽。

那麼,如何讓 Apache 綁定到一個特定的連結本地地址(不是全部 - 我想避免監聽其他介面),或者 Apache 是否無法監聽連結本地 ipv6 地址?

在這方面花了一些時間後,似乎 Apache 文件可能具有誤導性,儘管我可能遺漏了一些東西。它說 IPv6 地址必須用方括號括起來。這適用於非本地連結地址。但是我現在發現可以使用連結本地地址,並且必須包含範圍 ID,但沒有方括號。見下文:

阿帕奇文件:

$ 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 或名稱都可以成功用作範圍標識。

結果:

$ 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

引用自:https://serverfault.com/questions/751170