LINUX.ORG.RU
ФорумAdmin

Вопрос по ACL Squid'a

 ,


0

1

есть довольно не плохая статья (http://www.nestor.minsk.by/sr/2004/02/40214.html) с интересным аспектом:

Например, допустим, вы хотите отвергнуть запросы на определенный сайт, но разрешить доступ всем другим запросам. Это должно выглядеть примерно так:

acl XXX http://www.badsite.net
acl All src 0/0
http_access deny XXX
http_access allow All

А если вам нужно сделать исключение для одного пользователя, так чтобы он мог посетить этот сайт? Новый элемент ACL выглядит так:

acl Admin 3.3.3.3

и новое правило должно иметь вид:

http_access allow Admin XXX

Но где оно действует? Поскольку это правило более конкретное, чем правило deny ХХХ, оно должно проверяться первым:

http_access allow Admin XXX
http_access deny XXX
http_access allow All

Если мы поместим новое правило после deny ХХХ, оно даже никогда проверяться не будет. Первое правило будет всегда соответствовать этому запросу, и пользователь не сможет посетить этот сайт.

Вопрос:
- Почему правило «http_access allow Admin XXX» более конкретное чем «http_access deny XXX»?
- По какому критерию программа это определяет соответствует запрос правилу?

Помогите, пожалуйста, разобраться.

P.S.: Догадки, пожалуйста, не пишите, у меня они есть.


Почему правило «http_access allow Admin XXX» более конкретное чем «http_access deny XXX»

потому что оно выше, а сквид обходит конфиг при проверке запроса сверху вниз. Почему «конкретнее», а не скажем «приоритетнее» — претензии к Нестору.

По какому критерию программа это определяет соответствует запрос правилу?

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields : в http_access allow Admin XXX заданы через Admin (3.3.3.3) источник http-запроса и через XXX адрес запроса (хотя в примере не указано dst или dstdomain это), в http_access acl'ы соединены логическим И, то есть для срабатывания правила запрос должен подпасть под все acl'ы

Напоследок http://wiki.squid-cache.org/SquidFaq/SquidAcl#Common_Mistakes

anonymous
()
Ответ на: комментарий от anonymous

Дополню к 1): сквид сверяет сверху вниз правила из конфига с http-запросом до первого срабатывания правила, то есть если запрос подпал под правило, то процедура сверки завершена, о правилах ниже сработавшего сквид ничего не узнает.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо. я не мог понять какой принцип игнорирования правил. Произвёл несколько тестов, в ходе которых понял, что если встречается правило, которое соответствует запросу то все следующие правила, какие бы они не были, игнорируются. Вот так, тупо и без идейно.

а тесты были следующие:

Задача: Разрешить доступ к кешу только для ip: 192.168.233.208 и только домен http://www.ya.ru

acl wl dstdomain http://www.ya.ru
acl wh src 192.168.233.208

тест 1:
http_access allow wl wh
http_access deny all

имхо, самый правильный вариант.

тест 2:
http_access deny !wl
http_access allow wh
http_access deny all

Работает. Задача выполнена.

тест 3:
http_access allow wh
http_access deny !wl
http_access deny all

Не работает. Потому что, к примеру, запрос GET http://www.yahoo.com с IP: 192.168.233.208 соответствует уже первому правилу (http_access allow wh) и поиск соответствий правил останавливается.

то есть порядок написания правил АРХИВАЖНО.

p.s.: форум превращает url в гиперссылку и добавляет в текст «http://» - не знаю как это предотвратить с помощью Lorcode :(

maza
() автор топика
Ответ на: комментарий от maza

Не совсем правильно написал..

Точнее будет так: Когда соответствие находится в правиле allow то все за ним совпадения в allow тоже будут находится до той поры пока не встретится deny.

Задача: Нужно разрешить одному хосту ходить на одни сайты, всем остальным - на другие сайты. (все хосты ходят только на ya.ru, .208 только на yahoo.com)

тест 4:
acl wl_default dstdomain http://www.ya.ru
acl wl_208 dstdomain http://www.yahoo.com
acl wh src 192.168.233.208

http_access allow wl_208 wh
http_access allow wl_default all
http_access deny all

в таком случае .208 сможет ходить и на ya.ru и на yahoo.com.

достаточно вставить правило deny после совпадения правила allow и задача будет выполнена:
http_access allow wl_208 wh
http_access deny wh
http_access allow wl_default all
http_access deny all

maza
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.