Вонкая настройка ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для MetalLB Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ L2

Вонкая настройка ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для MetalLB Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ L2
НС Ρ‚Π°ΠΊ Π΄Π°Π²Π½ΠΎ я столкнулся с вСсьма нСстандартной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ настройки ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΡ‰Π°Ρ†ΠΈΠΈ для MetalLB. Всё Π±Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ, Ρ‚.ΠΊ. ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ для MetalLB Π½Π΅ трСбуСтся Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий, Π½ΠΎ Π² нашСм случаС имССтся достаточно большой кластСр с вСсьма Π½Π΅Ρ…ΠΈΡ‚Ρ€ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ сСти.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ source-based ΠΈ policy-based routing для внСшнСй сСти вашСго кластСра.

Π― Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° установкС ΠΈ настройкС MetalLB, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ Π²Ρ‹ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚. ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ сразу ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π΄Π΅Π»Ρƒ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊ настройкС ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π˜Ρ‚Π°ΠΊ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ кСйса:

Π‘Π»ΡƒΡ‡Π°ΠΉ 1: Когда настройка Π½Π΅ трСбуСтся

Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ простой кСйс.

Вонкая настройка ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для MetalLB Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ L2

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ настройка ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ трСбуСтся, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ MetalLB адрСса находятся Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ подсСти Ρ‡Ρ‚ΠΎ ΠΈ адрСса Π²Π°ΡˆΠΈΡ… Π½ΠΎΠ΄.

НапримСр Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ 192.168.1.0/24, Π² Π½Π΅ΠΉ имССтся ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ 192.168.1.1, ΠΈ ваши Π½ΠΎΠ΄Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ адрСса: 192.168.1.10-30, Ρ‚ΠΎΠ³Π΄Π° для MetalLB Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π΅ΠΉΠ½Π΄ΠΆ 192.168.1.100-120 ΠΈ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ настройки.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ваши Π½ΠΎΠ΄Ρ‹ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ настроСнныС ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹:

# ip route
default via 192.168.1.1 dev eth0 onlink 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10

И адрСса ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π΅ΠΉΠ΄ΠΆΠ° Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅Π»ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΉ.

Π‘Π»ΡƒΡ‡Π°ΠΉ 2: Когда трСбуСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ настройка

Вонкая настройка ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для MetalLB Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ L2

Π’Π°ΠΌ слСдуСт Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ всякий Ρ€Π°Π· Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ваши Π½ΠΎΠ΄Ρ‹ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ настроСнного IP-адрСса ΠΈΠ»ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° Π² ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ MetalLB Π²Ρ‹Π΄Π°Ρ‘Ρ‚ адрСса.

Объясню Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅ΠΉ. Всякий Ρ€Π°Π· ΠΊΠΎΠ³Π΄Π° MetalLB Π²Ρ‹Π΄Ρ‘Ρ‚ адрСс, это ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с простым Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²ΠΈΠ΄Π°:

ip addr add 10.9.8.7/32 dev lo

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π½Π°:

  • a) АдрСс назначаСтся с прСфиксом /32 Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Π² ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ для Π½Π΅Π³ΠΎ автоматичСски Π½Π΅ добавится (это просто адрСс)
  • b) АдрСс Π²Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° любой интСрфСйс Π½ΠΎΠ΄Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ loopback). Π—Π΄Π΅ΡΡŒ стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, ΠΎΠ± особСнности сСтСвого стСка Linux. НС Π²Π°ΠΆΠ½ΠΎ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ интСрфСйс Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ адрСс, ядро всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ arp-запросы ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ arp-ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° любой ΠΈΠ· Π½ΠΈΡ…, это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ считаСтся ΠΊΠΎΡ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, достаточно ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ‚Π°ΠΊΠΎΠΉ динамичСской срСдС ΠΊΠ°ΠΊ Kubernetes.

Π”Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ² strict arp:

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

Π’ этом случаС arp-ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли интСрфСйс явно содСрТит ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ IP-адрСс. Данная настройка являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π² случаС Ссли Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ MetalLB ΠΈ ваш kube-proxy Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ IPVS.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ MetalLB Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ядро для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ arp-запросов, Π° Π΄Π΅Π»Π°Π΅Ρ‚ это ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² user-space, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ данная опция Π½Π΅ повлияСт Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ MetalLB.

ВСрнёмся ΠΊ нашСй Π·Π°Π΄Π°Ρ‡Π΅. Если ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° для Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… адрСсов Π½Π° Π²Π°ΡˆΠΈΡ… Π½ΠΎΠ΄Π°Ρ… Π½Π΅ сущСствуСт, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π° всС Π½ΠΎΠ΄Ρ‹:

ip route add 10.9.8.0/24 dev eth1

Π‘Π»ΡƒΡ‡Π°ΠΉ 3: Когда понадобится source-based routing

Source-based routing Π²Π°ΠΌ потрСбуСтся Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ gateway, Π½Π΅ Ρ‚ΠΎΡ‚ Ρ‡Ρ‚ΠΎ настроСн Ρƒ вас ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, соотвСтствСнно ΠΎΡ‚Π²Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΡ‹ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· этот ΠΆΠ΅ gateway.

НапримСр, Ρƒ вас Π΅ΡΡ‚ΡŒ всё Ρ‚Π°ΠΆΠ΅ ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ 192.168.1.0/24 выдСлСнная для Π²Π°ΡˆΠΈΡ… Π½ΠΎΠ΄, Π½ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ внСшниС адрСса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ MetalLB. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ вас Π΅ΡΡ‚ΡŒ нСсколько адрСсов ΠΈΠ· подсСти 1.2.3.0/24 находящихся Π²ΠΎ VLAN 100, ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для доступа Kubernetes-слуТб ΠΈΠ·Π²Π½Π΅.

Вонкая настройка ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для MetalLB Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ L2

ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ Π½Π° 1.2.3.4 Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ запросы ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ подсСти Π½Π΅ΠΆΠ΅Π»ΠΈ 1.2.3.0/24 ΠΈ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚. Нода, которая Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ являСтся мастСром для Π²Ρ‹Π΄Π°Π½Π½ΠΎΠ³ΠΎ MetalLB адрСса 1.2.3.4, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΎΡ‚ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° 1.2.3.1, Π½ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ для Π½Π΅Π³ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΉΡ‚ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠΌ, Ρ‡Π΅Ρ€Π΅Π· 1.2.3.1.

Π’Π°ΠΊ ΠΊΠ°ΠΊ наша Π½ΠΎΠ΄Π° ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ настроСнный default gateway 192.168.1.1, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΊ Π½Π΅ΠΌΡƒ, Π° Π½Π΅ ΠΊ 1.2.3.1, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚.

Как ΠΆΠ΅ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Π΄Π°Π½Π½ΠΎΠΉ ситуациСй?

Π’ этом случаС Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ всС ваши Π½ΠΎΠ΄Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ внСшниС адрСса Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ настройки. Π’ΠΎ Π΅ΡΡ‚ΡŒ для Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ VLAN-интСрфСйс Π½Π° Π½ΠΎΠ΄Π΅:

ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 up

А Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹:

ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ ΠΌΡ‹ добавляСм Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‚Π°Π±ΠΈΡ†Ρƒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ 100 ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Ρ‡Π΅Ρ€Π΅Π· Π³Π΅ΠΉΡ‚Π²Π΅ΠΉ 1.2.3.1, находящийся Π·Π° интСрфСйсом eth0.100.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ простоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ:

ip rule add from 1.2.3.0/24 lookup 100

ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ явно Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚: Ссли адрСс источника ΠΏΠ°ΠΊΠ΅Ρ‚Π° находится Π² 1.2.3.0/24, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±ΠΈΡ†Ρƒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ 100. Π’ Π½Π΅ΠΉ Ρƒ нас ΡƒΠΆΠ΅ описан ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· 1.2.3.1

Π‘Π»ΡƒΡ‡Π°ΠΉ 4: Когда понадобится policy-based routing

Вопология сСти ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π½ΠΎ допустим Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΈΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ внСшним адрСсам ΠΏΡƒΠ»Π° 1.2.3.0/24 ΠΈΠ· Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠ΄ΠΎΠ²:

Вонкая настройка ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для MetalLB Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ L2

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ адрСсу Π² 1.2.3.0/24, ΠΎΡ‚Π²Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ попадая Π½Π° Π½ΠΎΠ΄Ρƒ ΠΈ имСя адрСс источника Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 1.2.3.0/24 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΠ»ΡƒΡˆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ Π² eth0.100, Π½ΠΎ ΠΌΡ‹-Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Kubernetes ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΠ» Π΅Π³ΠΎ Π² наш ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ сгСнСрировал ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ запрос.

Π Π΅ΡˆΠΈΡ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ оказалось нСпросто, Π½ΠΎ это стало Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ благодаря policy-based routing:

Для большСго понимания процСсса ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ Π±Π»ΠΎΠΊ схСму netfilter:
Вонкая настройка ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для MetalLB Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ L2

Для Π½Π°Ρ‡Π°Π»Π°, ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, создадим Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ:

ip route add 1.2.3.0/24 dev eth0.100 table 100
ip route add default via 1.2.3.1 table 100

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ нСсколько ΠΏΡ€Π°Π²ΠΈΠ» Π² iptables:

iptables -t mangle -A PREROUTING -i eth0.100 -j CONNMARK --set-mark 0x100
iptables -t mangle -A PREROUTING  -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

Π­Ρ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ входящиС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° интСрфСйс eth0.100, помСчая всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ тэгом 0x100, этим ΠΆΠ΅ тэгом Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³Π°:

ip rule add from 1.2.3.0/24 fwmark 0x100 lookup 100

Π’ΠΎ Π΅ΡΡ‚ΡŒ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ с адрСсом источника 1.2.3.0/24 ΠΈ тэгом 0x100 Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ 100.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ интСрфСйс, ΠΏΠΎΠ΄ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠΌ Π±Ρ‹Ρ‚ΡŒ ΡΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ стандартными срСдствами Kubernetes.

Π•ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ Π½ΠΎ, Π² Linux сущСствуСт Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ reverse path filter, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ΠΈΡ‚ всю ΠΌΠ°Π»ΠΈΠ½Ρƒ осущСствляСт ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ: для всСх входящих ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΎΠ½ мСняСт адрСс источника ΠΏΠ°ΠΊΠ΅Ρ‚Π° с адрСсом отправитСля ΠΈ провСряСт ΠΌΠΎΠΆΠ΅Ρ‚-Π»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ ΡƒΠΉΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΎΡ‚-ΠΆΠ΅ интСрфСйс Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½, Ссли Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Ρ‹Π²Π΅Ρ‚ Π΅Π³ΠΎ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ Π² нашСм случаС ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, Π½ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0.100/rp_filter

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, пСрвая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠΎΡ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ глобальноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ rp_filter, Ссли Π΅Π³ΠΎ Π½Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ, Ρ‚ΠΎ вторая ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ эфСкта. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ интСрфСйсы останутся со Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ rp_filter.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ rp_filter для netfilter. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ rpfilter Π² качСствС модуля iptables ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ достаточно Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

iptables -t raw -A PREROUTING -i eth0.100 -d 1.2.3.0/24 -j RETURN
iptables -t raw -A PREROUTING -i eth0.100 -m rpfilter --invert -j DROP

Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ rp_filter Π½Π° интСрфСйсС eth0.100 для всСх адрСсов ΠΊΡ€ΠΎΠΌΠ΅ 1.2.3.0/24.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com