web-dev-qa-db-ja.com

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 .....

Sshdとdnsmasqがリッスンしているため、IPv6が機能しています。アドレスに2つの異なるスコープIDサフィックスを追加してみました。 3sshdの両方のスコープIDとして、インターフェースID net1または名前ping6を使用できます。

$ 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

どちらかのスコープIDを追加すると、Apacheは起動プロセスの早い段階で失敗しました。 journalctl -eは、httpd.confを次のように解析するときに構文エラーを表示します。

AH00526:/etc/httpd/conf/httpd.confの52行目の構文エラー:
スコープIDはサポートされていません

Listen [::1]:80を実行すると、Apacheはlocalhost ipv6でリッスンします

Listen 80がApacheをipv4とipv6の両方にバインドすることを期待していますが、そうではありません。 ipv6アドレスにのみバインドします-netstatは以下を示します:

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

この場合、Apacheはnet1のリンクローカルアドレスの要求を受け入れます。 ipv4でリッスンするには、0.0.0.0:80または特定のipv4アドレスを指定する必要があります。

では、Apacheを1つの特定のリンクローカルアドレスにバインドする方法(すべてではない-他のインターフェイスでのリッスンを避けたい)、またはApacheがリンクローカルipv6アドレスでリッスンできないのはなぜですか?

7
bao7uo

これに少し時間をかけたので、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

ご覧のとおり、ポート80のスコープIDにはインターフェイス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
6
bao7uo