Morty Posted February 18, 2023 (edited) Всем привет. Есть бордер на Linux. На данный момент у нас 3 FullView, 3 пиринга и несколько даунлинков. Есть задача подключить нового даунлинка и отдать ему только 1 FullView и 1 пиринг по двум разным bgp сессиям. Вторая задача - отдать остальным даунликам best маршруты всех 3-х fullview в одной сессии, а маршруты пиринга в другой сессии. Без vrf не обойтись. В Linux это можно реализовать с помощью ip netns. Думаю создать 6 ip netns, прокинуть в каждый по влану от аплинка, поднять в каждом по отдельной bgp сессии. Первую задачу решу прокидыванием влана от даунлинка в netns с fullview и прокидыванием другого влана в netns с пирингом. После чего подниму по bgp сессии с даунликном в каждом netns. Для второй задачи нужно создать ещё два netns для объединения fullview и пиринга... В общем получится целая куча network namespace и целая куча bgp сессий. Как это всё скажется на производительности? Правильно ли я рассуждаю при выборе подобной схемы? Или без нескольких бордеров не обойтись? Edited February 18, 2023 by 1boris Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sirmax Posted February 18, 2023 13 минут назад, 1boris сказал: Или без нескольких бордеров не обойтись? Неймспейсы полностью независимы и если производительности хватит то нужды в отдельном железе точно нет. но что-то мне кажется что задача должна решаться проще, на уровне настройки bgpd Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Morty Posted February 18, 2023 (edited) Вопрос именно в том, насколько будет проседать производительность сервера при десяти netns. Или вообще без разницы идёт трафик через 1 netns или через 10 netns? Средствами bgpd я знаю только один способ - навесить на каждую сессию community и отдавать маршруты даунлинкам в зависимости от community. Но тут есть много НО: 1)Даунлинк в таком случае получит только best маршруты, а значит не весь FullView 2)Входящий трафик к даунлинку пойдёт только по одному интерфейсу Если есть ещё варианты, подскажите. Edited February 18, 2023 by 1boris Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
orlik Posted February 18, 2023 1 наверняка должна быть опция advertise-inactive 2 маркируйте пакет на входе и потом разруливайте куда его маршрутизировать. iptables/iproute такое умеют Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jffulcrum Posted February 18, 2023 Вообще, в Linux уже давно завезли и "настоящий" VRF в ядре - Working with Linux VRFs – Das Blinken Lichten , Stefan's Blog - Using VRF (Virtual Routing and Forwarding) on Linux (stbuehler.de) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sirmax Posted February 18, 2023 2 часа назад, jffulcrum сказал: Вообще, в Linux уже давно завезли и "настоящий" VRF в ядре - Working with Linux VRFs – Das Blinken Lichten , Stefan's Blog - Using VRF (Virtual Routing and Forwarding) on Linux (stbuehler.de) Ip netns это и есть vrf ну плюс минус и его завезли лет 10 как вопрос производительности Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ne-vlezay80 Posted February 19, 2023 (edited) netns не работает нормально в контейнерах... также в контейнерах не работает нормально evpn Edited February 19, 2023 by ne-vlezay80 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Morty Posted February 19, 2023 (edited) orlik, не нашел опцию advertise-inactive в quagga jffulcrum, спасибо за ссылки, немного разобрался, но так и не понял как связать с quagga Наткнулся случайно на FRRouting (форк quagga), не знал о его существовании. Вроде есть поддержка vrf. Edited February 19, 2023 by 1boris Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
wed Posted February 19, 2023 Покрутите Bird. Там можно создавать отдельные таблицы маршрутизации. Что-то вроде - все маршруты с этого пиринга положить вот сюда, и отдать вот туда. vrf нем тоже есть. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Morty Posted February 19, 2023 (edited) wed, спасибо за подсказку, но хочу начать с FRR, так как есть опыт работы с quagga. Если FRR не устроит, то попробую Bird. VRF работает примерно так: Скрытый текст ip link add vrf0 type vrf table 1 ip link add vrf1 type vrf table 2 # ip link set dev vrf0 up ip link set dev vrf1 up # ip link set dev eth0.100 master vrf0 ip link set dev eth0.200 master vrf1 # ip addr add 1.0.0.2/30 dev eth0.100 ip addr add 2.0.0.2/30 dev eth0.200 В bgpd: Скрытый текст router bgp 25001 vrf vrf0 bgp router-id 100.0.0.1/24 neighbor 1.0.0.1 remote-as 25100 neighbor 1.0.0.1 update-source 1.0.0.2 ! address-family ipv4 unicast network 100.0.0.0/24 neighbor 1.0.0.1 route-map uplink0-in in neighbor 1.0.0.1 route-map uplink0-out out exit-address-family exit ! router bgp 25001 vrf vrf1 bgp router-id 100.0.0.1/24 neighbor 2.0.0.1 remote-as 25200 neighbor 2.0.0.1 update-source 2.0.0.2 ! address-family ipv4 unicast network 100.0.0.0/24 neighbor 2.0.0.1 route-map uplink1-in in neighbor 2.0.0.1 route-map uplink1-out out exit-address-family exit show bgp vrf vrf0 sum: Скрытый текст IPv4 Unicast Summary (VRF vrf0): BGP router identifier 1.0.0.1, local AS number 25001 vrf-id 14 BGP table version 1 RIB entries 3, using 576 bytes of memory Peers 1, using 724 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc 1.0.0.1 4 25100 22 21 0 0 0 00:01:00 1 0 uplink0 Total number of neighbors 1 show bgp vrf vrf1 sum: Скрытый текст IPv4 Unicast Summary (VRF vrf1): BGP router identifier 2.0.0.1, local AS number 25001 vrf-id 15 BGP table version 1 RIB entries 3, using 576 bytes of memory Peers 1, using 724 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc 2.0.0.1 4 25200 22 21 0 0 0 00:01:00 1 0 uplink1 Total number of neighbors 1 Всё работает из одного процесса bgpd. Пока изучаю документацию. Когда решу свои задачи, опишу решение здесь, может кому-то пригодится. Edited February 19, 2023 by 1boris Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sirmax Posted February 19, 2023 18 часов назад, ne-vlezay80 сказал: netns не работает нормально в контейнерах... также в контейнерах не работает нормально evpn Это как не работает если вся контейнерная сеть на них и построена? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ne-vlezay80 Posted February 20, 2023 >Это как не работает если вся контейнерная сеть на них и построена? Это в непривилигированных контейнерах. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Morty Posted February 21, 2023 (edited) Каким образом ходит трафик между vrf при route-leaking? Нужно как-то связывать два vrf? Edited February 21, 2023 by 1boris Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Morty Posted February 21, 2023 Допустим есть два vrf: vrf0 и vrf1. В vrf0 пусть будет fullview. На vrf1 делаю import vrf vrf0 и получаю маршруты с vrf0. Что нужно сделать, чтобы заставить ходить пинг с vrf1 в vrf0 и дальше в мир? Ведь у vrf0 и vrf1 нет общих интерфейсов. К каким интерфейсам привязывать айпишники? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sirmax Posted February 21, 2023 В 20.02.2023 в 06:45, ne-vlezay80 сказал: >Это как не работает если вся контейнерная сеть на них и построена? Это в непривилигированных контейнерах. Это вы наверно о host network в контейнере Я проверю на стенде на выходных В 19.02.2023 в 16:26, 1boris сказал: wed, спасибо за подсказку, но хочу начать с FRR, так как есть опыт работы с quagga. Если FRR не устроит, то попробую Bird. VRF работает примерно так: Скрыть содержимое ip link add vrf0 type vrf table 1 ip link add vrf1 type vrf table 2 # ip link set dev vrf0 up ip link set dev vrf1 up # ip link set dev eth0.100 master vrf0 ip link set dev eth0.200 master vrf1 # ip addr add 1.0.0.2/30 dev eth0.100 ip addr add 2.0.0.2/30 dev eth0.200 В bgpd: Показать содержимое router bgp 25001 vrf vrf0 bgp router-id 100.0.0.1/24 neighbor 1.0.0.1 remote-as 25100 neighbor 1.0.0.1 update-source 1.0.0.2 ! address-family ipv4 unicast network 100.0.0.0/24 neighbor 1.0.0.1 route-map uplink0-in in neighbor 1.0.0.1 route-map uplink0-out out exit-address-family exit ! router bgp 25001 vrf vrf1 bgp router-id 100.0.0.1/24 neighbor 2.0.0.1 remote-as 25200 neighbor 2.0.0.1 update-source 2.0.0.2 ! address-family ipv4 unicast network 100.0.0.0/24 neighbor 2.0.0.1 route-map uplink1-in in neighbor 2.0.0.1 route-map uplink1-out out exit-address-family exit show bgp vrf vrf0 sum: Показать содержимое IPv4 Unicast Summary (VRF vrf0): BGP router identifier 1.0.0.1, local AS number 25001 vrf-id 14 BGP table version 1 RIB entries 3, using 576 bytes of memory Peers 1, using 724 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc 1.0.0.1 4 25100 22 21 0 0 0 00:01:00 1 0 uplink0 Total number of neighbors 1 show bgp vrf vrf1 sum: Показать содержимое IPv4 Unicast Summary (VRF vrf1): BGP router identifier 2.0.0.1, local AS number 25001 vrf-id 15 BGP table version 1 RIB entries 3, using 576 bytes of memory Peers 1, using 724 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc 2.0.0.1 4 25200 22 21 0 0 0 00:01:00 1 0 uplink1 Total number of neighbors 1 Всё работает из одного процесса bgpd. Пока изучаю документацию. Когда решу свои задачи, опишу решение здесь, может кому-то пригодится. http://xgu.ru/wiki/VRF_в_Linux я не знаю как именно работает ip vrf и пока нет времени проверить - тоже задача на выходные 😞 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sirmax Posted February 21, 2023 Хм похоже vrf это не netns Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Morty Posted February 21, 2023 (edited) Всё получилось методом тыка Для связи двух vrf не нужны дополнительные veth интерфейсы, как это требуется в netns Об этом не написано ни тут https://www.kernel.org/doc/Documentation/networking/vrf.txt, ни в документации FRR Завтра выложу конфигурацию Edited February 21, 2023 by 1boris Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ne-vlezay80 Posted February 21, 2023 (edited) Цитата Это вы наверно о host network в контейнере Я проверю на стенде на выходных Я про: lxc exec border1 sh ip link add dev vni-1000 up mtu 9000 type vxlan id 1000 dstport 4789 local 10.127.192.2 ip link set dev vni-1000 address 24:00:72:00:88:01 ip addr add 172.30.255.1/24 dev vni-1000 ip -6 addr add fec0:1000::1/64 dev vni-1000 bridge fdb append 00:00:00:00:00:00 dst 172.18.22.51 dev vni-1000 bridge fdb append 00:00:00:00:00:00 dst 172.18.22.52 dev vni-1000 ... etc bridge fdb delete 00:00:00:00:00:00 dev vni-1000 Operation not permitted Edited February 21, 2023 by ne-vlezay80 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Morty Posted February 24, 2023 (edited) Приведу небольшой пример использования VRF в Linux на FRRouting 8.4. Может кому-то пригодится. В примере настрою route leaking между созданными VRF и VRF GRT (получу в GRT маршруты от двух аплинков, находящихся в разных VRF), используя FRRouting VPN MP-BGP. AS64500 - наша AS AS64505 - AS аплинка 1 AS64510 - AS аплинка 2 Создаём VRF: Скрытый текст # Создаём vrf для аплинка 1 ip link add vrf0 type vrf table 1 ip link set dev vrf0 up # Создаём vrf для аплинка 2 ip link add vrf1 type vrf table 2 ip link set dev vrf1 up # Привязываем интерфейс аплинка 1 к vrf0 ip link set dev eth0.100 master vrf0 ip link set dev eth0.100 up # Привязываем интерфейс аплинка 2 к vrf1 ip link set dev eth0.200 master vrf1 ip link set dev eth0.200 up # Добавляем ip для аплинка 1 ip addr add 1.0.0.2/30 dev eth0.100 # Добавляем ip для аплинка 2 ip addr add 2.0.0.2/30 dev eth0.200 Конфиг frr.conf: Скрытый текст frr version 8.4.2 frr defaults traditional hostname Border log syslog informational no ipv6 forwarding service integrated-vtysh-config ! router bgp 64500 vrf vrf0 bgp router-id 100.0.0.1 no bgp network import-check neighbor 1.0.0.1 remote-as 64505 neighbor 1.0.0.1 description Uplink1-FullView neighbor 1.0.0.1 update-source 1.0.0.2 ! address-family ipv4 unicast network 100.0.0.0/24 redistribute connected neighbor 1.0.0.1 soft-reconfiguration inbound neighbor 1.0.0.1 route-map uplink1-in in neighbor 1.0.0.1 route-map uplink1-out out rd vpn export 64505:100 rt vpn export 64505:100 route-map vpn export vrf0-export export vpn exit-address-family exit ! router bgp 64500 vrf vrf1 bgp router-id 100.0.0.2 no bgp network import-check neighbor 2.0.0.1 remote-as 64510 neighbor 2.0.0.1 description Uplink2-FullView neighbor 2.0.0.1 update-source 2.0.0.2 ! address-family ipv4 unicast network 100.0.0.0/24 redistribute connected neighbor 2.0.0.1 soft-reconfiguration inbound neighbor 2.0.0.1 route-map uplink2-in in neighbor 2.0.0.1 route-map uplink2-out out rd vpn export 64510:100 rt vpn export 64510:100 route-map vpn export vrf1-export export vpn exit-address-family exit ! router bgp 64500 bgp router-id 100.0.0.3 ! address-family ipv4 unicast redistribute connected route-map vpn import vrf-default-import rd vpn export 64500:1000 rt vpn import 64505:100 64510:100 import vpn exit-address-family exit ! ip prefix-list our-net seq 10 permit 100.0.0.0/24 ! route-map uplink1-in permit 10 exit ! route-map uplink1-out permit 10 match ip address prefix-list our-net exit ! route-map uplink2-in permit 10 exit ! route-map uplink2-out permit 10 match ip address prefix-list our-net exit ! route-map vrf0-export permit 10 exit ! route-map vrf1-export permit 10 exit ! route-map vrf-default-import permit 10 exit ! С VRF знаком всего несколько дней, жду замечания по конфигу. Edited February 24, 2023 by 1boris Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...