The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Policy-Based Routing (PBR) в ОС FreeBSD (freebsd policy route forward ipfw)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: freebsd, policy, route, forward, ipfw,  (найти похожие документы)
From: Александр Моря <morya@apexnet.dp.ua> Subject: Policy-Based Routing (PBR) в ОС FreeBSD Policy-Based Routing (PBR) в ОС FreeBSD ------------------- Когда возникает необходимость в PBR? В сегодняшних компьютерных сетях высокой производительности, возникает необходимость в выполнении пересылки пакетов соответственно определенной политике (правилу или набору правил), которая, в некотором отношении, выходит за границы традиционных принципов работы протоколов маршрутизации. PBR используется там, где, в силу различных обстоятельств, необходимо дифференцировать трафик по какому-либо признаку, и выбирать различный дальнейший маршрут для каждого случая отдельно. Достоинства PBR 1. выбор маршрута, основанный на источнике - позволяет пропускать трафик, приходящий из различных мест, через разные каналы подключения к Интернет 2. эффективное использование имеющихся каналов подключения к Интернет 3. расширение возможностей динамической маршрутизации Что такое PBR? PBR предоставляет механизм реализации пересылки (forwarding)/ маршрутизации(routing) пакетов данных, основанный на политике, представляющей собой набор правил, определенной администраторами сети. Это предоставляет более гибкий механизм для обработки пакетов на маршрутизаторах, дополняя существующий механизм, предоставленный протоколами маршрутизации.Маршрутизаторы выбирают дальнейший путь следования пакетов данных по полю "адрес назначения", основываясь на информации из таблицы статических маршрутов или полученной от динамических протоколов маршрутизации, как, например Routing Information Protocol (RIP), Open Shortest Path First (OSPF), или Enhanced Interior Gateway Routing Protocol (Enhanced IGRP). Вместо выбора дальнейшего маршрута, основанного на адресе назначения, PBR позволяет администраторам сети определить свои правила, по которым будет осуществляться маршрутизация пакетов. Сфера применения. |-----------------| |Организация | |----| | |--------| | |--------| |------| | I | | |Отдел А |-----|------->|Роутер |----->|ISP1 |---->| N | | |--------| | | | |------| | T | | | | | | E | | | | | | R | | |--------| | | | |------| | N | | |Отдел Б |-----|------->| |----->|ISP2 |---->| E | | |--------| | |--------| |------| | T | | | |----| |-----------------| Наиболее часто на практике PBR используется в ситуации, которая представлена на рисунке. Т.е. когда какая-либо организация имеет 2 или более канала подключения к Интернет. В стандартном случае один канал является основным (через него организация выходит в Интернет), а второй - вспомогательным (он подключается, когда неисправен первый канал, в остальное время обычно используется для доступа к локальным ресурсам одного из провайдеров, т.е. mp3, video и т.д.). При таком варианте эффективность использования двух каналов чрезвычайно низка. Конечно, и такой вариант имеет право на существование, но рано или поздно перед развивающейся организацией появляется задача более эффективного использования имеющихся каналов подключения к Интернет или, возможно, разделения этих каналов между своими отделами (например, отдел производства будет использовать канал на ISP1, а отдел маркетинга - канал на ISP2). Именно в этом случае на помощь приходит policy-based routing. Практическая реализация в ОС FreeBSD В ОС FreeBSD policy-based routing осуществляется с помощью механизма ip forwarding и пакетного фильтра ipfw. Чтобы включить возможность пакетной фильтрации в ОС FreeBSD необходимо вставить в файл конфигурации ядра ОС следующие строки: options IPFIREWALL options IPDIVERT options IPFIRWALL_FORWARD В результате мы активируем следующие механизмы: пакетный фильтр, NAT (сетевая трансляция адресов, позволяет разделять один канал выхода в Интернет между множеством пользователей) и механизм ip forwarding.Рассмотрим следующий вариант. Имеется сервер с ОС FreeBSD с двумя каналами доступа к Интернет (ISP1, ISP2) и двумя подключения локальной сети (отдел А, отдел Б). Примем следующую конфигурацию сетевых интерфейсов: rl0 - 1.1.1.1 /24(gateway 1.1.1.254 ISP1) rl1 - 2.2.2.2 /24(gateway 2.2.2.254 ISP2) rl2 - 3.3.3.3/24 (lan1, отдел А) rl3 - 4.4.4.4 /24(lan2, отдел Б) Поставим такую задачу, чтобы пользователи lan1 выходили в Интернет через первого провайдера ISP1, а пользователи lan2 - через ISP2. Заранее оговорю, что приведенные ниже примеры будут работать вне зависимости от того, какой маршрут по умолчанию (через ISP1 или ISP2) определен в настройках ОС. Сначала необходимо запустить NAT на интерфейсах rl0 и rl1: natd -a 1.1.1.1 -p 8668 natd -a 2.2.2.2 -p 8778 Создадим набор правил для ipfw: ipfw 10 add divert 8668 ip from 3.3.3.0/24 to any ipfw 20 add divert 8778 ip from 4.4.4.0/24 to any ipfw 30 add fwd 1.1.1.254 ip from 1.1.1.1 to any ipfw 40 add fwd 2.2.2.254 ip from 2.2.2.2 to any ipfw 50 add divert 8668 ip from any to 1.1.1.1 ipfw 60 add divert 8778 ip from any to 2.2.2.2 В некоторых случаях имеется только одно подключение к локальной сети и необходимо "пропустить" через другой канал доступа к Интернет не локальную сеть, а один или несколько компьютеров. Допустим, есть только lan1 и через ISP1 в Интернет будет "выходить" компьютер с ip адресом 3.3.3.10 Опять же запускаем NAT: natd -a 1.1.1.1 -p 8668 natd -a 2.2.2.2 -p 8778 Следующий набор правил пакетного фильтра ipfw решает эту задачу : ipfw 10 add divert 8668 ip from 3.3.3.10 to any ipfw 20 add divert 8778 ip from any to any ipfw 30 add fwd 1.1.1.254 ip from 1.1.1.1 to any ipfw 40 add fwd 2.2.2.254 ip from 2.2.2.2 to any ipfw 50 add divert 8668 ip from any to 1.1.1.1 ipfw 60 add divert 8778 ip from any to 2.2.2.2 Иногда возникает и более сложная задача, когда необходимо не "жестко" разделять каналы, а когда пользователи, допустим, lan1 должны "выходить" в Интернет через ISP1, но также должны "видеть" и локальные ресурсы второго провайдера, и наоборот, пользователи lan2 "выходят" в Интернет через ISP2 и "видят" ресурсы ISP1. Допустим, локальные ресурсы ISP1 находятся по адресам 5.5.5.0/24, а ресурсы ISP2 - 6.6.6.0/24. Конечно, не забываем запустить NAT: natd -a 1.1.1.1 -p 8668 natd -a 2.2.2.2 -p 8778 Для этого случая правила ipfw выглядят так: ipfw 10 add divert 8778 ip from 3.3.3.0/24 to 6.6.6.0/24 ipfw 20 add divert 8668 ip from 3.3.3.0/24 to any ipfw 30 add divert 8668 ip from 4.4.4.0/24 to 5.5.5.0/24 ipfw 40 add divert 8778 ip from 4.4.4.0/24 to any ipfw 50 add fwd 1.1.1.254 ip from 1.1.1.1 to any ipfw 60 add fwd 2.2.2.254 ip from 2.2.2.2 to any ipfw 70 add divert 8668 ip from any to 1.1.1.1 ipfw 80 add divert 8778 ip from any to 2.2.2.2 Некоторые замечания Реализация PBR в ОС FreeBSD средствами ipfw достаточна проста. Однако в некоторых ситуациях могут возникать непредвиденные осложнения, при которых рассмотренные выше примеры окажутся неработоспособными. Это произойдет, например, если на Вашем маршрутизаторе настроен web сервер (или какой-то другой сервис), который привязан к ip адресу внешнего интерфейса. Тогда необходимо вставить перед правилами, осуществляющим policy-based routing, правила, которые разрешат пользователям осуществить доступ к внешним интерфейсам. Важным моментом также является порядок и нумерация правил. Очень осторожно относитесь к этим вещам. Например, если в последнем примере все правила будут иметь один и тот же номер, то ничего хорошего из этого не выйдет. Это связано с особенностями обработки правил divert. Как известно, в ipfw каждый пакет проходит цепочку правил от правил с меньшими номерами к большим номерам до совпадения параметров пакета с параметрами правила. При "попадании" пакета в правило выполняются предписанные им действия, и дальнейшее прохождение по цепочке останавливается (пакет, конечно, может еще попасть в правила пакетного фильтра, например, при прохождении его через следующий сетевой интерфейс). Но при "попадании" пакета в правила divert прохождение по цепочке не останавливается, а продолжается с правила, номер которого превышает текущее на единицу. Т.е. если правила имеют одинаковый номер, то после правил divert в правила fwd пакет не "попадет". Если же Вы все сделали как надо, но все равно ничего не работает, то вставьте в правила параметр log. Например: ipfw 10 add divert 8778 log ip from 3.3.3.0/24 to 6.6.6.0/24 или ipfw 50 add fwd 1.1.1.254 log ip from 1.1.1.1 to any. Это позволит вам посмотреть в /var/log/security как "ходят" пакеты, в какие правила "попадают" (для этого необходимо включить в конфигурационном файле ядра ОС опцию IPFIREWALL_VERBOSE). Незаменимым инструментом при отладке также является программа tcpdump. С ее помощью Вы можете своими глазами увидеть и проверить все параметры пакетов данных, которые проходят через Ваш маршрутизатор.

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, noname, 18:10, 14/04/2003 [ответить] [смотреть все]
  • +/
    Хорошо написано!
     
  • 1.2, Аноним, 10:16, 16/04/2003 [ответить] [смотреть все]
  • +/
    да, довольно красиво :-)
     
  • 1.3, Александр, 13:05, 18/04/2003 [ответить] [смотреть все]
  • +/
    Спасибо))
     
  • 1.4, Аноним, 14:54, 29/04/2003 [ответить] [смотреть все]
  • +/
    А на Линухе это сделать можно? Извините за глупый вопрос.
     
  • 1.5, Kuks, 17:03, 06/05/2003 [ответить] [смотреть все]
  • +/
    Спасибо. Проверил сразу же. Все работает. :)
    Теперь бы найти такое же внятное объяснение о создании полноценного резервного канала т.е чтобы работали DNS,FTP,WWW,MAIL при выходе из строя одного из каналов.
     
  • 1.6, Dan, 18:18, 19/08/2004 [ответить] [смотреть все]  
  • +/
    Отличная статья! Спасибо.
    Только никак не могу понять как изложенное можно реализовать в сети где адреса раздаются DHCP и нужно выделить группу компьютеров с большим приоритетом чем все остальные. :(
     
  • 1.7, flashwolf, 22:44, 04/09/2004 [ответить] [смотреть все]  
  • +/
    Описан достаточно тривиальный прием.
    А в реальной жизни как правило надо большего - например, агрегирования провайдерских каналов для повышения суммарной пропускной способности и отказоустойчивости.
    Именно это пытался в статье найти - не нашел :(
     
  • 1.8, Beavis, 21:04, 18/01/2006 [ответить] [смотреть все]  
  • +/
    Сделал все как написано, работает, все ок!
    НО!
    Объсните пожалуйста почему так происходит:
    1)если не указывать ни какой дефаульт шлюз, то ни чего не работат.
    2)предположим мы третью сетевею поставили. если указать шлюз из ип пространства ТРЕТИЙ сетевой, все ок, работают оба канала....НО если в начале всех правил закрыть доступ к этому шлюзу, то ни чего не работает!

    Поясните, почему так происходит...

     
  • 1.9, gandalf, 00:55, 20/01/2006 [ответить] [смотреть все]  
  • +/
    Если в системе нет маршрута по умолчанию, то пакет не будет выходить никуда и как следствие не попадет в ipfw для форварда. Просто будет сообщение типа No route to host, т.к. хост не будет найден в таблице маршрутизации
     
     
  • 2.14, Beavis, 11:56, 13/10/2006 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    А если сделать шлюз поумолчанию 127 0 0 1 или ИП сетевухи, которая в локальную с... весь текст скрыт [показать] [показать ветку]
     
  • 1.10, moroxxx, 00:46, 23/01/2006 [ответить] [смотреть все]  
  • +/
    все сделал как написано http://www.opennet.ru/base/net/bsd_pbr_route.txt.html
    не работает.

     
  • 1.11, Дмитрий, 10:59, 13/04/2006 [ответить] [смотреть все]  
  • +/
    moroxxx, аналогично блин.
     
     
  • 2.12, moroxxx, 17:52, 04/07/2006 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    на FreeBSD 6.0 заработало
     
  • 2.16, flexxy, 20:08, 03/02/2007 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    тоже никак не хотело работать с правилом ipfw add fwd если важно FreeBSD... весь текст скрыт [показать] [показать ветку]
     
  • 2.17, reader, 08:58, 15/02/2007 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    FreeBSD 5 4 Не работает сеть, которая форвардится на default-шлюз - в инет по... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.18, reader, 09:01, 15/02/2007 [^] [ответить] [смотреть все]  
  • +/
    P S ядро скомпилено с нужными флагами два экземпляра НАТД запущены на правил... весь текст скрыт [показать]
     
  • 1.13, сарумян, 08:53, 18/07/2006 [ответить] [смотреть все]  
  • +/
    пока не добавил IPFIREWALL_FORWARD_EXTENDED не работал fwd
     
  • 1.15, Sergey, 13:47, 03/02/2007 [ответить] [смотреть все]  
  • +/
    asd
     
  • 1.19, gaidamak, 11:39, 16/02/2007 [ответить] [смотреть все]  
  • +/
    А подскажите, как в конфигурации с двумя внешними IP сделать, чтобы, ответы на запросы, пришедшие извне на внешний интерфейс А возвращались не по дефолтному роутингу, а через тот же интерфейс.
     
  • 1.20, Phil, 12:45, 21/02/2007 [ответить] [смотреть все]  
  • +/
    По этой теме:
    Сарумян правильно написал IPFIREWALL_FORWARD_EXTENDED нужно добавить в опции при сборке ядра. Иначе все будет ходить через дефаулт роутер (tcpdump ом проверьте), по этому и не срабатывает правило диверта обратного с дополнительного канала. Угробил на это 3 дня - Сарумян лучший =).
    Такая же фигня и в этой статье http://www.opennet.ru/base/net/2_channel_balancing.txt.html. Всем удачи!
     
  • 1.21, Юрий, 07:01, 05/03/2007 [ответить] [смотреть все]  
  • +/
    А всё тоже самое, только средствами pf ?
     
     
  • 2.23, moro, 14:00, 22/03/2007 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    >А всё тоже самое, только средствами pf ?
    есть подобное решение http://www.lissyara.su/?id=1276

     
  • 1.22, Zont, 15:27, 21/03/2007 [ответить] [смотреть все]  
  • +/
    хороший вопрос... мне он тоже интересен - точнее только ответ на него.
     
  • 1.24, sire, 16:55, 28/05/2007 [ответить] [смотреть все]  
  • +/
    А без natd в ipfw это никак нельзя сделать? Демон natd уж очень прожорливый на больших нагрузках.
     
     
  • 2.25, sire, 16:56, 28/05/2007 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    А без natd в ipfw это никак нельзя сделать? Демон natd уж очень прожорливый на больших нагрузках.

     
     
  • 3.29, Zont, 13:14, 21/11/2007 [^] [ответить] [смотреть все]  
  • +/
    RELENG_7 тебе в помощь.
     
  • 1.26, lama, 13:13, 18/06/2007 [ответить] [смотреть все]  
  • +/
    FreeBSD 6.2 , vsio rabotaet, vsio krasivo. No kak na sciot servisav priviazannix na vnesnije interfeisy routera. kno niti stalkivalsia? kak sdielati shtobe ani bili dostupni s vnutrenej setki. Kakije pravila nado dobavliat pered pravilami diverta: "Однако в некоторых ситуациях
    могут возникать непредвиденные осложнения, при которых рассмотренные выше примеры окажутся
    неработоспособными. Это произойдет, например, если на Вашем маршрутизаторе настроен web сервер
    (или какой-то другой сервис), который привязан к ip адресу внешнего интерфейса. Тогда  необходимо
    вставить перед правилами, осуществляющим policy-based routing, правила"
     
  • 1.27, Sasha_, 01:06, 21/08/2007 [ответить] [смотреть все]  
  • +/
    Привет !
    меняя default gw , работет то одна то другая сетка  :)
    без смены default gw НЕ РАБОТАЕТ :((
    fwd(no default) срабатывает , но ответы идут с default
    таже история..
    полдскажите плиз , уже нос в кровь разбил  :)
     
     
  • 2.28, Kos, 22:57, 21/09/2007 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    Какая версия фри?
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:





      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor