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>

Ну, thin вызывает 403 Forbidden для запросов, не поступающих из домена, что неплохо в моей ситуации. Тем не менее, я хочу, чтобы сервер не существовал для этих запросов. Я уверен, что это можно сделать как-нибудь, может быть, не с Apache, а на системном уровне?
Алекс

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

@ShaneMadden Совершенно невозможно? Я понимаю, что серверу необходимо знать IP-адрес пользователя, прежде чем он сможет выбрать, что с ним делать, но совершенно невозможно не ответить на этот удар, когда он знает свою личность? Разве сервер не может просто повесить соединение до истечения времени ожидания?
HelpingHand

3
@HelpingHand Не IP пользователя. Сервер должен знать заголовок узла, который пользователь отправит в HTTP-запросе, которого он не имеет до тех пор, пока не будет полностью установлено соединение TCP.
Шейн Мэдден

1
@HelpingHand Нет, у него нет видимости HTTP-связи, происходящей в соединениях.
Шейн Мэдден,

0

Вы должны перейти на нижний уровень, он приходит мне в голову только в цепочке брандмауэров, где есть проверка валидации для REQUEST HOST и что у вас есть с Apache, это позволит пакету быть проигнорированным или отброшенным


Вполне возможно сделать это на уровне Apache, так что это будет излишним. Простым способом было бы убедиться, что первый vhost - это ловушка, которая запрещает доступ 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.