Я запускаю CentOS 5.5 со стандартным Apache httpd-2.2.3.
Я включил mod_status в состоянии Location / server. Я хочу разрешить доступ к этому единственному Location следующим образом:
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:
Разрешить, запретить
Сначала оцениваются все директивы Allow; хотя бы одно должно совпадать, иначе запрос будет отклонен. Затем оцениваются все директивы Deny. Если есть совпадения, запрос отклоняется.
IP-адрес соответствует директиве Deny, поэтому не следует ли отклонять запрос?
Согласно таблице на странице mod_authz_host, этот IP-адрес должен «Соответствовать как разрешению, так и запрещению», и, следовательно, должно применяться правило «Контроль окончательного соответствия: отказано».
Match Allow,Deny result Deny,Allow result Match Allow only Request allowed Request allowed Match Deny only Request denied Request denied No match Default to second directive: Denied Default to second directive: Allowed Match both Allow & Deny Final match controls: Denied Final match controls: Allowed
Я не тестировал, но думаю, вы почти у цели.
<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 Order
, Allow
и Deny
директивы сбивают с толку, поэтому всегда визуализируйте вещи в таблице (взятой из документы):
Match | Allow,Deny result | Deny,Allow result ------------------------------------------------------- Allow only | Allowed | Allowed Deny only | Denied | Denied No match | Default: Denied | Default: Allowed Match both | Final match: Denied | Final match: Allowed
С указанными выше настройками:
Я бы, вероятно, посмотрел также на добавление правил IPTables для этого, чтобы запретить один хост на порту 80, запретить все и разрешить подсеть.
У вас не должно возникнуть проблем с установкой правила запрета для определенного адреса после того, как вы разрешили подсеть. Просто делайте это в таком порядке.
Вы можете использовать php? Если это так, добавьте оператор php для выхода / перенаправления для этого одного конкретного IP-адреса
Пример:
$ deny = array ("111.111.111", "222.222.222", "333.333.333");
если (in_array ($ _SERVER ['REMOTE_ADDR'], $ deny))
{заголовок ("местоположение: http://www.google.com/");
выход();
Ссылка: http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/