Pull to refresh

Comments 57

Логики с более оптимальным использованием оперативной памяти не уловил. По-моему все осталось также + накладные расходы от вм.
А я и не говорил, что оперативная память стала лучше использоваться. Меня досаждало только, что ОЗУ забита, а процессор (практически самая дорогая часть системника) отдыхает. Здесь же я загрузил процессор, за счет чего появилось больше времени на распитие кофе.
А исходя из чего делался вывод о том, что ОЗУ забито? Если один экземпляр ntlm_auth занимает в оперативной памяти около 60 мегабайт, то делать вывод о том, что десять экземпляров будут занимать 600 мегабайт, мягко говоря, неверно.
Вывод делался на основе показаний top'а:
image

Просто в моей конфигурации, как я написал под UPD, используется скрипт, аналогичный wbinfo_group.pl, для определения самого доменного логина пользователя, чтобы можно было каждому конкретному пользователю выдать привилегии, отличающиеся от привилегии его группы (дополнительный запрет или дополнительное разрешение), так как в коробочной поставке Squid'а такого функционала нет. Соответственно, файл squid.conf становится значительно больше в размерах и больше ресурсов тратится на его обработку, что, конечно, не есть гуд, но в моем случае это нужно.
По данному выводу видно, что в наличии куча памяти и система вообще ничем не загружена.
p.s. А что такое «обработка squid.conf»? Это какой-то ресурсоёмкий процесс?
Я вижу, что из 641116 K занято 607148K, свободно 33968K, то есть свободно 5%.

По поводу обработки squid.conf… Вообще, как мне кажется, чтение строки ACL и сравнение текущего запроса с этим ACL при большом количестве этих самых ACL, затем обработка http_access для этих ACL — довольно ресурсоемкий процесс. Особенно, если в конфиге содержится 1000 строк касательно http_access и 200 касательно ACL.

При этом несколько раз в секунду запускаются два процесса, отбирающие 100М оперативной памяти.

Это эмпирическое наблюдение, а не теоретические выкладки.
Системы unix-like используют «свободную» память под дисковый кеш и прочее.

Можете в этом убедиться, запустив htop. Он зеленым покажет использование памяти процессами userspace'а, а желтым — использование памяти под кеш.

Ну а по поводу памяти отдельного процесса, VIRT — это НЕ количество занимаемой физической памяти
> В случае же присутствия распределенной сети отделений, филиалов, когда обязанности и ответственность админов разделены, то такая система, «ожидающая» лучшей инфраструктуры — лучшее, что пришло в голову.

В таком случае лучшей идеей будет Forefront TMG в массиве, управляемом с Enterprise Management Server. IMHO.
Возможно так, только стоимость решения поболе будет :)
Как-то все сложно у вас получается, у меня 30 потоков ntlm_auth обслуживает ~300 пользователей (по 8 мегабайт на поток) + 2 потока winbind по 12 мегабайт.

Проблема с отваливанием контроллера домена и запросом авторизации решается через указание:

krb5.conf
dns_lookup_kdc = yes
ну и для верности:
admin_server=tcp/domain.local
kdc=tcp/domain.local

smb.conf
security = ads
password server = *
upd: не туда глянул, по 2.5 мегабайта на поток + по 2 мегабайта на winbind
Вот с памятью и потоками ничего не мог поделать. Как-то они ее сжирают, как — не знаю :) Скриншот не врет. При первом тестировании было 5 процессов ntlm_auth, 4 пользователя прокси уже не осилил (или 5 — точно не помню).
За совет спасибо, обязательно потестирую, есть только один вопрос: когда проблема именно в контроллере домена (грубо говоря, из него выдернули сетевой кабель), приведенные вами опции спасут положение?
Для меня важно, чтобы даже в таком случае (с кабелем) все автоматически перешло на недоменную конфигурацию и продолжило работу до лучших времен :)
Может быть лучше на этот случай иметь бакап-контроллер (а еще лучше не один)? Если выдергивают кабель из контроллера домена при единственном контроллере — это беда для домена…
Конечно, лучше, я не спорю :)
Но, во-первых, разделение полномочий :)
Во-вторых, пока есть глюки с доменом, есть глюки с проксей.
Здесь же, во-первых, уменьшается головная боль во время заскоков домена, во-вторых, есть отчетность, которая показывает, когда происходили заскоки и сколько они длились. Ну а третий фактор — легче администрировать. Может, он и очень субъективный, но радость доставляет :)
Т.е. у вас 200+ пользователей и 1 контроллер домена? Если из него выдернуть кабель, вся сеть перестанет корректно работать, оставшись без авторизации и DNS.

То, что я предложил, это динамическое переключение между контроллерами домена, т.е. их должно быть больше одного в сети.
Я знаю, что будет, если выдернуть кабель :) Но статья-то о проксях :)
Тут просто нужно настучать по шее админу, кто следит за доменом, а не придумывать костыль, там где он не нужен, ИМХО.
Я, конечно, согласен.
Но, есть несколько замечаний.
1. Тематика данного ресурса не включает в себя вопросы рукоприкладства.
2. Ситуации в жизни бывают разные, решения для них нужны тоже разные.
3. Добрая половина всех решений в администрировании — костыли. Кто-то их использует, потому что нет денег на покупку software+hardware, кто-то просто из своих принципов. Костыли собираются в сборники, публикуются в блогах. Какой-то костыль дает ознакомившемуся с ним человеку вдохновение написать какую-то софтину, которая потом становится известным и признанным костылем, автоматизирующим что-то и позволяющим устранить недоработки или недосмотры крупных производителей ПО, и уже никто не называет ее костылем, а называют «классная софтина».
UFO landed and left these words here
В большинстве случаев грамотно проектировать и реализовывать мешают финанасовые директора и существующая инфраструктура, в которой время простоя фактически сказывается на вашем здоровье. К сожалению, мы не в сферическом вакууме, где ИТ существует ради ИТ.
В вашем случае проверялась принадлежность пользователя группе? Или каждой конкретной пользовательской доменной учетной записи можно было назначить свои права и привилегии, отличающиеся от тех, которые были предоставлены группе, членом которой он является?
Почему вы выбрали авторизацию ntlm_auth? Я после недолгого промежутка в работе с данной схемой решил отказаться от неё в пользу negotiate(kerberos).
Так же интересует отличие локального режима от доменного? Или вы дублировали всех пользователей с их паролями в отдельный файл и использовали basic авторизацию?
В итоге из 7 задач поставленных в начале — вы решили лишь две.
Контроллер домена находится не в моем ведении, и у меня нет особого желания погружаться в дебри, рискуя свалить какой-нибудь сервис, ибо простой даже в один час очень дорого обходится. Я выбрал тот инструмент, который показался более удобным в тот момент времени.

Насчет отличий локального и доменного режима.
Данный прокси вводился мной для решения задач более информационной безопасности, нежели администрирования, учета рабочего времени и т.п. Основная его задача — блокирование передачи файлов в интернет (через веб-формы, через mail.ru агент, через icq). Эти задачи выполняет iptables гипервизора в независимости от домена. Вторая задача — разграничение доступа к интернету. При отсутствии связи с доменом, для того, чтобы никто не звонил, не писал, не заходил, не кричал, не плакал, я жертвую решением второй задачи, но я на 100% уверен, что решение первой задачи работает в прежнем режиме.

Насчет семи перечисленных… Насчет настройки Squid'а на работу с AD, я думаю, писать уже не стОит, ибо все давно написано. Очень хороший мануал есть у lissyara. Как пробросить пакеты мимо прокси средставми iptables — вроде тоже не очень сложная задача. А вот повышение отказоустойчивости с как можно меньшей стоимостью владения решением — это и есть тема топика :)
Т.е. локальный режим разрешает доступ всем пользователям без авторизации, но с функцией блокировки?
Именно в данном случае — да. Естественно, никто не мешает накатать в качестве локального конфига что-то умопомрачительное, это вопрос времени и сил :) Хотелось рассказать и получить критику самой сути решения — пул прокси-серверов + переключение с уведомлением. Просто, как мне кажется, выпустить всех с блокировками гораздо лучше, чем, например, находясь на больничном или в отпуске, принять звонок со словами «у нас тут все поломалось, выходи срочно». А здесь — все работает и ждет своего часа. Все довольны.
>Автоматическое переключение между доменной и недоменной конфигурациями
Оно у вас запускается на каждом прокси сервере? Если нет — то получается, что реконфигурация запускается только на компьютере со скриптом. А другие сквиды работают с старым конфигом.
>Чтобы не синхронизировать скрипт в будущем на всех прокси-серверах, закидываем его в сетевую шару на машине PROXY_CONFIG, монтируем ее на всех проксиках и добавляем скрипт в cron на каждую минуту.

Вот так выглядит отчетность:
У вас работает авторизация по kerberos, если пользователь находится в дружественном лесу, а не в основном?
К сожалению, не могу ответить на этот вопрос, потому что все в одном лесу.
> Изрядно намучившись с гуглом, различными продуктами и решениями, я подумал: «суть конфигурирования состоит в генерации файла squid.conf, на php мне как-то доводилось писать, а почему бы не реализовать веб-интерфейс самому?» Сказано — сделано.


А можно посмотреть, что сделано? Имею такие же проблемы с SAMS, думал в статье увидеть решение, а его там не оказалось. Спасибо
Это интерфейс в аскетическом стиле. Настройки хранятся в базе mysql. При нажатии ссылки «применить настройки» происходит генерирование файла squid.conf и реконфигурирование squid'а. Мне хватает :)
Скриншоты
А не мог бы выложить iptables правила очень интересно посмотреть!
Правила блокирования передачи файлов? Или какие?
Да передачи файлов и балансировка
Балансировка — как в топике, только еще плюс
iptables -t nat -A POSTROUTING --dst $PROXY_NET -p tcp --dport 3128 -j SNAT --to-source $GW_IP_2

Где $GW_IP_2 — адрес интерфейса гипервизора, который смотрит в сеть прокси-серверов.

Про блокировку завтра напишу, сейчас под рукой нет, а наизусть не помню :)
Создаем цепочки для обработки:
iptables -N MRA_Packets
iptables -N ICQ_Packets
iptables -N WebForm_Packets


Здесь сама логика обработки цепочек:
# MRA_Packets rules
iptables -A MRA_Packets -m u32 --u32 "52=0x26100000" -j LOG --log-prefix "MRA File Transferring: " --log-level 7
iptables -A MRA_Packets -m u32 --u32 "52=0x26100000" -j REJECT
# ICQ_Packets rules
iptables -A ICQ_Packets -m string --algo bm --hex-string '|09 46 13 43 4c 7f 11 d1 82 22 44 45 53 54 00|' -j LOG --log-prefix "ICQ File Transferring: " --log-level 7
iptables -A ICQ_Packets -m string --algo bm --hex-string '|09 46 13 43 4c 7f 11 d1 82 22 44 45 53 54 00|' -j REJECT


А вот так iptables понимает, что пакеты нужно направить в соответствующие цепочки:
iptables -A INPUT -s 192.168.100.0/24 -m u32 --u32 "40=0xEFBEADDE" -j MRA_Packets
iptables -A OUTPUT -d 192.168.100.0/24 -m u32 --u32 "40=0xEFBEADDE" -j MRA_Packets
iptables -A INPUT -s 192.168.100.0/24 -m u32 --u32 "38&0xFFFF=0x2A02 && 46=0x00040006" -j ICQ_Packets
iptables -A OUTPUT -d 192.168.100.0/24 -m u32 --u32 "38&0xFFFF=0x2A02 && 46=0x00040007" -j ICQ_Packets
iptables -A INPUT -s 192.168.100.0/24 -m string --algo bm --string 'Content-Disposition: form-data; name="' -j WebForm_Packets
iptables -t nat -A PREROUTING -s 192.168.100.0/24 -m string --algo bm --string 'Content-Disposition: form-data; name="' -j WebForm_Packets
Забыл логику для цепочки WebForm_Packets:
# WebForm_Packets rules
iptables -A WebForm_Packets -m string --algo bm --string 'filename=""' -j ACCEPT
iptables -A WebForm_Packets -m string --algo bm --string 'filename="' -j LOG --log-prefix "Uploading Packet: " --log-level 7
iptables -A WebForm_Packets -m string --algo bm --string 'filename="' -j REJECT
простите коллега, но чушь…

auth_param ntlm children = 200? не многовато? у меня 200 человек без проблемм на ntlm аутентификации сидят… если имеется ввиду проблема отвала домена с ошибкой в лог а ля…

libsmb/ntlmssp.c:342(ntlmssp_update)
got NTLMSSP command 1, expected 3

то она при компиляции самбы решается так…

/usr/ports/net/samba3/work/samba-3.0.37/source/libsmb/ntlmssp.c

строка 333.
Было:
if (ntlmssp_command != ntlmssp_state->expected_state) {
DEBUG(1, («got NTLMSSP command %u, expected %u\n», ntlmssp_command, ntlmssp_state->expected_state));
return NT_STATUS_INVALID_PARAMETER;
}

Стало:
if (ntlmssp_command != ntlmssp_state->expected_state) {
DEBUG(1, («got NTLMSSP command %u, expected %u\n», ntlmssp_command, ntlmssp_state->expected_state));
return NT_STATUS_OK;
}

сам долго мучался… грабли, но работает как часики
200 человек на 15 чилдренах имею ввиду
Встречный вопрос.
Проверялась принадлежность пользователя группе? Или каждой конкретной пользовательской доменной учетной записи можно было назначить свои права и привилегии, отличали ющиеся от тех, которые были предоставлены группе, членом которой он является?
У нас в свое время прокси такого типа (squid+squidbalance+sams+AD) на более слабой машине и обслуживал более 200 клиентов и работал нормально.
Так что с вашей машиной «компьютер CPU Core i3/RAM 4 Gb/HDD 500 Gb;» вообще не должно было быть проблем с нормальной настройкой.
А по трафику у вас нет ограничений и по скорости?
Здесь тоже работал нормально на более слабой машине.
Я сделал запас ресурсов из-за постоянно появляющихся новых пользователей.
По трафику и скорости ограничений нет.
В вашем случае проверялась принадлежность пользователя группе? Или каждой конкретной пользовательской доменной учетной записи можно было назначить свои права и привилегии, отличающиеся от тех, которые были предоставлены группе, членом которой он является?
по группам, привилегии у нас были по IP+MAC, да и давно было уже.
А в моем случае привязка прав идет к группе+логину. Доступ к социальным сетям, почтовым серверам, файлообменникам ограничен. И вообще, руководителями выдвигаются различные требования к привилегиям доступа их сотрудников.
IP-адрес как критерий отбора я сразу отбросил, потому что на DHCP он уже не критерий.
MAC'и тоже есть как критерии, но у iptables на гипервизоре.

В общем, разобрались, куда память уходит :)
ntlm это прошлый век, kerberos лучше использовать
Никогда не встречал «белых» MAC-адресов =)
Устойчивая фраза «белый адрес» в моём понимании — глобально маршрутизируемый IP адрес.

Ошибка или некорректное использование «термина»? Работаю с сетями и эта фраза ой как глаз режет.

Правильно ли я понял, что все прокси выходят в интернет под одним IP адресом? Т.е. прокси имеют серый IP адрес на внешнем интерфейсе и потом пограничный маршрутизатор их NAT`ит?

Если на разных прокси будет настроен свой белый IP адреса, то будет плохо работать. Веб-сервера в интернете будут получать запрос с разных IP адресов для одной сессии пользователя, а многие привязывают сессию к IP адресу… СтОит добавить в текст.
Прошу прощения, это внутренняя терминология. Исправил «белый» на «VIP».

Между прокси и внешним миром есть пограничный маршрутизатор. Только гипервизор знает, что прокси несколько.
А как в такой реализации выглядела авторизация со стороны клиента. Я так понимаю сквозная авторизация не работает? То есть открывая браузер нужно еще и логин с паролем вводить, но только доменные? А если сдохло AD, то логин с паролем те-же? Если нет, то как пользователи должны об этом узнать? Если да, то как вы дублируете пароли из AD?

А про падения AD вы говорите так, как будто оно раз в неделю происходит. На моей памяти еще ни один DC не падал, и при этом их всегда было минимум два. А что до разделения обязанностей, так оно много где так. Должна быть плотная и постоянная коммуникация между сотрудниками/отделами/компаниями-оутсорсерами.
> А как в такой реализации выглядела авторизация со стороны клиента.


> А если сдохло AD, то логин с паролем те-же?
Комментарий выше

> А что до разделения обязанностей, так оно много где так. Должна быть
А деятельность законодательной, исполнительной и судебной властей должна быть направлена на защиту интересов граждан государства. Аналогию можете провести сами.
/usr/bin/ntlm_auth…
if [ $? != 0 ]; then

Сам так раньше писал. Но в shell-скриптах можно проще и красивее:

if ! /usr/bin/ntlm...... ;then

срабатывает, как раз когда код возврата ($?) не равен 0
А вот ктобы подсказал, как сделать отказоустойчивый кластер из squid с Kerberos аутентификацией… Пока сделал через 3 сквида, один из которых child с ACL и авторизацией и 2 parent, к которым не разрешен доступ напрямую.
Вот только failover тут нету никакого — падает child прокси и все…
А если по такому же принципу? ACL в отдельном месте, дети получают доступ к ним по сети, а от клиентов такой же разброс на child'ов?
Kerberos аутентификация подразумевает наличие SPN fqdn-имени прокси. Выставлен будет в настройках один адрес, а по факту — обращение будет к другому. Есть мнение, что так работать не будет…
Мне кажется, стоит попробовать. Я через некоторое время после написания статьи переводил прокси на Kerberos, у меня со стороны клиента ничего не менялось, и никаких новых проблем не появлялось. Правда и старые не решались, но это другая история ))
Sign up to leave a comment.

Articles