Apache (Linux) httpd ouça o endereço IPv6 do link-local

5

Eu gostaria que o Apache ouvisse o endereço ipv6 local do link em uma interface específica. Eu tenho a seguinte linha no meu httpd.conf:

Listen [fe80::a00:16ff:fe89:420f]:80

O que é baseado na documentação do Apache aqui: link "Os endereços IPv6 devem ser colocados entre colchetes "

Os detalhes da minha versão do sistema operacional / Apache são os seguintes:

$ 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

O resultado mostrado usando journalctl -e é:

(22)Invalid argument: AH00072: make_sock: could not bind to address [fe80.....

O IPv6 está funcionando porque tenho sshd e dnsmasq ouvindo. Eu tentei anexar dois sufixos de ID de escopo diferentes ao endereço. Você pode usar a ID de interface 3 ou o nome net1 como um escopo em ping6 e 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 funciona com: ListenAddress fe80::a00:16ff:fe89:420f%3

ou: ListenAddress fe80::a00:16ff:fe89:420f%net1

Então, com tudo isso em mente, tentei o seguinte no httpd.conf

Ouça [fe80 :: a00: 16ff: fe89: 420f% 3]: 80

e Listen [fe80::a00:16ff:fe89:420f%net1]:80

Adicionando o escopo do escopo, o Apache falha antes em seu processo de inicialização. journalctl -e mostra um erro de sintaxe ao analisar o httpd.conf da seguinte forma:

AH00526: Syntax error on line 52 of /etc/httpd/conf/httpd.conf:
Scope id is not supported

O Apache atende no localhost ipv6 se eu fizer Listen [::1]:80

Espero que Listen 80 consiga que o Apache se vincule ao ipv4 e ao ipv6, mas isso não acontece. Apenas liga-se a endereços ipv6 - o netstat mostra:

tcp6  0  0    :::80    :::*     LISTEN

Nesse caso, o Apache aceita solicitações no endereço local do link no net1. Eu tenho que especificar 0.0.0.0:80 ou um endereço ipv4 específico para ele escutar no ipv4.

Então, como eu faço o Apache se ligar a um endereço local de link específico (nem todos eles - eu quero evitar ouvir em outras interfaces), ou simplesmente não é possível para o Apache escutar em um link-local ipv6? endereço?

    
por bao7uo 22.01.2016 / 23:53

1 resposta

4

Tendo passado algum tempo com isso, parece que a documentação do Apache pode ser enganosa, embora eu possa ter perdido alguma coisa. Ele diz que os endereços IPv6 devem ser colocados entre colchetes. Isso é verdadeiro para endereços locais não vinculados. Mas agora descobri que os endereços locais de link podem ser usados e devem incluir um ID de escopo, mas sem os colchetes. Veja abaixo:

Documentação do 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

Minha configuração:

$ 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

Como você pode ver, usei o id da interface para o id do escopo com a porta 80 e o nome da interface para o id do escopo com a porta 443. Isso é apenas para mostrar que o ID ou nome da interface pode ser usado como o ID do escopo.

Resultados:

$ 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
    
por 23.01.2016 / 18:17