Назад | Перейти на главную страницу

Apache httpd: как я могу запретить все, разрешить из подсети, но запретить IP в этой подсети?

Я запускаю CentOS 5.5 со стандартным Apache httpd-2.2.3.

Я включил mod_status в состоянии Location / server. Я хочу разрешить доступ к этому единственному Location следующим образом:

  1. Запретить всем
  2. Разрешить из подсети 192.168.16.0/24
  3. Запретить с 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:

Разрешить, запретить

Сначала оцениваются все директивы 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

С указанными выше настройками:

  • Запросы от 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");

если (in_array ($ _SERVER ['REMOTE_ADDR'], $ deny))

{заголовок ("местоположение: http://www.google.com/");

выход();

Ссылка: http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/