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

Network namespace и много bgp

Всем привет.
Есть бордер на 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 by 1boris

Share this post


Link to post
Share on other sites

13 минут назад, 1boris сказал:

Или без нескольких бордеров не обойтись?

Неймспейсы полностью независимы и если производительности хватит то нужды в отдельном железе точно нет.

 

но что-то мне кажется что задача должна решаться проще, на уровне настройки bgpd 

Share this post


Link to post
Share on other sites

Вопрос именно в том, насколько будет проседать производительность сервера при десяти netns.
Или вообще без разницы идёт трафик через 1 netns или через 10 netns?

Средствами bgpd я знаю только один способ - навесить на каждую сессию community и отдавать маршруты даунлинкам в зависимости от community.
Но тут есть много НО:
1)Даунлинк в таком случае получит только best маршруты, а значит не весь FullView
2)Входящий трафик к даунлинку пойдёт только по одному интерфейсу

Если есть ещё варианты, подскажите.

Edited by 1boris

Share this post


Link to post
Share on other sites

1 наверняка должна быть опция advertise-inactive

2 маркируйте пакет на входе и потом разруливайте куда его маршрутизировать. iptables/iproute такое умеют

Share this post


Link to post
Share on other sites

Вообще, в Linux уже давно завезли и "настоящий" VRF в ядре - Working with Linux VRFs – Das Blinken Lichten , Stefan's Blog - Using VRF (Virtual Routing and Forwarding) on Linux (stbuehler.de)

 

Share this post


Link to post
Share on other sites

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 как

 

вопрос производительности 

 

Share this post


Link to post
Share on other sites

netns не работает нормально в контейнерах...

 

также в контейнерах не работает нормально evpn

Edited by ne-vlezay80

Share this post


Link to post
Share on other sites

orlik, не нашел опцию advertise-inactive в quagga

jffulcrum, спасибо за ссылки, немного разобрался, но так и не понял как связать с quagga

 

Наткнулся случайно на FRRouting (форк quagga), не знал о его существовании. Вроде есть поддержка vrf.

 

 

Edited by 1boris

Share this post


Link to post
Share on other sites

Покрутите Bird. 

Там можно создавать отдельные таблицы маршрутизации. Что-то вроде - все маршруты с этого пиринга положить вот сюда, и отдать вот туда.  vrf нем тоже есть. 

 

Share this post


Link to post
Share on other sites

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 by 1boris

Share this post


Link to post
Share on other sites

18 часов назад, ne-vlezay80 сказал:

netns не работает нормально в контейнерах...

 

также в контейнерах не работает нормально evpn

Это как не работает если вся контейнерная сеть на них и построена? 

Share this post


Link to post
Share on other sites

>Это как не работает если вся контейнерная сеть на них и построена? 

Это в непривилигированных контейнерах.

Share this post


Link to post
Share on other sites

Допустим есть два vrf: vrf0 и vrf1.
В vrf0 пусть будет fullview.
На vrf1 делаю import vrf vrf0 и получаю маршруты с vrf0.


Что нужно сделать, чтобы заставить ходить пинг с vrf1 в vrf0 и дальше в мир?
Ведь у vrf0 и vrf1 нет общих интерфейсов. К каким интерфейсам привязывать айпишники?

Share this post


Link to post
Share on other sites

В 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 и пока нет времени проверить - тоже задача на выходные 😞

 

Share this post


Link to post
Share on other sites

Всё получилось методом тыка
Для связи двух vrf не нужны дополнительные veth интерфейсы, как это требуется в netns
Об этом не написано ни тут https://www.kernel.org/doc/Documentation/networking/vrf.txt, ни в документации FRR
Завтра выложу конфигурацию

Edited by 1boris

Share this post


Link to post
Share on other sites

Цитата

Это вы наверно о 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 by ne-vlezay80

Share this post


Link to post
Share on other sites

Приведу небольшой пример использования 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 by 1boris

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.