İki şəbəkəli konteyner səhv şlüzü seçir
İki qoşulma, bir defolt marşrut və səhv şəbəkə həmişə qalib gəlir. Çıxışı Compose gw_priority ilə bərkidin və konteynerin içindən təsdiqləyin.
Konteyneriniz hələ də öz idarəetmə körpüsündə cavab verir, lakin hər çıxan paket ofis macvlan şəbəkəsindən çıxır. Heç nə sıradan çıxmayıb. İki qoşulmanın hər biri öz şlüzünü təqdim edir və yeganə defolt marşrut nəzərdə tutmadığınız şəbəkəyə düşüb, buna görə xidmət işləməyə davam edir, trafik isə daha uzun yol seçir. Kimsə fərqinə varanda dəlil xəta mesajı deyil, marşrut cədvəli olur.
Adi izah Docker-in şəbəkəni təsadüfən seçməsidir. Əslində köhnə qərar qoşulmuş şəbəkə adlarının əlifba sırasına uyğun verilirdi və bu, marşrutlaşdırmanı etiketin yan nəticəsinə çevirirdi. gw_priority bunu qəsdən seçdiyiniz rəqəmlə əvəz edir və sxem yazıldıqdan sonra ona keçmək təxminən bir dəqiqə çəkir.
Defolt marşrut niyə səhv şəbəkəyə düşür
Xidmətin qoşulduğu hər şəbəkə öz şlüzünü təklif edə bilər, konteyner isə yenə də tam olaraq bir defolt marşrutla qalır. Compose 2.33.1-dən əvvəl bərabərlik şəbəkə adlarının sıralanması ilə həll olunurdu, yəni control kimi bir etiketin office-dən əvvəl gəlməsi trafikin hara getdiyini müəyyən edirdi. Konteynerin içində heç nə qərarın ixtiyari olduğunu qeyd etmir, buna görə də kod baxışından keçir və sonra qəribə marşrut kimi üzə çıxır. Seçimi yoxlanıla bilən etməyin yeganə yolu compose faylına siyasət qoymaqdır.
Hansı şəbəkənin qalib gəldiyini həqiqətən iki şey dəyişir: təyin etdiyiniz gw_priority dəyərləri və ümumiyyətlə hansı şəbəkələrin qoşulduğu. Üçüncü şəbəkə əlavə etsəniz namizədlər çoxalır; macvlan-ı çıxarsanız körpü ilə rəqabət aparacaq heç nə qalmır. Bu dəyişikliklərin heç biri tətbiq jurnallarında görünmür, çünki səhv defolt marşrut bağlantını nadir hallarda tamamilə pozur. Sadəcə cavabların qarşı tərəfin gözləmədiyi ünvandan gəlməsinə səbəb olur.
Şlüzü gw_priority ilə bərkidin
Compose 2.33.1 versiyasından hər xidmət-şəbəkə qoşulmasında gw_priority təqdim edir və ən yüksək rəqəm qalib gəlir. Hər xidmət üçün ayrıca şlüz açarı yoxdur, buna görə dəyər xidmətin networks blokunun altına aiddir. Aşağıdakı nümunə defoltu control-a verir, office isə birbaşa qoşulmuş LAN-ı üçün əlçatan qalır.
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
Bloku iki ayrı idarəetmə kimi oxuyun: gw_priority defolt marşrutu, ipam bölməsi isə ünvanlamanı həll edir. Yalnız subnet-i dəyişmək çıxış seçiminə toxunmur və bu düzəlişin yarımçıq tətbiq olunmasının ən geniş yayılmış yoludur. Prioritetləri idarə etdikləri şəbəkənin yanında saxlayın ki, növbəti oxucu qərarı axtarmağa məcbur olmasın.
gw_priority-ni yanındakı adi priority xassəsi ilə qarışdırmayın. O, bağlantıların yaradılma sırasını təyin edir və marşrutlaşdırma haqqında heç nə demir, yəni defolt şlüz seçə bilmir və interfeys adlandırmasını düzəltmir. Kimsə trafiki yönləndirmək üçün priority-ni artırmağı tövsiyə edirsə, nəticədəki sıra təsadüfən doğru görünsə belə, tövsiyə səhvdir.
Defolt marşrutu həqiqətən hansı şəbəkənin daşıdığını yoxlayın
İşləyən konteynerin içində yoxlayın, çünki host marşrut cədvəli xidmətin istifadə etdiyi ad məkanını deyil, hostu təsvir edir. Əvvəlcə konfiqurasiya yoxlamasını işə salın ki, səhv yazı yenidən başlatmadan əvvəl uğursuz olsun, sonra konteynerin həqiqətən quraşdırdığı marşrutu oxuyun.
docker compose config --quiet
docker exec vpn ip -4 route show default
docker exec vpn cat /proc/net/route
Düzgün nəticə körpü qurğusunu və 172.30.50.1-i göstərir; səhv nəticə 192.168.120.1-i və macvlan qurğusunu göstərir. Əgər obrazda iproute2 paketi yoxdursa, /proc faylı yenə də defolt marşrutu bildirir: təyinat 00000000 və şlüz baytları tərsinə. Qurğu adları aydın olmayanda interfeys sütununu docker inspect ilə müqayisə edin.
macvlan fiziki portdur, körpü klonu deyil
macvlan konteynerə naqildə ikinci kimlik verir və yerli qurğulara girişi məhz bu işlək edir. Bu həm də o deməkdir ki, kommutator portu və hipervisor əlavə MAC ünvanını qəbul etməlidir və bir çox bulud şəbəkəsi bunu səssizcə rədd edir. Donanma planlaşdırmadan əvvəl bir konteyneri sınayın, çünki rədd edilmiş MAC adətən işlək görünən, amma heç nə ötürməyən link kimi üzə çıxır.
macvlan_mode: bridge parametri macvlan sürücüsünün rejimidir, Docker-in proqram körpüsü deyil, passthru isə defolt deyil, ayrıca ixtisaslaşmış rejimdir. Linux həmçinin macvlan konteynerinin öz hostuna çatmasının qarşısını alır eyni valideyn vasitəsilə və buna görə idarəetmə körpüsü saxlanılır, bir qoşulmanın hər iki işi görməsi gözlənilmir.
VLAN valideynini Compose görməzdən əvvəl adlandırın
Docker eno1.120 kimi nöqtəli valideyni 802.1Q alt interfeysi kimi qəbul edir və VLAN qurğusunu özü yaradır. Bu rahatlığın hədləri var: törəmə ad fiziki interfeys adından asılıdır və uzun adlar nəticəni ətraf alətlərin gözlədiyindən uzağa apara bilər. Host şəbəkə konfiqurasiyasında adlı VLAN interfeysi yaratmaq və parent-i ona yönəltmək hər iki tərəfi proqnozlaşdırıla bilən edir.
Unutmayın ki, networks altındakı açar Compose adıdır, Linux qurğusu deyil. Hostda office adlı interfeys axtarmaq uğursuz olacaq, çünki nüvə yalnız valideyn interfeysi və konteynerin arxasındakı veth cütünü görür.
Üstdə VPN üçün yer açın
VPN klienti bu şəbəkələr mövcud olduqdan sonra qoşulur, buna görə gw_priority-dən asılı olmayaraq daha dəqiq marşrutlar, siyasət qaydaları və filtrlər əlavə edə bilər. Uzaq prefiksləri hər iki yerli subnetə qarşı planlaşdırın, idarəetmə yolunun ehtiyac duyduğu cavablar daxil olmaqla. Uzaq prefiks ofis LAN-ı ilə üst-üstə düşəndə tuneldən bütöv şəxsi diapazonu çıxarmaq əvəzinə ünvan planını düzəldin.
VPN işə düşdükdən sonra və yenidən qoşulduqdan sonra ünvanları, marşrutları və xidmət yolunu yenidən yoxlayın, çünki əl ilə əlavə edilmiş marşrut məhz yenidən qoşulma zamanı itir. Gözlənilən cədvəli ilk sınaqdan əvvəl yazın ki, sonrakı müqayisə yaddaş məşqi deyil, diff olsun. Davamlı şəbəkə sahibliyini Compose-da saxlayın və VPN konfiqurasiyası yalnız öz siyasətinə sahib olsun.