Apache - nasłuchuj tylko w określonej domenie, a nie IP

9

Jak mogę skonfigurować Apache, aby odrzucał połączenia przychodzące bezpośrednio na adres IP ( http://xxx.xxx.xxx.xxx ) zamiast nazwy vhosta http://example.com ?

Moja konfiguracja 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
źródło

Odpowiedzi:

25

Nie możesz odmówić połączenia, ponieważ nazwa hosta (lub adres IP), którego użytkownik próbuje użyć jako hosta HTTP, nie jest znana serwerowi, dopóki klient nie wyśle ​​żądania HTTP. Detektor TCP jest zawsze powiązany z adresem IP.

Czy zamiast tego akceptowalna byłaby odpowiedź HTTP?

<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
źródło
Cóż, cienkie wyświetla 403 Zabronione dla żądań nie pochodzących z domeny, co nie jest złe w mojej sytuacji. Jednak chcę, aby serwer był „nieistniejący” dla tych żądań. Jestem pewien, że można to jakoś zrobić, może nie za pomocą apache, ale na poziomie systemu?
Alex
3
@Alex Nie, to całkowicie niemożliwe. Połączenie TCP musi zostać ustanowione, a klient musi wysłać żądanie HTTP (lub, jak mi się wydaje, nagłówek SNI), zanim serwer będzie mógł ustalić, czy próbują trafić nazwę domeny lub adres IP w żądaniu HTTP .
Shane Madden
@ShaneMadden Zupełnie niemożliwe? Rozumiem, że serwer musi znać adres IP użytkownika, zanim będzie mógł wybrać, co z nim zrobić, ale całkowicie niemożliwe jest nie zareagowanie na to trafienie, gdy pozna swoją tożsamość? Czy serwer nie może po prostu zawiesić połączenia przed upływem limitu czasu?
HelpingHand
3
@HelpingHand Nie adres IP użytkownika. Serwer musi znać nagłówek hosta, który użytkownik wyśle ​​w żądaniu HTTP, którego nie ma, dopóki połączenie TCP nie zostanie w pełni ustanowione.
Shane Madden
1
@HelpingHand Nie, nie ma widoczności komunikacji HTTP zachodzącej w połączeniach.
Shane Madden
0

Musisz przejść do niższej warstwy, to przychodzi mi do głowy tylko w łańcuchu zapory, sprawdzając poprawność HOSTA ZAPYTAŃ, a to, co masz z Apache, pozwoli to zignorować lub upuścić pakiet

Czaddy
źródło
Jest to jednak całkowicie możliwe na poziomie apache, więc byłoby to przesadą. Prostą metodą byłoby upewnienie się, że pierwszy vhost był blokadą, która odmawiała dostępu w sposób przyjazny HTTP.
Paul Dixon,
0

Prostym sposobem na poradzenie sobie z tym jest RewriteRule w następujący sposób

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