Кантэйнер з дзвюма сеткамі выбірае няправільны шлюз
Два далучэнні, адзін маршрут па змаўчанні, і няправільная сетка ўвесь час перамагае. Замацуйце выхад праз Compose gw_priority і пацвердзіце гэта знутры кантэйнера.
Ваш кантэйнер па-ранейшаму адказвае на сваім кіравальным мосце, але кожны зыходны пакет выходзіць праз офісны macvlan. Нічога не зламалася. Два далучэнні кожнае даюць свой шлюз, і адзіны маршрут па змаўчанні пайшоў да той сеткі, якую вы не мелі на ўвазе, таму сэрвіс працуе далей, а яго трафік ідзе даўжэйшым шляхам. Да таго часу, як хтосьці гэта заўважыць, доказам будзе табліца маршрутызацыі, а не паведамленне пра памылку.
Звычайнае тлумачэнне — Docker абраў сетку выпадкова. На практыцы ранейшае рашэнне ішло за алфавітным парадкам далучаных імёнаў сетак, і гэта ператварала маршрутызацыю ў пабочны эфект назвы. gw_priority замяняе гэта лікам, які вы выбіраеце свядома, і пераход на яго займае каля хвіліны пасля таго, як схема запісана.
Чаму маршрут па змаўчанні трапляе ў няправільную сетку
Кожная сетка, да якой далучаецца сэрвіс, можа прапанаваць свой шлюз, а кантэйнер усё роўна атрымлівае роўна адзін маршрут па змаўчанні. Да Compose 2.33.1 нічыя вырашалася сартаваннем імёнаў сетак, таму назва накшталт control, якая ідзе перад office, вызначала, куды пойдзе трафік. Нішто ўнутры кантэйнера не фіксуе, што рашэнне было адвольным, і менавіта таму яно праходзіць прагляд коду і пазней усплывае як дзіўны шлях. Запісаць палітыку ў файл compose — адзіны спосаб зрабіць выбар правяральным.
Сапраўды змяняюць пераможцу дзве рэчы: значэнні gw_priority, якія вы прызначаеце, і тое, якія сеткі наогул далучаныя. Дадайце трэцюю сетку — набор кандыдатаў расце; прыбярыце macvlan — і з мосцом няма чаму спаборнічаць. Ні адзін з гэтых крокаў не бачны ў журналах праграмы, бо няправільны маршрут па змаўчанні рэдка цалкам разрывае злучэнне. Ён толькі робіць так, што адказы прыходзяць з адраса, якога другі бок можа не чакаць.
Замацуйце шлюз праз gw_priority
Compose паказвае gw_priority для кожнага далучэння сэрвіса да сеткі пачынаючы з версіі 2.33.1, і перамагае найбольшы лік. Асобнага ключа шлюзу для сэрвіса няма, таму значэнне належыць блоку networks сэрвіса. Прыклад ніжэй аддае маршрут па змаўчанні control, пакідаючы office дасяжнай для яе непасрэдна падключанай LAN.
services:
vpn:
networks:
control:
gw_priority: 1
office:
gw_priority: 0
networks:
control:
driver: bridge
ipam:
config:
- subnet: 172.30.50.0/24
office:
driver: macvlan
driver_opts:
parent: eno1.120
macvlan_mode: bridge
ipam:
config:
- subnet: 192.168.120.0/24
ip_range: 192.168.120.192/27
gateway: 192.168.120.1
Чытайце блок як два асобныя кіраванні: gw_priority вызначае маршрут па змаўчанні, а раздзел ipam — адрасацыю. Калі змяніць толькі subnet, выбар выхаду застанецца нязменным, і гэта самы часты спосаб ужыць гэтае выпраўленне напалову. Трымайце прыярытэты побач з сеткай, якой яны кіруюць, каб наступнаму чытачу не давялося шукаць рашэнне.
Не блытайце gw_priority са звычайнай уласцівасцю priority побач. Яна ўпарадкоўвае стварэнне злучэнняў і нічога не кажа пра маршрутызацыю, таму не можа выбраць шлюз па змаўчанні і не выпраўляе назвы інтэрфейсаў. Калі хтосьці раіць падняць priority, каб накіраваць трафік, парада няправільная, нават калі атрыманы парадак выпадкова выглядае слушна.
Праверце, якая сетка сапраўды нясе маршрут па змаўчанні
Правярайце ўнутры працуючага кантэйнера, бо табліца маршрутызацыі хоста апісвае хост, а не прастору імёнаў, якую выкарыстоўвае сэрвіс. Спачатку запусціце праверку канфігурацыі, каб друкаваная памылка выявілася да перазапуску, потым прачытайце маршрут, які кантэйнер сапраўды ўсталяваў.
docker compose config --quiet
docker exec vpn ip -4 route show default
docker exec vpn cat /proc/net/route
Слушны вынік называе мост-прыладу і 172.30.50.1; няправільны называе 192.168.120.1 і прыладу macvlan. Калі вобраз не змяшчае пакета iproute2, файл /proc усё роўна паведамляе маршрут па змаўчанні, з прызначэннем 00000000 і байтамі шлюза ў адваротным парадку. Параўноўвайце слупок інтэрфейса з docker inspect, калі назвы прылад незразумелыя.
macvlan — гэта фізічны порт, а не клон моста
macvlan дае кантэйнеру другую асобу ў сетцы, і менавіта гэта робіць працаздольным доступ да лакальных прылад. Гэта таксама значыць, што порт камутатара і гіпервізар павінны прыняць дадатковы адрас MAC, і шматлікія хмарныя сеткі ціха гэта адмаўляюць. Праверце адзін кантэйнер, перш чым планаваць флот, бо адмоўлены MAC звычайна выглядае як звонка, якая ўзнята і нічога не перадае.
Налада macvlan_mode: bridge — гэта рэжым драйвера macvlan, а не праграмны мост Docker, а passthru — асобны спецыялізаваны рэжым, а не прадвызначаны. Linux таксама не дае кантэйнеру macvlan дасягнуць уласнага хоста праз той жа бацькоўскі інтэрфейс, і менавіта таму кіравальны мост застаецца, а не чаканне, што адно далучэнне выканае абедзве задачы.
Назвіце бацькоўскі VLAN да таго, як яго ўбачыць Compose
Docker трактуе бацькоўскі інтэрфейс з кропкай, як eno1.120, як субінтэрфейс 802.1Q і сам стварае прыладу VLAN. У гэтай зручнасці ёсць межы: вытворнае імя залежыць ад імя фізічнага інтэрфейса, а доўгія імёны могуць вывесці вынік за межы чаканняў навакольных інструментаў. Стварэнне іменнага інтэрфейса VLAN у канфігурацыі сеткі хоста і накіраванне parent на яго робіць абодва бакі прадказальнымі.
Памятайце, што ключ у networks — гэта імя Compose, а не прылада Linux. Пошук на хосце інтэрфейса з назвай office праваліцца, бо ядро бачыць толькі бацькоўскі інтэрфейс і пару veth за кантэйнерам.
Зрабіце месца для VPN зверху
Кліент VPN далучаецца пасля таго, як гэтыя сеткі ўжо існуюць, таму можа дадаць больш дакладныя маршруты, правілы палітыкі і фільтры незалежна ад gw_priority. Плануйце аддаленыя прэфіксы адносна абедзвюх лакальных падсетак, уключаючы адказы, патрэбныя кіравальнаму шляху. Калі аддалены прэфікс перакрывае офісную LAN, выпраўце план адрасоў, а не вырывайце цэлы прыватны дыяпазон з тунэля.
Пераправерце адрасы, маршруты і шлях сэрвіса пасля запуску VPN і яшчэ раз пасля яго перападключэння, бо менавіта пры перападключэнні знікае маршрут, дададзены ўручную. Запішыце чаканую табліцу да першага тэсту, каб параўнанне потым было diff, а не практыкаваннем на памяць. Трымайце пастаяннае ўладанне сеткай у Compose, а канфігурацыя VPN няхай валодае толькі сваёй палітыкай.