Назад | Перейти на главную страницу

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 как scopeid в обоих 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: синтаксическая ошибка в строке 52 файла /etc/httpd/conf/httpd.conf:
Идентификатор области не поддерживается

Apache слушает ipv6 localhost, если я 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 должны быть заключены в квадратные скобки. Это верно для адресов, не являющихся локальными для ссылки. Но теперь я обнаружил, что можно использовать локальные адреса ссылки, и они должны включать идентификатор области, но без квадратные скобки. Увидеть ниже:

Документация 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