Я хотел бы, чтобы 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