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

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-адрес?

6
задан 23 January 2016 в 02:59
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
5
ответ дан 3 December 2019 в 00:31

Теги

Похожие вопросы