Jump to content
Калькуляторы

freebsd, как машрутизировать одну подсеть через разные интерфейсы?

Провайдер дает 1.1.1.0/29 подсеть. В маршрутизатор от свитча провайдера идет 2 патчкорда, в em1 и em2. Задача часть локальных адресов выпускать в мир через 1.1.1.2, а часть через 1.1.1.3. Возможности организовать ЛАГ нет. Пробовал через setfib делать, но во второй таблице маршрутизации висит маршрут к default route, только через em1, и удалить его не получается. Подскажите как тут быть?

Edited by ytil

Share this post


Link to post
Share on other sites

7 минут назад, gruber сказал:

Два NAT-а, один с 1.1.1.2 а второй c 1.1.1.3 и соответствующие правила в ipfw / pf ?

 

 

 

так у меня не заработало, NATил через pf, и работало только через em1

Share this post


Link to post
Share on other sites

Для начала надо самому себе честно ответить на вопрос: как должны ходить пакеты?

Если тебе нужна балансировка какая то - это сложнее, если просто типа разные отделы/конторы пустить с разных IP - настраивай правилами фаера.

FIB - таблицы маршрутизации, они для случаев когда у тебя раздельные л2.

Share this post


Link to post
Share on other sites

8 минут назад, Ivan_83 сказал:

они для случаев когда у тебя раздельные л2

У ТС ведь они разные, у него два разных интерфейса.

Share this post


Link to post
Share on other sites

12 минут назад, Ivan_83 сказал:

Для начала надо самому себе честно ответить на вопрос: как должны ходить пакеты?

Если тебе нужна балансировка какая то - это сложнее, если просто типа разные отделы/конторы пустить с разных IP - настраивай правилами фаера.

FIB - таблицы маршрутизации, они для случаев когда у тебя раздельные л2.

да, мне нужно чтобы просто отделы с нужных айпишников ходили, но проблема в том, что на втором интерфейсе у меня не НАТятся адреса почему-то

 

это PF на маршрутизаторе

isp1_if = "em1"
isp2_if = "em2"
int_if = "em3"


table <lan1> {192.168.66.0/24}
table <lan2> {192.168.67.0/24}

set limit { states 10000000, frags 15000 }

set skip on lo0
set skip on $int_if
scrub in all fragment reassemble


nat on $isp1_if from <lan1> to any -> ($isp1_if)
nat on $isp2_if from <lan2> to any -> ($isp2_if)

rc.conf

hostname="bsd1"
ifconfig_em1="inet 1.1.1.2/29"
ifconfig_em2="inet 1.1.1.3/29"
ifconfig_em3="inet 192.168.66.1/24"
ifconfig_em3_alias0="inet 192.168.67.1/24"
defaultrouter="1.1.1.1"
gateway_enable="YES"

что тут не так? почему не НАТится сеть 192.168.67.0/24?

 

Share this post


Link to post
Share on other sites

Наверное потому что это альяс. Да и int_if я бы в скобки обернул.

Кроме того, defaultrouter скорее всего навешивается на какой-то один интерфейс.

Его нужно задать для обоих интерфейсов.

Share this post


Link to post
Share on other sites

2 минуты назад, alibek сказал:

Наверное потому что это альяс.

Кроме того, defaultrouter скорее всего навешивается на какой-то один интерфейс.

Его нужно задать для обоих интерфейсов.

defaultroute висит на em1 сейчас

Прошу, скажите, как defaultroute навесить одновременно на 2 интерфейса?

ядро собрано с поддержкой radix_mpath

 

 

Edited by ytil

Share this post


Link to post
Share on other sites

Я уже FreeBSD не использую, но как-то так:

static_routes="r1 r2"
route_r1="default 10.1.1.1 -interface em1"
route_r2="default 10.1.1.1 -interface em2"

Или просто в rc.local добавить команды route add.

Share this post


Link to post
Share on other sites

6 минут назад, alibek сказал:

Я уже FreeBSD не использую, но как-то так:


static_routes="r1 r2"
route_r1="default 10.1.1.1 -interface em1"
route_r2="default 10.1.1.1 -interface em2"

Или просто в rc.local добавить команды route add.

к сожалению не работает

 

через rc.conf не назначаются маршруты

 

через 

# route add default 1.1.1.1 -interface em1

# route: bad address: em1

 

Share this post


Link to post
Share on other sites

4 минуты назад, alibek сказал:

А netstat -nr что показывает?

ничего не показывает, маршрута по умолчанию в нем нет. Похоже конструкция неправильная или же freebsd это не может..

Share this post


Link to post
Share on other sites

setfib вроде и не нужен, должно хватить двух ipfw nat с разными правилами ipfw. Трафик одной сети будет натиться в 1 ип, трафик второй в другой. остальные правила skip to чтобы чужой трафик не попадал в чужой нат.

 

 Хотя вешать Ip из одной подсети на разные интерфейсы - плохая идея. Я бы принял /29 от провайдера на 1 интерфейс 1.1.1.2/29, и повесил, уж если надо для ipfw nat алиасом бы добавил 1.1.1.3/32. В результате - ipfw nat можно вешать и на 1.1.1.2 и на 1.1.1.3. Правила скипту - по источникам, что, что должно идти на 10.1.1.2 скипается на правило nat1, и наоборот, в общем тривиально.

Share this post


Link to post
Share on other sites

2 часа назад, ytil сказал:

это PF на маршрутизаторе

 

2 часа назад, ytil сказал:

что тут не так? почему не НАТится сеть 192.168.67.0/24?

Тебе нужно прописать reply-to / route-to дополнительно к натам, вместо того чтобы корячится с маршрутами.

Или rdr-to.

2 часа назад, ytil сказал:

nat on $isp1_if from <lan1> to any -> ($isp1_if) nat on $isp2_if from <lan2> to any -> ($isp2_if)

Вот эти два правила на самом деле не в интерфейс пихают, они берут IP адрес с интерфейса и заменяют срц в пакте на него, а дальше пакет уходит по таблице маршрутизации.

Вот чтобы это переопределить нужно ещё как минимум одно правило накорябать.

Либо тебе нужно два фиба и навешивать их в правилах pass ещё до ната, ну и дальше у тебя будет две таблицы маршрутизации и никаких проблем с двумя дефолтами.

А тебе точно нужно через разные интерфейсы отправлять? потому что можно и с одного интерфейса всё отправлять но с разных срц адресов.

 

2 часа назад, alibek сказал:

Да и int_if я бы в скобки обернул.

Вредный совет для статических то адресов.

Скобочки означают перечитывать адрес с интерфейса каждый раз когда правило обрабатывает пакет, паразитная нагрузка на ровном месте. На не операторском трафике и х86 конечно не заметно будет.

 

2 часа назад, alibek сказал:

Кроме того, defaultrouter скорее всего навешивается на какой-то один интерфейс.

Он в принципе всегда ОДИН.

Как вы это не поймёте уже.

Есть таблица маршрутизации, там всё вида:

дст - нехт хоп

1.1.1.1/32 2.2.2.2

Когда по ней делается лукап(поиск) то ищется запись с наибольшим префиксом, те 32- рулит, потом 31 и когда совсем никуя нет то 0 = 0.0.0.0/32. Их две быть не может. Вернее конечно же может быть и 100500 но находить всегда будет только одну такую запись.

 

2 часа назад, ytil сказал:

Прошу, скажите, как defaultroute навесить одновременно на 2 интерфейса?

ядро собрано с поддержкой radix_mpath

Никак.

Одна таблица маршрутизации - один дефолт.

Радикс мне кажется немного про другое.

 

1 час назад, YuryD сказал:

Трафик одной сети будет натиться в 1 ип, трафик второй в другой. остальные правила skip чтобы чужой трафик не попадал в чужой нат.

Да, хорошо, он и так его отнатил в разные адреса.

Но ТС почему то хочет слать его в разные интерфейсы, а после ната пакеты уходят согласно таблице маршрутизации.

Share this post


Link to post
Share on other sites

16 минут назад, Ivan_83 сказал:

Да, хорошо, он и так его отнатил в разные адреса.

Но ТС почему то хочет слать его в разные интерфейсы, а после ната пакеты уходят согласно таблице маршрутизации.

 Ну для меня это как-то извращенно :) Ну и да, когда я баловался setfib, что-то мне говорило, что цпу нагружался довольно сильно, а когда одна подсеть на разных интерфейсах, это у меня в моих проектах не укладывается, хотя клиентов-извращенцев маршрутизации хватает.

 

 Пример извращения, клиент берет /29, и просит это смаршрузовать  на один ip свой. Комп под виндой-сервером, с одним интерфейсом.

Другие примеры - их куча, на вопрос нанапуркуя, ответ - а у нас каптива, типа сама разберется. Таких удодов у меня в клиентах полно. В основном - банчки и крупные предприниматели.

Share this post


Link to post
Share on other sites

Требуется жёстко именно так - 

19 часов назад, ytil сказал:

1.1.1.2, а часть через 1.1.1.3

т.е. "2" и "3" и никак иначе?

Это я к тому, что например мешает порезать /29 на две /30 и заюзать PBR?

Вот это вроде как Ваш случай.

Share this post


Link to post
Share on other sites

1 час назад, AlKov сказал:

Требуется жёстко именно так - 

т.е. "2" и "3" и никак иначе?

Это я к тому, что например мешает порезать /29 на две /30 и заюзать PBR?

Вот это вроде как Ваш случай.

провайдер может дать только /29

Share this post


Link to post
Share on other sites

18 минут назад, ytil сказал:

провайдер может дать только /29

Гм.. И? Что не так? Или Вы не в курсе, что ДВЕ /30 "вписываются" в ОДНУ /29 ?

Т.о. для провайдера это может быть ОДНА /29, а для Вас - ДВЕ /30

10.10.1.0/29:

Address:   10.10.1.0            00001010.00001010.00000001.00000 000
Netmask:   255.255.255.248 = 29 11111111.11111111.11111111.11111 000
Wildcard:  0.0.0.7              00000000.00000000.00000000.00000 111
=>
Network:   10.10.1.0/29         00001010.00001010.00000001.00000 000
HostMin:   10.10.1.1            00001010.00001010.00000001.00000 001
HostMax:   10.10.1.6            00001010.00001010.00000001.00000 110
Broadcast: 10.10.1.7            00001010.00001010.00000001.00000 111
Hosts/Net: 6                     Class A, Private Internet

10.10.1.0/30:

Address:   10.10.1.0            00001010.00001010.00000001.000000 00
Netmask:   255.255.255.252 = 30 11111111.11111111.11111111.111111 00
Wildcard:  0.0.0.3              00000000.00000000.00000000.000000 11
=>
Network:   10.10.1.0/30         00001010.00001010.00000001.000000 00
HostMin:   10.10.1.1            00001010.00001010.00000001.000000 01
HostMax:   10.10.1.2            00001010.00001010.00000001.000000 10
Broadcast: 10.10.1.3            00001010.00001010.00000001.000000 11
Hosts/Net: 2                     Class A, Private Internet

10.10.1.4/30:

Address:   10.10.1.4            00001010.00001010.00000001.000001 00
Netmask:   255.255.255.252 = 30 11111111.11111111.11111111.111111 00
Wildcard:  0.0.0.3              00000000.00000000.00000000.000000 11
=>
Network:   10.10.1.4/30         00001010.00001010.00000001.000001 00
HostMin:   10.10.1.5            00001010.00001010.00000001.000001 01
HostMax:   10.10.1.6            00001010.00001010.00000001.000001 10
Broadcast: 10.10.1.7            00001010.00001010.00000001.000001 11
Hosts/Net: 2                     Class A, Private Internet

 

Share this post


Link to post
Share on other sites

3 минуты назад, AlKov сказал:

Гм.. И? Что не так? Или Вы не в курсе, что ДВЕ /30 "вписываются" в ОДНУ /29 ?

Т.о. для провайдера это может быть ОДНА /29, а для Вас - ДВЕ /30


10.10.1.0/29:

Address:   10.10.1.0            00001010.00001010.00000001.00000 000
Netmask:   255.255.255.248 = 29 11111111.11111111.11111111.11111 000
Wildcard:  0.0.0.7              00000000.00000000.00000000.00000 111
=>
Network:   10.10.1.0/29         00001010.00001010.00000001.00000 000
HostMin:   10.10.1.1            00001010.00001010.00000001.00000 001
HostMax:   10.10.1.6            00001010.00001010.00000001.00000 110
Broadcast: 10.10.1.7            00001010.00001010.00000001.00000 111
Hosts/Net: 6                     Class A, Private Internet

10.10.1.0/30:

Address:   10.10.1.0            00001010.00001010.00000001.000000 00
Netmask:   255.255.255.252 = 30 11111111.11111111.11111111.111111 00
Wildcard:  0.0.0.3              00000000.00000000.00000000.000000 11
=>
Network:   10.10.1.0/30         00001010.00001010.00000001.000000 00
HostMin:   10.10.1.1            00001010.00001010.00000001.000000 01
HostMax:   10.10.1.2            00001010.00001010.00000001.000000 10
Broadcast: 10.10.1.3            00001010.00001010.00000001.000000 11
Hosts/Net: 2                     Class A, Private Internet

10.10.1.4/30:

Address:   10.10.1.4            00001010.00001010.00000001.000001 00
Netmask:   255.255.255.252 = 30 11111111.11111111.11111111.111111 00
Wildcard:  0.0.0.3              00000000.00000000.00000000.000000 11
=>
Network:   10.10.1.4/30         00001010.00001010.00000001.000001 00
HostMin:   10.10.1.5            00001010.00001010.00000001.000001 01
HostMax:   10.10.1.6            00001010.00001010.00000001.000001 10
Broadcast: 10.10.1.7            00001010.00001010.00000001.000001 11
Hosts/Net: 2                     Class A, Private Internet

 

я понимаю, с моей стороны как настраивать, у меня то 1 шлюз будет по умолчанию, а нужно 2? я к тому, что правайдер не может дать 2 по /30, а может только одну /29 дать

Share this post


Link to post
Share on other sites

1 час назад, ytil сказал:

я понимаю, с моей стороны как настраивать, у меня то 1 шлюз будет по умолчанию, а нужно 2? я к тому, что правайдер не может дать 2 по /30, а может только одну /29 дать

Да, шлюз будет один, как и положено. И актуален он будет только для маршрутизатора.

Всё остальное будет разруливать PBR.

 

P.S. Что вообще такое "шлюз по-умолчанию"? Это адрес/интерфейс, куда МАРШРУТИЗАТОР отправляет НЕИЗВЕСТНЫЕ ему "направления".

Т.е. то, что в данном случае, неизвестно для PBR. А в PBR у Вас будет прописано, что ВСЮ подсеть 192.168.0.0/24 отправлять через 10.10.1.2, а 192.168.1.0/24 - через 10.10.1.5.

Всё, что не попадает под эти правила, пойдёт в default route.

Как-то так я представляю этот процесс..

Share this post


Link to post
Share on other sites

9 минут назад, AlKov сказал:

Т.е. то, что в данном случае, неизвестно для PBR. А в PBR у Вас будет прописано, что ВСЮ подсеть 192.168.0.0/24 отправлять через 10.10.1.2, а 192.168.1.0/24 - через 10.10.1.5.

вот послали мы 192.168.0.0/24 на 10.10.1.2, а дальше что происходит? траффик же согласно таблице все равно будет уходить через 1 интерфейс, я так понял вы имеете ввиду конструкцию вида

 

pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2

pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1

но такая конструкция подразумевает 2 разных шлюза, чтобы через разные интерфейсы выпускать. В чем я ошибаюсь?

Share this post


Link to post
Share on other sites

@ytil , в частностях не подскажу, т.к. подобное приходилось реализовывать всего один раз за всю практику, плюс к тому НЕ на FreeBSD, а на Linux.

Я предложил Вам вариант решения с использованием PBR и показал пример.

Вы ссылку посмотрели? Ваш вариант, или нет?

Если "да", то и конфигурите на его основе.

 

P.S. И ещё раз - шлюз по-умолчанию будет всегда один и используется он только тогда, когда в таблице маршрутизации НЕТ конкретного правила.

В данном случае эти правила для подсетей 192.168.ххх будут там. Всё остальное, не указанное в правилах PBR, пойдёт по default route.

Share this post


Link to post
Share on other sites

2 часа назад, ytil сказал:

но такая конструкция подразумевает 2 разных шлюза, чтобы через разные интерфейсы выпускать. В чем я ошибаюсь?

А если написать один - ругается?

Share this post


Link to post
Share on other sites

Самый, наверное, простой вариант две fib. фаерволом входящий от клиента загонять в нужный фиб и ifconfig_em2="inet aaa/29 fib 2"

и echo "net.add_addr_allfibs=0" >> /etc/sysctl.conf.local 

ifconfig_em0_alias0="тоже самое что там есть в дефолтноm фибе с добавлением fib2"

и статик рутинг для второго фиба

static_routes="def2"
route_def2="default xxx.1 -fib 2"
 

натить исходящий на каждом интерфейсе, там уже и так будет только то, что нужно

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.