Apache httpd: как я могу запретить от всех, разрешить из подсети, но запретить от IP в этой подсети?
Я использую CentOS 5.5 со стандартным Apache httpd-2.2.3.
Я включил mod_status в Расположение / статус сервера. Я хотел бы разрешить доступ к этому единственному местоположению следующим образом:
- Отрицать все
- Разрешить из подсети 192.168.16.0/24
- Запретить IP 192.168.16.100, который находится в подсети 192.168.16.0/24.
1 и 2 легко. Однако, поскольку я "Разрешить с 192.168.16.0/24", можно ли отказать с 192.168.16.100?
Я пытался добавить оператор Deny для 192.168.16.100, но он не работает. Вот соответствующий конфиг:
<Location /server-status>
SetHandler server-status
Order Allow,Deny
Deny from all
Deny from 192.168.16.100 # This does not deny access from 192.168.16.100
Allow from 192.168.16.0/24
</Location>
Или же:
<Location /server-status>
SetHandler server-status
Order Allow,Deny
Deny from all
Deny from 192.168.16.100 # This does not deny access from 192.168.16.100
Allow from 192.168.16.0/24
</Location>
Однако это не препятствует доступу к этой конкретной странице, как показано в журналах доступа:
www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "
Согласно руководству для mod_authz_host:
Разрешить, Запретить
Во-первых, все разрешающие директивы оцениваются; по крайней мере один должен соответствовать, или запрос отклонен. Затем оцениваются все директивы Deny. Если какие-либо совпадения, запрос отклоняется
IP-адрес соответствует директиве Deny, поэтому не следует ли отклонить запрос?
В соответствии с таблицей на странице mod_authz_host этот IP-адрес должен "совпадать как с разрешением, так и с запретом", и поэтому должно применяться правило "Окончательное совпадение элементов управления: отказано".
Матч Разрешить, Запретить результат Запретить, Разрешить результат Только совпадение Разрешить Запрос разрешен Запрос разрешен Только совпадение Запретить Запрос отклонен Запрос отклонен Нет соответствия По умолчанию для второй директивы: Запрещено По умолчанию для второй директивы: Разрешено Совпадают оба элемента "Разрешить и запретить". Элементы управления финальным матчем: "Отклонено"
3 ответа
Я не проверял, но я думаю, что вы почти у цели.
<Location /server-status>
SetHandler server-status
Order Allow,Deny
Deny from 192.168.16.100
Allow from 192.168.16.0/24
</Location>
Deny from all
не нужен На самом деле это облажается, потому что все будет совпадать all
и, таким образом, отрицают (и я думаю, что Apache пытается быть умным и делать что-то глупое). Я всегда нашел Apache's Order
, Allow
а также Deny
Директивы сбивают с толку, поэтому всегда визуализируйте вещи в таблице (взятой из документации):
Матч | Разрешить, запретить результат | Запретить, разрешить результат -------------------------------------------------- ----- Разрешить только | Разрешено | Позволил Запретить только | Отказано | Отказано Нет совпадений | По умолчанию: отказано | По умолчанию: разрешено Матч оба | Финальный матч: отказано | Финальный матч: разрешено
С вышеуказанными настройками:
- Запросы от 192.168.16.100 получают "Соответствие обоим" и, таким образом, отклоняются.
- Запросы от 192.168.16.12 получают "Разрешено только" и, таким образом, разрешены.
- Запросы от 123.123.123.123 получают "Нет совпадений" и поэтому отклоняются.
Я бы, вероятно, посмотрел также на добавление правил IPTables, чтобы запретить один хост на порту 80, запретить все и разрешить подсеть.
У вас не должно возникнуть проблем при настройке правила запрета с определенного адреса после того, как вы разрешите подсеть. Просто сделай это в таком порядке.
Вы можете использовать php? Если это так, добавьте оператор php для выхода / перенаправления для этого конкретного IP-адреса.
Пример:
$ deny = array ("111.111.111", "222.222.222", "333.333.333");
if (in_array ($ _SERVER ['REMOTE_ADDR'], $ deny))
{header ("location: http://www.google.com/");
выход();
Ссылка: http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/