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
Другие вопросы по тегам