Я бы хотел, чтобы 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
Listen [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:
Вы можете использовать идентификатор интерфейса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
Listen [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:
Вы можете использовать идентификатор интерфейса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
Listen [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:
fe89: 420f% net1Помня об этом, я попробовал следующее в httpd.conf
Listen [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:
fe89: 420f% net1Помня об этом, я попробовал следующее в httpd.conf
Listen [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 на локальном хосте, если я это делаю
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