The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Как организовать Policy Routing на ..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Как организовать Policy Routing на ..."  +/
Сообщение от auto_tips (??) on 30-Мрт-07, 14:08 
ipfw add 100 fwd 10.0.0.2 ip from 10.0.2.0/24 to any

Если нужно использовать 2 шлюза, то можно воспользоваться:
  ipfw add  fwd $ext_gw_ip ip from $ext_net to any out xmit $ext_int

URL:
Обсуждается: http://www.opennet.ru/tips/info/158.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как организовать Policy Routing на FreeBSD"  +/
Сообщение от tty (??) on 30-Мрт-07, 14:08 
Практическая реализация в ОС 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 пакет не "попадет". Вообще, как ведет себя пакет после "попадания" в правила divert определяется той программой, которой он обрабатывается. В нашем случае это natd. А natd работает именно так, как описано выше.

Если же Вы все сделали как надо, но все равно ничего не работает, то вставьте в правила параметр 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. С ее помощью Вы можете своими глазами увидеть и проверить все параметры пакетов данных, которые проходят через Ваш маршрутизатор.

Текст взят с http://ipfw.ism.kiev.ua/pbr.html

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Схема построения PBR на  IPFW"  +/
Сообщение от PavelR (??) on 27-Фев-08, 06:03 
Схема построения PBR на  IPFW

; Разрешаем траффик, который не надо натить - т.е. из локальных сетей в локальные сети
00100 allow all from <localnet> to any out xmit <Локальный интерфейс1>
00105 allow all from <localnet> to any out xmit <Локальный интерфейс2>
; где-то тут надо бы добавить правила, чтобы локальная сеть видела внешние айпишники рутера
; может быть это "100 allow from any to any out xmit <локальные интерфейсы>"
; но для начала и так пойдет. Проблема будет в том, что с внешнего айпи пакеты будут
;форвардиться во внешний интерфейс, даже если они должны были пойти в локалку.


#Заворачиваем на нат всё что пытается покинуть рутер через внешний интерфейс (внутрений трафик разрешен сотыми правилами)
;заворачиваем с разных айпи траффик на разный нат
00200 divert 8668 ip from 192.168.0.200 to any out
00205 divert 8667 ip from 192.168.0.100 to any out

; тут можно вставить вырезание пакетов, идущих во внешние сети с приватным src-адресом
;00250 reject all from 192.168.0.0/16 to any out

;разрешаем пакетам, которые идут куда надо идти куда они идут :)
00400 allow all from  <айпи канал1> to <сеть интерфейс1> out xmit <Интерфейс1>
00405 allow all from  <айпи канал2> to <сеть интерфейс2> out xmit <Интерфейс2>

; меняем интерфейс назначения, если надо идти через шлюз
; форвардим даже если требуемый шлюз является шлюзом по умолчанию, для упрощения правил.

00500 fwd <айпи шлюза сеть1> ip from <айпи канал1> to any out
00505 fwd <айпи шлюза сеть2> ip from <айпи канал2> to any out  

; Форвард нужен только если пакет идет не в свой интерфейс, т.е. более полный вариант для двух интерфейсов (больше интерфейсов - геометрически больше правил):

;00500 fwd <айпи шлюза сеть1> ip from <айпи канал1> to any out via <Интерфейс2>
;00505 fwd <айпи шлюза сеть2> ip from <айпи канал2> to any out via <Интерфейс1>

;00510 allow ip from <айпи канал1> to any out via <Интерфейс1>
;00515 allow ip from <айпи канал2> to any out via <Интерфейс2>

# Не забываем пронатить всё это дело обратно
00600 divert 8668 ip from any  to any in recv <Интерфейс1>
00605 divert 8667 ip from any  to any in recv <Интерфейс2>

# и разрешить обратное прохождение пакетов, например так
00610 allow from any to 192.168.0.0/24 in recv <Интерфейс1>
00615 allow from any to 192.168.0.0/24 in recv <Интерфейс2>


ну и соответственно при запуске natd должно быть так, что:
natd -a <айпи канал1> -p 8668
natd -a <айпи канал2> -p 8667

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру