Apache - ouça apenas em domínios específicos, não IP

9

Como posso configurar o apache para que ele recuse as conexões que chegam diretamente ao endereço IP ( http://xxx.xxx.xxx.xxx ) em vez do nome do vhost http://example.com ?

Minha configuração do VirtualHost:

ServerName example.com

<VirtualHost *:80>

        ServerName example.com

        DocumentRoot /var/www/           
        <Directory /var/www/>                    
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

</VirtualHost>
Alex
fonte

Respostas:

25

Você não pode recusar conexões, pois o nome do host (ou IP) que o usuário está tentando usar como host HTTP não é conhecido pelo servidor até que o cliente realmente envie uma solicitação HTTP. O ouvinte TCP está sempre vinculado ao endereço IP.

Uma resposta de erro HTTP seria aceitável?

<VirtualHost *:80>
    ServerName catchall
    <Location />
        Order allow,deny
        Deny from all
    </Location>
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/
    <Directory /var/www/>
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>
Shane Madden
fonte
Bem, o thin traz um 403 Proibido para solicitações que não são do domínio, o que não é ruim na minha situação. No entanto, quero que o servidor seja "inexistente" para essas solicitações. Tenho certeza que isso pode ser feito de alguma forma, talvez não com apache, mas no nível do sistema?
22414 Alex
3
@ Alex Não, é completamente impossível. A conexão TCP deve ser estabelecida e o cliente deve enviar sua solicitação HTTP (ou seu cabeçalho SNI, suponho) antes que haja alguma maneira de o servidor determinar se está tentando acessar o nome de domínio ou o endereço IP em sua solicitação HTTP .
Shane Madden
@ShaneMadden Completamente impossível? Entendo que o servidor precisa conhecer o IP do usuário antes de poder escolher o que fazer com ele, mas é completamente impossível não responder a esse acerto, uma vez que conhece sua identidade? O servidor não pode simplesmente travar a conexão até o tempo limite?
HelpingHand
3
@HelpingHand Não é o IP do usuário. O servidor precisa conhecer o cabeçalho do host que o usuário enviará na solicitação HTTP, que não possui até depois que a conexão TCP estiver totalmente estabelecida.
Shane Madden
1
@HelpingHand Não, ele não tem visibilidade da comunicação HTTP acontecendo nas conexões.
Shane Madden
0

Você tem que ir para a camada inferior, apenas me vem à mente na cadeia de firewall ter uma verificação de validação para o REQUEST HOST e o que você tem com o Apache, isso permitirá que o pacote seja ignorado ou descartado

Chaddy
fonte
É perfeitamente possível fazer isso no nível apache, portanto, isso seria um exagero. Um método simples seria garantir que o primeiro vhost fosse uma catchall que negasse o acesso de maneira amigável ao HTTP.
Paul Dixon
0

Uma maneira limpa de lidar com isso é com um RewriteRule da seguinte maneira

<If "%{HTTP_HOST} == 'x.x.x.x'">
  RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>
Chuck Replogle
fonte