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. Я попытался добавить два разных суффикса идентификатора области к адресу. Вы можете использовать либо идентификатор интерфейса 3
или имя net1
как сфера в обоих 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
Добавление области действия привело к сбою Apache на более ранних этапах процесса запуска. journalctl -e
показывает синтаксическую ошибку при разборе httpd.conf следующим образом:
AH00526: Syntax error on line 52 of /etc/httpd/conf/httpd.conf:
Scope id is not supported
Apache listens on the localhost ipv6 if I do Listen [::1]:80
I would expect Listen 80
to get Apache to bind to both ipv4 and ipv6, but it doesn't. It only binds to ipv6 addresses - netstat shows:
tcp6 0 0 :::80 :::* LISTEN
In this case, Apache does accept requests on the link-local address on net1. Я должен уточнить 0.0.0.0:80
or a specific ipv4 address for it to listen on ipv4.
So, how do I make Apache bind to one specific link-local address (not all of them - I want to avoid listening on other interfaces), or is it just not possible for Apache to listen on a link-local ipv6 address?
1 ответ
Потратив некоторое время на это, кажется, что документация Apache может вводить в заблуждение, хотя я, возможно, что-то упустил. В нем говорится, что адреса IPv6 должны быть заключены в квадратные скобки. Это верно для не-локальных адресов. Но теперь я обнаружил, что адреса локальной ссылки могут использоваться и должны содержать идентификатор области видимости, но без квадратных скобок. Смотри ниже:
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 и имя интерфейса для идентификатора области с портом 443. Это просто для того, чтобы показать, что либо идентификатор интерфейса, либо имя можно успешно использовать в качестве идентификатор области
Результаты:
$ 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