Apache - слухати лише певний домен, а не IP


9

Як я можу налаштувати apache, щоб він відмовився від з'єднань, що надходять безпосередньо на IP-адресу ( http://xxx.xxx.xxx.xxx ) замість імені vhost http://example.com ?

Моя конфігурація 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>

Відповіді:


25

Ви не можете його відмовити від з'єднань, оскільки ім'я хоста (або IP), яке користувач намагається використовувати як свій хост HTTP, не відоме серверу, поки клієнт фактично не надішле HTTP-запит. Слухач TCP завжди прив’язаний до IP-адреси.

Чи прийнятним буде відповідь про помилку 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>

Що ж, тонкий піднімає 403 Заборонені для запитів, які не надходять з домену, що в моїй ситуації непогано. Однак я хочу, щоб сервер не існував для цих запитів. Я впевнений, що це можна зробити якось, можливо, не з апачем, а на системному рівні?
Алекс

3
@ Алекс Ні, це абсолютно неможливо. З'єднання TCP повинно бути встановлено, і клієнт повинен надіслати свій HTTP-запит (або його заголовок SNI, я думаю), перш ніж сервер може визначити, чи намагаються вони звернутися до доменного імені або IP-адреси у своєму HTTP-запиті. .
Шейн Мадден

@ShaneMadden Повністю неможливо? Я розумію, що сервер повинен знати IP-адресу користувача, перш ніж він зможе вибрати, що з ним робити, але абсолютно неможливо не реагувати на це звернення, як тільки він дізнається свою особу? Чи не може сервер просто повісити з'єднання до часу очікування?
HelpingHand

3
@HelpingHand Не IP-адресу користувача. Сервер повинен знати головний заголовок, який користувач надішле у HTTP-запиті, якого у нього немає до моменту, коли TCP-з'єднання буде повністю встановлено.
Шейн Мадден

1
@HelpingHand Ні, він не бачить HTTP-зв'язку, що відбувається в з'єднаннях.
Шейн Мадден

0

Вам потрібно перейти до нижнього шару, і мені це спадає на думку лише в ланцюзі брандмауера, що має перевірку валідності для ЗАПИТУВАННЯ ДОМАШНЯ І що ви маєте з Apache, це дозволить ігнорувати або відкинути пакет


Це цілком можливо зробити на рівні апашшю, тож це буде зайвим. Простим методом було б переконатися, що першим vhost був catchall, який відмовив у доступі до HTTP-дружнього способу.
Пол Діксон

0

Чистий спосіб вирішити це за допомогою RewriteRule наступним чином

<If "%{HTTP_HOST} == 'x.x.x.x'">
  RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.