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サフィックスを追加してみました。 3
とsshd
の両方のスコープ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アドレスでリッスンできないのはなぜですか?
これに少し時間をかけたので、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