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

FreeBSD, два канала, setfib + направить часть пользователей через setfib 1

Есть два канала от разных провайдеров, каждый на своем сетевом интерфейсе, настроен setfib, оба канала работают:
setfib -F 0 ping ya.ru
setfib -F 1 ping ya.ru

Используется FreeBSD 13.1, ipfw, natd (поднятый на обоих сетевых интерфейсах на разных портах).
Задача выпускать (заставлять работать, используя строго канал setfib 1) часть избранных пользователей из локалок, подключенных к этому шлюзу. Для этого добавляю ip нужных мне пользователей в ipfw table:

Код: Выделить всё

...
# To backup ISP start
        ${fwcmd} table 25 flush
/bin/cat /usr/local/etc/squid/bc_ch.list | while read ip; do
        ${fwcmd} table 25 add $ip
done
# To backup ISP end
...

 

Непосредственно заворачиваю ip из таблицы во второй канал так:

Код: Выделить всё

...
# NATD Backup ISP forward users
${fwcmd} add 460 divert natd2 ip from table\(25\) to any
${fwcmd} add 470 fwd IP_GW_BACKUP_ISP ip from IP_BACKUP_ISP to any
...
${fwcmd} add divert natd2 ip from any to IP_BACKUP_ISP in via igb3
...
${fwcmd} add pass all from table\(25\) to any keep-state
...

 

После добавления требуемого ip в таблицу, его запросы вроде как представляются уже внешним IP второго провайдера из setfib 1 судя по тому же myip.ru и т.п., прочим удаленным сервисам, куда производится обращение с этого клиента. Но при этом тот же tracert, запущенный с этого же компа, показывает работу по первому дефолтовому каналу почему-то.
В связи с чем у меня возникают сомнения в корректности указанной схемы использования строго второго канала для занесенной в таблицу группы пользователей.
Усложнение правил ipfw с вариациями использования с setfib пока ясности не добавило, хотелось бы услышать экспертные мнения по реализации задуманного.

Share this post


Link to post
Share on other sites

Не очень понятно, зачем два процесса NATD, одним можно управиться, или у вас там прямо highload ожидается? Ну и конфиг ipfw стоит весь привести, а то может для конкретно icmp трафика еще какое-то правило играет, особенно если не сделан net.inet.ip.fw.one_pass в sysctl. 

 

 

С ipfw можно насобирать багов, с которыми еще диды воевали, против pf какие предубеждения?

Share this post


Link to post
Share on other sites

У меня два провайдера с белыми адресами, каждый заведен на свой отдельный интерфейс, соответственно один натд на одном интерфейсе, второй на другом. Основная масса пользователей через первого дефолтового провайдера ходят, многим нужен избирательный прямой доступ наружу минуя squid (ip из таблицы, которые должны ходить через второй канал, прокси не юзают).

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

Да, net.inet.ip.fw.one_pass пробовал и в 0 и 1, конкретно на трасерт через "правильный" канал не влияет.

Не хотел бы спустя много лет менять парадигму конфигурирования, поэтому ядерный нат и pf не рассматриваю.

Обобщив информацию в сети, конкретно по своей задаче не нашел более правильно примера реализации, особенно с setfib. Оно сейчас конечно работает, в т.ч. и failover (собственно работало и до пересборки с options ROUTETABLES=2 и задействования setfib-ов) с вышеупомянутым алгоритмом правил, но по мне так как-то костыльно. Поэтому был бы интересен аналогичный опыт коллег с тем же инструментарием в решении вопроса.

Share this post


Link to post
Share on other sites

Увы, на IPFW давно таким не занимался, лет эдак 10. С PF весь выход в интернет делается буквально в четыре правила (или даже меньше, если по IP фильтровать, а не по интерфейсам), но если что-то высокозамороченное или высоконагруженное, то могут всплыть какие-то нюансы в пользу.

 

Что касается конкретно 

3 часа назад, mrrc сказал:

Но при этом тот же tracert, запущенный с этого же компа, показывает работу по первому дефолтовому каналу почему-то.

То tracert в Windows формирует кривые icmp пакеты, а в ipfw был и, получается, есть баг фича, по которой они не попадают под определение ip. И лечилось это ЕМНИП только через правило с all.

Share this post


Link to post
Share on other sites

какаято мешанина, с одной стороны два fib с другой стороны маршрутизация на ipfw fwd

 

Если мы про fib, то где трафик должен попасть в 1 FIB ? От того что он натится в ИП со второго интерфейса, он туда не попадёт же ?

 

Если мы про маршрутизацию на Ipfw fwd, то на правиле 470 счётчики вообще растут при запросах из внутренней сети ?

 

если дефолт в fib0 не режет левые ИП отправителя, то у вас всё будет работать с 100% исходящего через него и входящем откуда по ИП положено.

 

я так понимаю те кто в table 25 те должны попадать в fib1 ?

${fwcmd} add 100 setfib 1 ip from table\(25\) to any in via ${intif}

и в rc.conf ifconfig_igb3="inet ..... fib 1"

 

и, скорее всего второй natd надо запускать с setfib 1 (сохраняется ли fib при проходе через divert я не помню, врядли.)

 

и я бы вот это выкинул, "add pass all from table\(25\) to any keep-state" т.к. там есть вариантов для неоднозначностей...

 

и что значит "настроен set fib".  покажите netstat -rn для обоих fib ? и что в  sysctl net.add_addr_allfibs ? если второй natd не запущен в 1 fib то есть ли в 0 маршрут на IP_GW_BACKUP_ISP ?

 

ну и да, с pf таки проще на первый взгляд.. 

 

 

 

14 минут назад, jffulcrum сказал:

Что касается конкретно 

То tracert в Windows формирует кривые icmp пакеты, а в ipfw был и, получается, есть баг фича, по которой они не попадают под определение ip. И лечилось это ЕМНИП только через правило с all.

Хм... ну както за многие годы это прошло мимо... 🙂 ни разу не наступилось на эти грабли.. да и ...

 

 

$ sudo ipfw add 33 count ip from any to any
00033 count ip from any to any
$ sudo ipfw add 33 count all from any to any
00033 count ip from any to any
$ sudo ipfw list 33
00033 count ip from any to any
00033 count ip from any to any

ip и any синонимы.. причём AFAIR очень давно оно так..

Share this post


Link to post
Share on other sites

https://www.freebsd.org/cgi/man.cgi?query=ipfw&sektion=&n=1

setfib fibnum | tablearg - у вас этого в правилах ipfw нет. Но вы типа правилами по разным нат раскидываете и тогда...

 

Собственно тут вопросов два:

1. какие правила есть для icmp в ipfw.

2. а natd у вас знает про разные fib и соответственно разные next-hop?

 

 

В остальном, divert сокеты и юзерспейсный процесс это performance impact. Но если хватает то и ладно.

 

 

4 hours ago, jffulcrum said:

С PF весь выход в интернет делается буквально в четыре правила (или даже меньше, если по IP фильтровать, а не по интерфейсам), но если что-то высокозамороченное или высоконагруженное, то могут всплыть какие-то нюансы в пользу.

Всё же это минимальный конфиг с которым работает а не best practices.

Я помню как больно наступил на то, что PF по дефолту запрещает IP OPTIONS и из за этого весь IGMP просто не работает.

Те ```pass quick all``` не достаточно, опции оно порежет.

Share this post


Link to post
Share on other sites

st_re, добрался до тестового стенда, совершенно верно, tcpdump показывает отправку пакетов через шлюз по умолчанию (fib0), получение с fib1, на примере того же icmp, smtp.

На заворачивающем правиле Ipfw fwd 470 счетчик растет.

Да, кто заносится в table 25 должны использовать канал второго провайдера (fib1).

В rc.conf поднимаю интерфейс сейчас именно так ifconfig_igb3="inet ..... fib 1".

Но приведенная конструкция у меня не работает:

${fwcmd} add 100 setfib 1 ip from table\(25\) to any in via igb3

Имею на нее ipfw: unrecognised option [-1] from

И как запуск natd привязать к setfib 1?

 

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

add pass all from table\(25\) to any keep-state

 

# setfib 0 netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags     Netif Expire
default            XX.XXX.252.225     UGS         re0
127.0.0.1          link#6             UH          lo0
XX.XXX.252.224/28  link#5             U           re0
XX.XXX.252.232     link#5             UHS         lo0
...
# setfib 1 netstat -rn
Routing tables (fib: 1)

Internet:
Destination        Gateway            Flags     Netif Expire
default            XX.XX.192.1       UGS        igb3
127.0.0.1          link#6             UHS         lo0
XXX.XX.192.0/26    link#4             U          igb3
XXX.XX.192.31      link#4             UHS         lo0
# sysctl net.add_addr_allfibs
net.add_addr_allfibs: 0

Второй natd не запущен в 1 fib (не докурил как и сам демон и\или заворачивание в него в ipfw)?

В fib 0 маршрут на IP_GW_BACKUP_ISP (а ля XX.XX.192.1) сейчас нет, т.к. поднимаем интерфейс второго провайдера с ifconfig_igb3="inet ..... fib 1.

 

Ivan_83,

1. По icmp:

05200     0       0 deny log logamount 1000 icmp from any to any frag offset
05300  3420  180208 allow icmp from any to any

2. Нет(( как обучить?

Share this post


Link to post
Share on other sites

$ sudo ipfw add 100 setfib 1 ip from table\(25\) to any in via igb3
00100 setfib 1 ip from table(25) to any in via igb3
$ sudo ipfw list 100
00100 setfib 1 ip from table(25) to any in via igb3
$ uname -r
13.1-STABLE

 

маршруты в локалку для fib1 тоже нужны..

 

возможно вместо 

${fwcmd} add 470 fwd IP_GW_BACKUP_ISP ip from IP_BACKUP_ISP to any

надо

${fwcmd} add 470 set fib 1 ip from IP_BACKUP_ISP to any

как вы второй natd пускаете ? штатно он пускается один... 

Share this post


Link to post
Share on other sites

st_re, долбанное формирование с форума перетянулось при копипасте((

ipfw add 100 setfib 1 ip from table\(25\) to any in via igb3 конечно же отработало корректно!

Только туда по счетчику пока ничего не попадает при активности с ip из таблицы.

 

Маршрут в локалку для fib1? Как в таком случае их задать?

 

Второй натд стартует уже из скрипта /sbin/natd -n igb3 -port 8669

1434  -  Ss    0:00.02 /sbin/natd -n igb3 -port 8669

 

Edited by mrrc

Share this post


Link to post
Share on other sites

только там не igb3 а тот интерфейс, ОТКУДА ходят эти ИП

 

добавить в старт второго ната "setfib -F 1 " ?

 

/etc/rc.conf: 

static_routes="deffib1_r01 deffib1_r02"
route_deffib1_r01="1.2.3.4/24 -iface em1 -fib 1" # тут сеть на внутрнеем интерфейсе

route_deffib1_r02="2.3.4.5/24 1.2.3.10 -fib 1" # тут сеть гдето глубже в сети

 

Share this post


Link to post
Share on other sites

st_re, все поднялось как надо, пакеты от табличных ip пошли в обе стороны через второго провайдера, благодарствую!

Несколько смутили маршрутами в локалку для fib1, это привязка подсетей локалок с их интерфейсами во второй таблице маршрутизации скорее.
Также пришлось добавить подсеть с интерфейсом второго провайдера из fib1 и в fib0, чтобы дать оттуда маршруты к DNS-серверам второго провайдера через него же из основной таблицы маршрутизации, т.к. они прописаны наряду с dns серверами первого провайдера в bind-е, который в качестве кеширующего DNS тут же поднят.

 

fib 1 сейчас:

# setfib 1 netstat -rn
Routing tables (fib: 1)

Internet:
Destination        Gateway            Flags     Netif Expire
default            XXX.XX.192.1       UGS        igb3
127.0.0.1          link#6             UHS         lo0
192.168.6.0/24     link#1             US         igb0
XXX.XX.192.0/26    link#4             U          igb3
XXX.XX.192.31      link#4             UHS         lo0

 

Текущие правила для поднятой задачи сейчас:

...
00350  3933   672465 setfib 1 ip from table(25) to any in via igb0
00460  7573  1321562 divert 8669 ip from table(25) to any
00470  3721   658162 setfib 1 ip from XXX.XX.192.31 to any
...
23500 17231 14624895 allow ip from table(25) to any keep-state :default
...

natd на второго провайдера стартует с setfib -F 1

Share this post


Link to post
Share on other sites

3 hours ago, mrrc said:

Также пришлось добавить подсеть с интерфейсом второго провайдера из fib1 и в fib0, чтобы дать оттуда маршруты к DNS-серверам второго провайдера через него же из основной таблицы маршрутизации, т.к. они прописаны наряду с dns серверами первого провайдера в bind-е, который в качестве кеширующего DNS тут же поднят.

Поднимите уже у себя unbound и раздавайте свой DNS.

Я даже на OpenWRT роутерах это для себя делаю.

Share this post


Link to post
Share on other sites

Ivan_83, спасибо, шел из коробки - не зашло, хоть и просто. Я так и делаю, уж привык за годы пользования к named-у. А в чем принципиальная разница была бы, демон все равно дефолтовой таблицей маршрутизации пользуется из fib 0. А с учетом двух провайдеров - запросы к их dns-серверам надо направлять (форвардить) через их же канал.

 

Скрытый текст

А что на форуме с форматированием, ни цитаты, ни реплаи не работают почему-то у меня.

 

Edited by mrrc

Share this post


Link to post
Share on other sites

2 hours ago, mrrc said:

Я так и делаю, уж привык за годы пользования к named-у. А в чем принципиальная разница была бы, демон все равно дефолтовой таблицей маршрутизации пользуется из fib 0. А с учетом двух провайдеров - запросы к их dns-серверам надо направлять (форвардить) через их же канал.

Вы провайдер или где?)

unbound сам себе рекурсер, ему вышестоящие днс не нужны, он знает где есть рутовые и от них рекурсивно находит всё что нужно.

Там можно и форвадинг настраивать, чтобы он как dnsmasq всё запрашивал только у каких то отдельных или только отдельные зоны с избранных днс серверов.

 

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

 

Вообще, в современных реалиях пора уходить от провайдерских днс серверов на концептуальном уровне, те встраивать рекурсеры прямо в каждую ОС

Share this post


Link to post
Share on other sites

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

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

Edited by mrrc

Share this post


Link to post
Share on other sites

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

Вообще, в современных реалиях пора уходить от провайдерских днс серверов на концептуальном уровне, те встраивать рекурсеры прямо в каждую ОС

Не надо так делать, рутовые закроют тогда. Представь, что все начали лазить напрямую в руты по каждому запросу! Через сколько руты лягут?  Для этого и придумали рекурсеры с кэшами.

Share this post


Link to post
Share on other sites

1 hour ago, mrrc said:

Но по-честному не всем и не всегда подходит описанный возможный алгоритм работы unbound-а, пожалуй провайдерские сервера побыстрее по ответам могут оказаться

Это всё не так уж существенно.

Раньше берегли трафик и линки были медленее, сейчас это не так.

Потом оно же кеширует у себя много чего.

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

 

1 hour ago, mrrc said:

ну и организация мы серьезная, должны придерживаться определенных правил сетевого этикета, в особенности в современных реалиях.

Нет такого понятия.

Есть RFC и best practices, но по сути оба это рекомендации а не требования, первое допускает отклонения если понимаешь что делаешь а последнее рекомендация как лучше.

Для ISP нет никаких требований наследовать / использовать вышестоящий DNS рекурсер.

 

 

1 hour ago, sdy_moscow said:

Не надо так делать, рутовые закроют тогда. Представь, что все начали лазить напрямую в руты по каждому запросу! Через сколько руты лягут?  Для этого и придумали рекурсеры с кэшами.

Расскажи это 8.8.8.8 хотя бы. И их таких с десяток если заморочится и нагуглить.

Попутно есть втюхиваемые DoH, DoT где всё ещё хуже.

Ну и самое важное, это то что к корневым серверам типичный кеширующий рекурсер обращается за сутки раз 30, если не меньше, остальное время он берёт из кеша и дёргает уже более нижестоящие сервера, например .com .ru и тп, вот на них нагрузка пожуй вырастет, но не так уж сильно.

 

Я когда то писал свой рекурсер: http://netlab.dhis.org/wiki/software:win:net:dns_lookup

и насмотрелся на это всё изнутри. Можешь сам поигратся, но софтина немного глючная - иногда залипает. Я в то время уже заканчивал под венду так активно писать и не стал отлаживать, к тому же это был PoC посмотреть на CopletionIOPort.

Share this post


Link to post
Share on other sites

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

Расскажи это 8.8.8.8 хотя бы.

Ничего личного - просто бизнес. Ты думаешь эти ребята просто так всем втюхивают свой ДНС? Да еще и проталкивают везде ДНС сек? Поучительна история вышла в итоге с корневыми сертификатами.

 

Всё это не про интернет,  а про сбор инфы, монополизацию рынка и борьбу с конкурентами.

Share this post


Link to post
Share on other sites

Да это понятно, просто 8.8.8.8 как то живёт под нагрузкой и не помирает, а на корневые нагрузка незначительно возрастёт если ставить всем unbound вместо провайдерского днс.

Share this post


Link to post
Share on other sites

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

Да это понятно, просто 8.8.8.8 как то живёт под нагрузкой и не помирает, а на корневые нагрузка незначительно возрастёт если ставить всем unbound вместо провайдерского днс.

8.8.8.8 это не 1 сервер, а целое облако, да еще и распределенное, почти наверняка. 

Share this post


Link to post
Share on other sites

10 часов назад, Ivan_83 сказал:

вливаю чёрный список доменов для блокировки всякой рекламы, вирусни

Откуды списки берёшь?

 

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

8.8.8.8 это не 1 сервер, а целое облако, да еще и распределенное, почти наверняка. 

anycast оно вроде

Share this post


Link to post
Share on other sites

Можно еще по одному моменту услышать, раз уж мы несколько съехали с темы, по увеличению производительности при больших нагрузках на сетевую карту, какие сейчас минимально желательные "best practices" для включения в ядро системы. Нагрузка нагрузке понятное дело рознь, но есть iface-ы в системе на которые действительно в разы нагрузка выше, чем на соседние. Что сейчас минимально лучше использовать в современной фре для гигабитного изернета?

options HZ=1000?

options DEVICE_POLLING?

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.