HAProxy – это просто отличный load-balancer. Широко применяется для работы с HTTP-трафиком в высоконагруженных проектах. Очень гибко конфигурируется и очень шустро работает. С его помощью HTTP-трафик можно маршрутизировать и балансировать как угодно, реализуя даже самые причудливые фантазии.
Далее речь пойдёт о том, как ограничить доступ к сайту, который обслуживается haproxy. Может пригодится для всяких тестовых сред, где нежелательно, чтобы поисковые системы индексировали версию сайта, которая находится в разработке и не готова еще к production-применению. А также просто для сокрытия контента от всяких любопытных глаз.
-
В секцию "global" добавляем список пользователей:
global userlist L1 user user1 insecure-password plain-text-pass1 user user2 insecure-password plain-text-pass2
-
В секцию "frontend" добавляем списки контроля доступа и правила фильтрации запросов:
frontend main *:80 acl auth_ok http_auth(L1) acl ipwhitelist src 10.10.1.1 10.10.2.1 http-request allow if ipwhitelist http-request allow if auth_ok http-request auth unless ipwhitelist http-request deny
Здесь во 2-ой строке определяем ACL (access control list) с именем auth_ok, который срабатывает в случае успешной авторизации кого-либо из пользователей из определенного ранее списка с именем L1. В 3-ей строке определяем ACL с именем ipwhitelist, куда заносим IP-адреса компьютеров, при запросах с которых запрос на авторизацию выдаваться не будет. В 4-ый строке собственно безусловно разрешаем доступ компьютреам из "белого списка". В 5-ой строке разрешаем доступ только успешно авторизованным пользователям (процессинг правил дойдёт до этого места только в случае, если не сработало предыдущее правило в строке 4, так как опции http-request обрабатываются до первого срабатывания, в squid-е тоже так, кстати). В 6-ой строке говорим выдавать запрос на авторизацию для тех клиентов, кто не входит в "белый список" и кто еще не прошёл HTTP-авторизацию. 7-ая строка требует возвращать HTTP-статус 403 (Forbidden) для тех, кто не прошёл авторизацию и не входит в "белый список".
На данный момент (версия 1.5) поддерживается только basic-авторизация.
Спасибо, весьма пригодилось. Только у меня еще стояла задача по user-agent-у пришельцев фильтровать. Получилось вот так:
acl auth_ok http_auth(L1)
acl ipwhitelist src 10.20.20.20 127.0.0.1
acl facebook_ua hdr_sub(user-agent) -i facebookexternalhit
http-request allow if ipwhitelist
http-request allow if facebook_ua
http-request allow if auth_ok
http-request auth unless ipwhitelist
http-request deny