URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 88785
[ Назад ]

Исходное сообщение
"Несколько шлюзов в одной сети"

Отправлено Double , 22-Апр-10 16:34 
В сети 10.0.0/24 три шлюза:
10.0.0.1
10.0.0.2(алиас 10.1.1.1)
10.0.0.3(алиас 10.2.2.2)

FreeBSD 7.2(vmware):
(le0) 10.0.0.4
(le1) 10.1.1.11
(le2) 10.2.2.22

10.0.0.1 - дорогой, быстрый, стабильный.
10.0.0.2 и 3 - медленные, анлим, падучие.
Все шлюзы натят сетку 10.0.0/24 во внешний мир.

Подцепить шлюзы физически на машину с FreeBSD не получится.

Идея была - прописать у всех пользователей в сети 10.0.0.4 как шлюз, а 10.0.0.4 сам будет решать в зависимости от правил к какому из шлюзов направить запрос. Грубо говоря логика планировалась следующая: все сайты которые касаются работы - проходят через 10.0.0.1, остальные через 10.0.0.2 и 10.0.0.3

Посоветовали делать это через PF, но увы, у меня не получилось. Споткнулся я на том, что шлюзы на FreeBSD не ведут в инет, а ведут в сетку, в которой есть шлюз в инет. NAT правила не срабатывают, в итоге трафик течет по шлюзу указанному в defaultrouter. Тогда я сделал алиасы для шлюзов, чтобы каждый шлюз был в своей подсетке, но и тут меня ждала неудача. Фрюха роутит только в гейт указанный в defaultrouter, как объяснить фрюхе, что если она натит пакет в сеть 10.2.2/24, то там есть шлюз 10.2.2.2, в который нужно передать пакет.

Вопросы следующие:
1. Решаема-ли эта задача стандартными средствами?
2. Если да, то можно-ли это сделать без использования алиасов(10.1.1.1 и 10.2.2.2)
3. Можно-ли это сделать с помощью PF?
4. Если это решаемо, можно сразу коротенький пример правил/настроек. Мануалов я уже начитался до белой горячки.


Содержание

Сообщения в этом обсуждении
"Несколько шлюзов в одной сети"
Отправлено reader , 22-Апр-10 20:42 
>[оверквотинг удален]
>Все шлюзы натят сетку 10.0.0/24 во внешний мир.
>
>Подцепить шлюзы физически на машину с FreeBSD не получится.
>
>Идея была - прописать у всех пользователей в сети 10.0.0.4 как шлюз,
>а 10.0.0.4 сам будет решать в зависимости от правил к какому
>из шлюзов направить запрос. Грубо говоря логика планировалась следующая: все сайты
>которые касаются работы - проходят через 10.0.0.1, остальные через 10.0.0.2 и
>10.0.0.3
>

если вы собираетесь рулить сайтами то используйте прокси, если по ip то продолжайте мучить pf.

>Посоветовали делать это через PF, но увы, у меня не получилось. Споткнулся
>я на том, что шлюзы на FreeBSD не ведут в инет,
>а ведут в сетку, в которой есть шлюз в инет. NAT
>правила не срабатывают, в итоге трафик течет по шлюзу указанному в
>defaultrouter. Тогда я сделал алиасы для шлюзов, чтобы каждый шлюз был
>в своей подсетке, но и тут меня ждала неудача. Фрюха роутит
>только в гейт указанный в defaultrouter, как объяснить фрюхе, что если
>она натит пакет в сеть 10.2.2/24, то там есть шлюз 10.2.2.2,
>в который нужно передать пакет.

для переопределения шлюза используйте route-to.

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

если вы меняете , с помощью nat, адрес источника в пакете, и больше ничего не делаете, то это не повлияет на маршрут, но с помощью route-to вы можете заставить пакет идти через другой шлюз.

http://www.opennet.ru/base/net/pf_faq.txt.html

>
>Вопросы следующие:
>1. Решаема-ли эта задача стандартными средствами?
>2. Если да, то можно-ли это сделать без использования алиасов(10.1.1.1 и 10.2.2.2)
>
>3. Можно-ли это сделать с помощью PF?
>4. Если это решаемо, можно сразу коротенький пример правил/настроек. Мануалов я уже
>начитался до белой горячки.


"Несколько шлюзов в одной сети"
Отправлено Double , 23-Апр-10 20:04 
defaultrouter в rc.conf не задан.
В очередной раз удалил конфиг pf.
Сделал минимум:

set skip on lo0
nat on le1 from 10.1.1.0/24 to any -> 10.1.1.11
pass out on route-to (le1 10.1.1.1) from 10.1.1.11 to any

Если я правильно понимаю смысл этих правил, то в первом правиле любому пакету поступившиму на le1 интерфейс заменяется адрес отправителя на 10.1.1.11
Во втором правиле все пакеты с адресом отправителя 10.1.1.11 кидаются на адрес 10.1.1.1
По логике должно работать, но не работает.



"Несколько шлюзов в одной сети"
Отправлено reader , 24-Апр-10 00:17 
>defaultrouter в rc.conf не задан.
>В очередной раз удалил конфиг pf.
>Сделал минимум:
>
>set skip on lo0
>nat on le1 from 10.1.1.0/24 to any -> 10.1.1.11
>pass out on route-to (le1 10.1.1.1) from 10.1.1.11 to any
>
>Если я правильно понимаю смысл этих правил, то в первом правиле любому
>пакету поступившиму на le1 интерфейс заменяется адрес отправителя на 10.1.1.11

не в пришедших, а в исходящих

>Во втором правиле все пакеты с адресом отправителя 10.1.1.11 кидаются на адрес
>10.1.1.1
>По логике должно работать, но не работает.

pass in on le1 route-to (le1 10.1.1.1) from 10.1.1.0/24 to any

пакеты пришедшие через le1 из 10.1.1.0/24, отправить через интерфейс le1 на шлюз 10.1.1.1


"Несколько шлюзов в одной сети"
Отправлено Double , 29-Апр-10 14:01 
>[оверквотинг удален]
>не в пришедших, а в исходящих
>
>>Во втором правиле все пакеты с адресом отправителя 10.1.1.11 кидаются на адрес
>>10.1.1.1
>>По логике должно работать, но не работает.
>
>pass in on le1 route-to (le1 10.1.1.1) from 10.1.1.0/24 to any
>
>пакеты пришедшие через le1 из 10.1.1.0/24, отправить через интерфейс le1 на шлюз
>10.1.1.1

Увы, не работает. Я помойму перебрал уже все возможные варианты. Решил пробовать роутить пакеты в локальной сети, без алиасов. Т.е. пробрасывать пакеты с FreeBSD на локальные шлюзы.
nat on le0 from any to any -> 10.0.0.4
pass in on le0 from any to any
pass out on le0 from any to any

шлюзы в сети: 10.0.0.1, 10.0.0.2, 10.0.0.3
FreeBSD: 10.0.0.4

И еще интересный глюк обнаружился - при включении tcpdump FreeBSD перестает отвечать по сети даже на пинг.


"Несколько шлюзов в одной сети"
Отправлено rr , 29-Апр-10 14:25 
Схема абсолютно не ясна.

"Несколько шлюзов в одной сети"
Отправлено Double , 29-Апр-10 15:52 
>Схема абсолютно не ясна.

Сеть: 10.0.0.0/24
Шлюзы: 10.0.0.1, 10.0.0.2, 10.0.0.3 (все шлюзы на разных машинах)
FreeBSD: 10.0.0.4

FreeBSD(10.0.0.4) прописывается как дефолтный шлюз на всех клиентских машинах. При поступлении запросов от пользователей на 10.0.0.4, FreeBSD распределяет запросы пользователей по шлюзам (10.0.0.1, 10.0.0.2, 10.0.0.3) в зависимости от пользователя и запрашиваемого им адреса.


"Несколько шлюзов в одной сети"
Отправлено rr , 29-Апр-10 17:04 
>>Схема абсолютно не ясна.
>
>Сеть: 10.0.0.0/24
>Шлюзы: 10.0.0.1, 10.0.0.2, 10.0.0.3 (все шлюзы на разных машинах)
>FreeBSD: 10.0.0.4
>
>FreeBSD(10.0.0.4) прописывается как дефолтный шлюз на всех клиентских машинах. При поступлении запросов
>от пользователей на 10.0.0.4, FreeBSD распределяет запросы пользователей по шлюзам (10.0.0.1,
>10.0.0.2, 10.0.0.3) в зависимости от пользователя и запрашиваемого им адреса.

на FreeBSD выключены редирект сообщения icmp ?


"Несколько шлюзов в одной сети"
Отправлено Double , 29-Апр-10 19:03 
>[оверквотинг удален]
>>
>>Сеть: 10.0.0.0/24
>>Шлюзы: 10.0.0.1, 10.0.0.2, 10.0.0.3 (все шлюзы на разных машинах)
>>FreeBSD: 10.0.0.4
>>
>>FreeBSD(10.0.0.4) прописывается как дефолтный шлюз на всех клиентских машинах. При поступлении запросов
>>от пользователей на 10.0.0.4, FreeBSD распределяет запросы пользователей по шлюзам (10.0.0.1,
>>10.0.0.2, 10.0.0.3) в зависимости от пользователя и запрашиваемого им адреса.
>
>на FreeBSD выключены редирект сообщения icmp ?

log_redirect и drop_redirect равны нулю. Или речь не о них?


"Несколько шлюзов в одной сети"
Отправлено rr , 30-Апр-10 08:38 
Рисую.
Сеть: 10.0.0.0/24
Шлюзы: 10.0.0.1, 10.0.0.2, 10.0.0.3 (все шлюзы на разных машинах)
FreeBSD: 10.0.0.4 со шлюзом по-умолчанию - скажем 10.0.0.1
Клиенты: сеть 10.0.0.0/24 со шлюзом по-умолчанию 10.0.0.4

Клиенты всё шлют на 10.0.0.4, как на шлюз по-умолчанию.
Хост 10.0.0.4 в свою очередь шлет icmp сообщения клиенту, что в сети есть шлюз 10.0.0.1.
У клиента появляется новый маршрут по умолчанию, указывающий на шлюз 10.0.0.1.
В следующий раз клиент всё шлет на новый шлюз 10.0.0.1, т.е. на 10.0.0.4 ничего не попадает.

А вот если попробывать множественные таблицы маршрутизации Freebsd.
Потом подключаешь таблицы в зависимости от адреса источника или адреса назначния.
Каждому клиенту будет выдаваться своий маршрут по-умолчанию.


"Несколько шлюзов в одной сети"
Отправлено Double , 30-Апр-10 14:45 
>[оверквотинг удален]
>Клиенты всё шлют на 10.0.0.4, как на шлюз по-умолчанию.
>Хост 10.0.0.4 в свою очередь шлет icmp сообщения клиенту, что в сети
>есть шлюз 10.0.0.1.
>У клиента появляется новый маршрут по умолчанию, указывающий на шлюз 10.0.0.1.
>В следующий раз клиент всё шлет на новый шлюз 10.0.0.1, т.е. на
>10.0.0.4 ничего не попадает.
>
>А вот если попробывать множественные таблицы маршрутизации Freebsd.
>Потом подключаешь таблицы в зависимости от адреса источника или адреса назначния.
>Каждому клиенту будет выдаваться своий маршрут по-умолчанию.

К сожалению такой вариант не подходит. К одним адресам пользователи подключаются через один шлюз, к другим через другой шлюз.


"Несколько шлюзов в одной сети"
Отправлено rr , 30-Апр-10 14:52 
и в чем проблема?
клинеты ходят разными шлюзами в зависимости от адреса назначения.

"Несколько шлюзов в одной сети"
Отправлено reader , 29-Апр-10 14:27 
>[оверквотинг удален]
>>>По логике должно работать, но не работает.
>>
>>pass in on le1 route-to (le1 10.1.1.1) from 10.1.1.0/24 to any
>>
>>пакеты пришедшие через le1 из 10.1.1.0/24, отправить через интерфейс le1 на шлюз
>>10.1.1.1
>
>Увы, не работает. Я помойму перебрал уже все возможные варианты. Решил пробовать
>роутить пакеты в локальной сети, без алиасов. Т.е. пробрасывать пакеты с
>FreeBSD на локальные шлюзы.

то есть остается один le0 интерфейс на машине?
если да, то так вы будите натить и ответы идущие к клиенту, а этого делать нельзя
>nat on le0 from any to any -> 10.0.0.4
>pass in on le0 from any to any
>pass out on le0 from any to any
>
>шлюзы в сети: 10.0.0.1, 10.0.0.2, 10.0.0.3
>FreeBSD: 10.0.0.4
>
>И еще интересный глюк обнаружился - при включении tcpdump FreeBSD перестает отвечать
>по сети даже на пинг.

такого у меня не было, как вариант пока не разберетесь запускать tcpdump на шлюзе на который перенаправляете и на шлюзе по умолчанию


"Несколько шлюзов в одной сети"
Отправлено Double , 29-Апр-10 16:00 
>[оверквотинг удален]
>>pass out on le0 from any to any
>>
>>шлюзы в сети: 10.0.0.1, 10.0.0.2, 10.0.0.3
>>FreeBSD: 10.0.0.4
>>
>>И еще интересный глюк обнаружился - при включении tcpdump FreeBSD перестает отвечать
>>по сети даже на пинг.
>
>такого у меня не было, как вариант пока не разберетесь запускать tcpdump
>на шлюзе на который перенаправляете и на шлюзе по умолчанию

Да, поторопился я с правилами.
Логика маршрутизации, как я себе это представляю:
1. С клиента на FreeBSD le0 10.0.0.4 приходит пакет
2. PF натит этот пакет, заменяя адрес отправителя на свой
3. Меняет заголовк IP подставляя следующим хопом настоящий роутер.

nat on le0 from !(self) to any -> 10.0.0.4
pass out on le0 on route-to (le0 10.0.0.2) from 10.0.0.4 to any
pass in on le0 from any to any

Сдается мне я где-то упускаю возвращаемые пакеты. Может здесь необходимо добавить reply-to?


"Несколько шлюзов в одной сети"
Отправлено reader , 29-Апр-10 16:31 
>[оверквотинг удален]
>>на шлюзе на который перенаправляете и на шлюзе по умолчанию
>
>Да, поторопился я с правилами.
>Логика маршрутизации, как я себе это представляю:
>1. С клиента на FreeBSD le0 10.0.0.4 приходит пакет
>2. PF натит этот пакет, заменяя адрес отправителя на свой
>3. Меняет заголовк IP подставляя следующим хопом настоящий роутер.
>
>nat on le0 from !(self) to any -> 10.0.0.4
>pass out on le0 on route-to (le0 10.0.0.2) from 10.0.0.4 to any

на входе
pass in on le0 route-to (le0 10.0.0.2) from any to ! 10.0.0.0/24
и tcpdump на 10.0.0.2
>
>pass in on le0 from any to any
>
>Сдается мне я где-то упускаю возвращаемые пакеты. Может здесь необходимо добавить reply-to?
>


"Несколько шлюзов в одной сети"
Отправлено Double , 29-Апр-10 19:19 
>[оверквотинг удален]
>
>на входе
>pass in on le0 route-to (le0 10.0.0.2) from any to ! 10.0.0.0/24
>
>и tcpdump на 10.0.0.2
>>
>>pass in on le0 from any to any
>>
>>Сдается мне я где-то упускаю возвращаемые пакеты. Может здесь необходимо добавить reply-to?
>>

Увы, всеравно бросает все через defaultrouter и tcpdump блокирует любую сетевую активность при этом не отображая никаких пакетов.


"Несколько шлюзов в одной сети"
Отправлено reader , 29-Апр-10 20:57 
>[оверквотинг удален]
>>
>>и tcpdump на 10.0.0.2
>>>
>>>pass in on le0 from any to any
>>>
>>>Сдается мне я где-то упускаю возвращаемые пакеты. Может здесь необходимо добавить reply-to?
>>>
>
>Увы, всеравно бросает все через defaultrouter и tcpdump блокирует любую сетевую активность
>при этом не отображая никаких пакетов.

тогда ставьте логирование правил, что бы видеть попадают пакеты в правила, или поставьте pftop ( там стрелочки влево, вправо ) будите видеть в реальном режиме какие правила срабатывают или pfctl используйте.

вывод pfctl -s all покажите.


"Несколько шлюзов в одной сети"
Отправлено Double , 29-Апр-10 17:01 
>[оверквотинг удален]
>>pass out on le0 from any to any
>>
>>шлюзы в сети: 10.0.0.1, 10.0.0.2, 10.0.0.3
>>FreeBSD: 10.0.0.4
>>
>>И еще интересный глюк обнаружился - при включении tcpdump FreeBSD перестает отвечать
>>по сети даже на пинг.
>
>такого у меня не было, как вариант пока не разберетесь запускать tcpdump
>на шлюзе на который перенаправляете и на шлюзе по умолчанию

Да, поторопился я с правилами.
Логика маршрутизации, как я себе это представляю:
1. С клиента на FreeBSD le0 10.0.0.4 приходит пакет
2. PF натит этот пакет, заменяя адрес отправителя на свой
3. Меняет заголовк IP подставляя следующим хопом настоящий роутер.

nat on le0 from !(self) to any -> 10.0.0.4
pass out on le0 on route-to (le0 10.0.0.2) from 10.0.0.4 to any
pass in on le0 from any to any

Сдается мне я где-то упускаю возвращаемые пакеты. Может здесь необходимо добавить reply-to?


"Несколько шлюзов в одной сети"
Отправлено reader , 29-Апр-10 17:47 
>[оверквотинг удален]
>2. PF натит этот пакет, заменяя адрес отправителя на свой
>3. Меняет заголовк IP подставляя следующим хопом настоящий роутер.
>
>nat on le0 from !(self) to any -> 10.0.0.4
>pass out on le0 on route-to (le0 10.0.0.2) from 10.0.0.4 to any
>
>pass in on le0 from any to any
>
>Сдается мне я где-то упускаю возвращаемые пакеты. Может здесь необходимо добавить reply-to?
>

ээээ, это уже было :)


"Несколько шлюзов в одной сети"
Отправлено rr , 30-Апр-10 08:44 
где-то так

one=1
two=2
three=3
setfib $one   route add default 10.0.0.1
setfib $two   route add default 10.0.0.2
setfib $three route add default 10.0.0.3


в правилах ipfw
setfib 1 ip from any to aaa.bbb.ccc.ddd
setfib 2 ip from any to AAA.BBB.CCC.DDD
setfib 3 ip from any to eee.fff.ggg.hhh