Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
pass in on ed0
route-to { (rl0 10.0.1.1), (rl1 10.1.1.1)} round-robin
from 192.168.0.0/24 to any keep state
Этим правилом входящий трафик на внутреннем интерфейсе (т.е. исходящий для пользователей) будет распределяться между интерфейсами rl0 и rl1 с соответствующими шлюзами по алгоритму round-robin (т.е. внешний интерфейс будет меняться циклически – первое соединение будет использовать rl0, второе – rl1, третье – снова rl0 и так далее). Опция keep state сохраняет состояние, благодаря чему все пакеты в рамках одного соединения будут использовать один и тот же шлюз. В итоге нагрузка будет распределяться между двумя каналами – нельзя сказать, что трафик поделится абсолютно поровну, но при рассмотрении за большой период времени можно считать, что балансировка будет приближаться к этому.
Правда, в данном случае могут возникнуть некоторые проблемы. Например, если некий веб-сервер отслеживает сессию по исходящему IP-адресу, то такая смена шлюза может привести к тому, что уже после ввода логина/пароля при запросе другой страницы веб-сервер не «узнает» вас и потребует повторной аутентификации. Конечно, привязка сессии к IP-адресу в нынешних условиях широкой распространённости NAT-трансляции – решение довольно странное, но всё ещё может встречаться (например, как «второй эшелон безопасности» в дополнение к использованию cookies). В pf для решения этой проблемы можно использовать опцию sticky-address – при её наличии в правиле nat или route-to с опцией round-robin или random, фильтр будет следить за тем, чтобы все соединения с конкретного IP-адреса попадали на одно и то же правило трансляции или перенаправления.
В ipfw тоже есть возможность реализовать нечто подобное, но на другом принципе. Здесь в правило можно включить опцию prob N, где N – число от 0 до 1, указывающее вероятность, с которой правило будет применяться к пакетам, подходящим по остальным критериям. В паре с действием skipto можно попробовать реализовать нечто подобное:
ipfw add 500 check-state
ipfw add 1000 prob 0.4 skipto 2000 ip from any to any in via ed0
ipfw add 1500 fwd 10.0.1.1 ip from 192.168.0.0/24 to any out keep-state
ipfw add 2000 fwd 10.1.1.1 ip from 192.168.0.0/24 to any out keep-state
Правило 1000, имея в своём составе опцию prob 0.4, будет выполняться для всех исходящих пакетов (с точки зрения пользователей; для FreeBSD-шлюза это будут входящие пакеты на внутреннем интерфейсе, что и отражается опциями in via ed0) с вероятностью 40%. Эти 40% «счастливчиков» будут перебрасываться на правило 2000, которым будут отправляться в шлюз интерфейса rl1 (хотя, поскольку это шлюз по умолчанию, можно было бы ограничиться действием allow). Оставшиеся 60% пакетов продолжат свой путь и правилом 1500 будут переброшены на шлюз интерфейса rl0. Важной особенностью здесь является наличие опций keep-state – благодаря им под «пробу» будет попадать только первый пакет устанавливаемого соединения, а все остальные пакеты подпадут под действие правила check-state, которое должно быть указано до правила skipto, чтобы избежать «разрыва» уже установленной сессии. Поскольку динамические правила сохраняют первоначальное действие (в данном случае forward), то все пакеты соединения будут отправляться через указанный шлюз.