Docker konteyner trafiki host VPN-ni yan keçir: necə yoxlamaq olar
Host VPN yalnız host adlar məkanını əhatə edir. Bu yoxlamalarla körpü konteyner trafikinin tunelə daxil olub-olmadığını və ya birbaşa çıxdığını müəyyənləşdirin.
Host brauzeriniz VPN çıxış ünvanını göstərir, konteyner isə ev bağlantınızı bildirir və kimsə bunu sızma adlandırır. Heç nə sızmayıb. Host tuneli host şəbəkə adlar məkanına aid interfeyslər, marşrutlar və qaydalar toplusudur, körpü üzərindəki konteyner isə öz standart marşrutu olan fərqli bir adlar məkanıdır. VPN müştərisinin həftələrlə qoşulduğu, lakin bir dənə də konteyner paketinin ora daxil olmadığı bir Compose yığını ilə işləmişəm.
Adlar məkanını tepsinin ikonasından əvvəl yoxlayın
Adlar məkanları bütün mübahisənin əsasıdır. Docker konteyneri körpü şəbəkəsində başladanda şəbəkə adlar məkanı yaradır, veth cütünün bir ucunu onun içində birləşdirir və həmin adlar məkanına ünvan və standart marşrut verir. Tunel interfeysi, adı nə olursa olsun, host adlar məkanında yaşayır. Konteynerin içindəki trafik onu görə bilmir və heç bir müştəri ayarı bunu kənardan dəyişmir.
İzolyasiyadan çıxmaq üçün iki dəstəklənən addım var. --network host konteyneri host adlar məkanının içinə yerləşdirir, beləliklə o, host marşrutlarını və deməli tuneli miras alır. --network container:vpn başqa konteynerin adlar məkanını paylaşır; əksər sidecar dizaynları iş yükünü VPN konteynerindən məhz belə keçirir. Hər ikisi açıq seçimdir; adətən onlardan yalnız biri yerləşdirməni edən şəxsin nəzərdə tutduğu olur.
Host rejimi pulsuz təkmilləşdirmə deyil. Konteyner öz ünvanına sahib olmağı dayandırır, port dərcetmə tətbiq olunmağı dayandırır və orada NET_ADMIN saxlayan proses host marşrutlaşdırmasını yenidən yaza bilər. Bunu qəbul etmək düzgün qərar ola bilər. Onun artıq işə salındığını güman etmək isə insanların heç vaxt yolda olmayan bir tuneli axşam boyu sazladığı haldır.
Paketi körpüdən çıxarkən izləyin
Körpü konteyneri paketini standart şlüzünə, yəni hostdakı körpü interfeysinə göndərir. Sonra host paketi yönləndirir və standart konfiqurasiyada paket çıxmazdan əvvəl mənbə ünvanını öz ünvanı ilə əvəz edir. Siyasəti səssizcə məhz bu çevirmə addımı pozdur.
Paket tunel son nöqtəsinə çatanda artıq host ünvanını daşıyır. Konteynerin ilkin ünvanına bağlanmış istənilən qayda, siyasət marşrutu və ya bölünmüş tunel qərarı uyğunluğu dayandırır və fərqli çıxışlardan çıxması nəzərdə tutulan iki konteyneri yalnız mənbəyə görə ayırd etmək mümkün olmur. Konteyner üzrə marşrutlaşdırma lazımdırsa, qərar çevirmədən əvvəl və ya nəzarət etdiyiniz adlar məkanının içində verilməlidir.
Docker bu qaydaları özü idarə edir, demonun konfiqurasiya olunduğu fayrvol arxa planı hansı olursa olsun. Yönləndirilən trafik üçün dəstəklənən qarmağın, yəni DOCKER-USER xaricində əl ilə yazılmış qaydalar demon yenidən başladıqda və ya host təkmilləşdirildikdə yenidən sıralana və ya silinə bilər. Dockerin paket filtrləmə sənədləri zəncir sırasını göstərir; praktik məqam odur ki, hər qaydanın bir sahibi və həqiqətən sınaqdan keçirdiyiniz yenidən yükləmə yolu olmalıdır.
İki sistemi ayrı-ayrılıqda sınayın
Bir adlar məkanından alınan sübut digəri haqqında heç nə demir. VPN konteynerinin içində icra olunan sorğu tunelin həmin konteyner üçün işlədiyini sübut edir. Bu, host haqqında sübut deyil və --network host konteynerindən icra olunan eyni əmr körpü haqqında sübut deyil.
# host namespace
ip route get 1.1.1.1
ip -brief addr show
# a fresh container on the same bridge network
docker run --rm --network appnet alpine sh -c 'ip route; cat /etc/resolv.conf; ip -6 route'
Sonra testi oxşar obrazda deyil, real tətbiq konteynerinin içində təkrarlayın. Tətbiq əlavə marşrut, proksi mühit dəyişəni və ya fərqli həlledici daşıya bilər və bunların hər biri cavabı dəyişir. Ad həllini və ikinci ünvan ailəsini hər dəfə yoxlayın: istifadəçi tərəfindən təyin edilmiş körpülərdəki konteynerlər Dockerin daxili həlledicisi vasitəsilə 127.0.0.11 ünvanında həll olunur və körpüdəki IPv6 standart marşrutu siz yalnız IPv4 tunelini sınayarkən trafiki bayıra çıxara bilər.
Şəxsiyyət məlumatlarına toxunmazdan əvvəl nümunəni oxuyun
Host işləyib konteyner işləməyəndə səbəb demək olar ki, hər dəfə strukturdur və açarları dəyişmək və ya müştərini yenidən quraşdırmaq bir günortanı boşa verir. Əvvəlcə simptomu sıralayın, adətən düzəliş özünü adlandırır.
| What you see | Usual cause | First check |
|---|---|---|
| Host exits through the VPN, container shows the ISP address | The container never entered the tunnel | Default route inside the container |
| Container works until the daemon restarts, then stops | Rules outside the supported hook, or a changed backend | Daemon's reported firewall backend and DOCKER-USER |
| Container loses internal hosts after the tunnel comes up | VPN prefix overlaps the Docker bridge subnet | ip route on the host, then docker network inspect |
| Small replies arrive, large ones hang | Tunnel MTU or missing MSS clamping | Link MTU on both ends of the tunnel |
| Container falls back to the ISP address when the tunnel drops | Nothing enforces the kill switch for forwarded traffic | Stop the tunnel with a request in flight |
Üst-üstə düşmə sətri özünə ayrıca bir cümlə layiqdir. 172.17.0.0/16 üçün və ya körpü prefiksinizi təsadüfən ehtiva edən 10.0.0.0/8 üçün marşrut itələyən VPN profili tunelin konteyner alt şəbəkəsini iddia etməsinə səbəb olur və çevrilmiş ünvanlara gedən cavablar yanlış istiqamətə yönələcək və ya yox olacaq. Docker şəbəkəsini yenidən nömrələmək adətən istisnaları yığmaqdan daha təmizdir.
Əhatəni açıq edin, sonra onu qəsdən pozun
İki dizayn yoxlamadan keçir. VPN konteynerinin adlar məkanını paylaşın və əhatə olunan hər iş yükü bir yenidən başlatma sərhədi olan bir tuneldən istifadə edir; bu, bir xidmətin fərqli çıxış və ya öz DNS yolu tələb etdiyi ana qədər sadədir. Və ya konteyner şəbəkəsini hostdakı VPN şlüzünə yönləndirin: yönləndirmə aktiv, körpü prefiksi tunelə yönəldilib, cavab trafiki açıq şəkildə idarə olunur. Bu, şəbəkə üzrə nəzarət alır və sizə demon və müştəri təkmilləşdirmələri boyunca saxlamağınız lazım olan qaydalar dəsti bahasına başa gəlir.
Hər halda, əhəmiyyətli olan test uğursuzluq halıdır. Konteyner sorğusu havadaykən tuneli dayandırın və paketin hara getdiyinə baxın. Əgər birbaşa yola qayıdırsa, əhatə heç vaxt tətbiq olunmayıb, çünki müştərinin kill switch funksiyası müştərinin öz trafikini idarə edir, körpüdən yönləndirilən paketləri yox. Sonra demonu və hostu yenidən başladın və nəticəni ikinci dəfə təsdiqləyin; əl ilə yazılmış qaydaların yox olduğu an məhz budur.
Bitmiş adlandırmazdan əvvəl dörd şeyi təsdiqləyin: tunel interfeysi trafiklə eyni adlar məkanındadır, konteyner testi real konteynerin içində keçirilib, ad həlli və hər iki ünvan ailəsi yoxlanılıb və tunel uğursuzluğu testi hələ də qapalı şəkildə uğursuz olur. Sonra fayrvol arxa planını, müştəri versiyasını və hər qaydanın sahibini yazın. Məhz bu qeyd növbəti təkmilləşdirmənin köhnə fərziyyələrin sənədləşdirilməmiş qarışığını yerində qoymasının qarşısını alır.