Երկու ցանց ունեցող կոնտեյները ընտրում է սխալ դարպասը
Երկու միացում, մեկ լռելյայն երթուղի, և սխալ ցանցը միշտ հաղթում է։ Ամրացրեք ելքը 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-ից։ Պլանավորեք հեռավոր նախածանցերը երկու տեղական subnet-երի նկատմամբ, ներառյալ պատասխանները, որոնք անհրաժեշտ են կառավարման ուղուն։ Երբ հեռավոր նախածանցը համընկնում է գրասենյակի LAN-ի հետ, ուղղեք հասցեների պլանը, փոխարենը ամբողջ մասնավոր տիրույթը թունելից պոկելու։
Կրկին ստուգեք հասցեները, երթուղիները և ծառայության ուղին VPN-ի մեկնարկից հետո և ևս մեկ անգամ՝ վերամիացումից հետո, որովհետև հենց վերամիացման ժամանակ է անհետանում ձեռքով ավելացված երթուղին։ Գրի առեք սպասվող աղյուսակը առաջին փորձարկումից առաջ, որպեսզի հետագա համեմատությունը diff լինի, ոչ հիշողության վարժություն։ Պահեք ցանցի մշտական սեփականությունը Compose-ում և թույլ տվեք VPN կոնֆիգուրացիային տիրել միայն իր սեփական քաղաքականությանը։