В сети 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.2210.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. Если это решаемо, можно сразу коротенький пример правил/настроек. Мануалов я уже начитался до белой горячки.
>[оверквотинг удален]
>Все шлюзы натят сетку 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.me/base/net/pf_faq.txt.html
>
>Вопросы следующие:
>1. Решаема-ли эта задача стандартными средствами?
>2. Если да, то можно-ли это сделать без использования алиасов(10.1.1.1 и 10.2.2.2)
>
>3. Можно-ли это сделать с помощью PF?
>4. Если это решаемо, можно сразу коротенький пример правил/настроек. Мануалов я уже
>начитался до белой горячки.
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
По логике должно работать, но не работает.
>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
>[оверквотинг удален]
>не в пришедших, а в исходящих
>
>>Во втором правиле все пакеты с адресом отправителя 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 перестает отвечать по сети даже на пинг.
Схема абсолютно не ясна.
>Схема абсолютно не ясна.Сеть: 10.0.0.0/24
Шлюзы: 10.0.0.1, 10.0.0.2, 10.0.0.3 (все шлюзы на разных машинах)
FreeBSD: 10.0.0.4FreeBSD(10.0.0.4) прописывается как дефолтный шлюз на всех клиентских машинах. При поступлении запросов от пользователей на 10.0.0.4, FreeBSD распределяет запросы пользователей по шлюзам (10.0.0.1, 10.0.0.2, 10.0.0.3) в зависимости от пользователя и запрашиваемого им адреса.
>>Схема абсолютно не ясна.
>
>Сеть: 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 ?
>[оверквотинг удален]
>>
>>Сеть: 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 равны нулю. Или речь не о них?
Рисую.
Сеть: 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.
Потом подключаешь таблицы в зависимости от адреса источника или адреса назначния.
Каждому клиенту будет выдаваться своий маршрут по-умолчанию.
>[оверквотинг удален]
>Клиенты всё шлют на 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.
>Потом подключаешь таблицы в зависимости от адреса источника или адреса назначния.
>Каждому клиенту будет выдаваться своий маршрут по-умолчанию.К сожалению такой вариант не подходит. К одним адресам пользователи подключаются через один шлюз, к другим через другой шлюз.
и в чем проблема?
клинеты ходят разными шлюзами в зависимости от адреса назначения.
>[оверквотинг удален]
>>>По логике должно работать, но не работает.
>>
>>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 на шлюзе на который перенаправляете и на шлюзе по умолчанию
>[оверквотинг удален]
>>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?
>[оверквотинг удален]
>>на шлюзе на который перенаправляете и на шлюзе по умолчанию
>
>Да, поторопился я с правилами.
>Логика маршрутизации, как я себе это представляю:
>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?
>
>[оверквотинг удален]
>
>на входе
>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 блокирует любую сетевую активность при этом не отображая никаких пакетов.
>[оверквотинг удален]
>>
>>и tcpdump на 10.0.0.2
>>>
>>>pass in on le0 from any to any
>>>
>>>Сдается мне я где-то упускаю возвращаемые пакеты. Может здесь необходимо добавить reply-to?
>>>
>
>Увы, всеравно бросает все через defaultrouter и tcpdump блокирует любую сетевую активность
>при этом не отображая никаких пакетов.тогда ставьте логирование правил, что бы видеть попадают пакеты в правила, или поставьте pftop ( там стрелочки влево, вправо ) будите видеть в реальном режиме какие правила срабатывают или pfctl используйте.
вывод pfctl -s all покажите.
>[оверквотинг удален]
>>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?
>[оверквотинг удален]
>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?
>ээээ, это уже было :)
где-то так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