Docker port dərcetməsi VPN-ə qarşı: cavab hara gedir
Dərc edilmiş konteyner tərs NAT-dan əvvəl öz ünvanından cavab verir. İki dizayn bu cavabı ictimai yolda saxlaya bilər, fərqli xərclərlə.
VPN tam tunel rejimində qalxdıqdan sonra host SSH-a cavab verməyə davam edir, lakin eyni maşında Docker ilə dərc edilmiş xidmət susur. Dinləyicidə heç bir qüsur yoxdur: konteyner işləyir, port xəritələməsi mövcuddur və paket gəlir. Konteyner sağlamdır və sorğu həqiqətən ona çatır. Fərq ondadır ki, Linux öz marşrutunu seçərkən cavab haradan başlayır və bu fərq aşağıdakı iki dizayndan hansına ehtiyacınız olduğunu müəyyən edir.
Tuple-ı təyinat NAT-dan keçirərək izləyin
Tutaq ki, host 192.0.2.10 ünvanında TCP 2222 portunu 172.30.240.5:22 ünvanındakı konteynerə dərc edir. Sorğu 198.51.100.25 ünvanından gəlir və konteynerə çatmazdan əvvəl çevrilir, konteyner isə özü kimi cavab verir.
WAN request: 198.51.100.25 -> 192.0.2.10:2222
after DNAT: 198.51.100.25 -> 172.30.240.5:22
container reply: 172.30.240.5:22 -> 198.51.100.25
Hostun marşrut qərarı zamanı cavab hələ də konteynerin mənbə ünvanını daşıyır. Əks çevirmə dərc edilmiş tuple-ı sonra bərpa edir, buna görə paket məhz marşrut seçilən anda səhv görünür.
Niyə yalnız host üçün qayda bunu qaçırır
WAN cədvəlini yalnız 192.0.2.10 ünvanından gələn paketlər üçün seçən qayda hostun öz demonlarını əhatə edir və bu yönləndirilmiş cavabı tamamilə qaçırır. Cavabdakı mənbə ünvanı 172.30.240.5, host deyil.
Həddindən artıq düzəliş konteynerdən hər şeyi WAN ilə yönləndirməkdir ki, bu da konteynerin əlaqəsiz çıxan bağlantılarını VPN-dən azad edir. Bu, sizdən istənilən siyasətdən fərqlidir və adətən sonradan kimisə təəccübləndirir.
DNAT-dan sonra uyğunlaşdırma başqa bir hook-dur
Docker-in firewall sənədləri qeyd edir ki, adi istifadəçi filtrləməsi DNAT-dan sonrakı təyinatı görür, buna görə normal qaydada dərc edilmiş 2222 portunu uyğunlaşdırmaq konteyner portu 22-ni uyğunlaşdırmaqla eyni deyil. Əgər orijinal tuple vacibdirsə, hansı portun göründüyünü təxmin etmək əvəzinə dəstəklənən orijinal təyinat mexanizmindən istifadə edin.
Bu hook qarışıqlığı düzgün görünən və heç vaxt uyğunlaşmayan qaydalar yaradır. Siyasəti yenidən yazmazdan əvvəl qaydanın özündə sayğacları yoxlayın. Sıfır vuruşlu qayda sizə deyir ki, o, paketin heç vaxt çatmadığı yerdə qiymətləndirilir.
Dizayn A: qərarı bağlantı vəziyyəti kimi daşımaq
Bağlantı işarəsi giriş qərarını çevirmədən keçirə bilər, lakin vacib marşrut axtarışından əvvəl paketə bərpa edilməlidir. Mərhələlər bunlardır:
- Docker, VPN və ya başqa siyasət sahibi ilə toqquşmayan işarə sahəsi və qayda prioriteti ayırın.
- Yalnız nəzərdə tutulan yeni WAN bağlantısını bağlantı izləmənin mövcud olduğu DNAT-dan əvvəlki nöqtədə müəyyənləşdirin.
- Qərarı bağlantı işarəsinə yazın, orijinal sorğunun özünü WAN cədvəlinə məcbur etmədən.
- Cavab istiqamətində marşrutlaşdırmadan əvvəl paketə yalnız öz işarə bitlərinizi bərpa edin.
- Tam WAN cədvəlini kifayət qədər erkən seçin ki, VPN qaydası birinci qalib gələ bilməsin.
Bu cədvələ real qoşulmuş marşrutlar və şlüz lazımdır. Həmçinin marşrut olmadıqda müəyyən edilmiş davranış lazımdır. Tunelə səssiz düşmə ən pis nəticədir, çünki konfiqurasiya hələ də işləyən kimi görünür. Bunun əvəzinə qapalı uğursuz olun və bunu qeydə alın.
Dizayn B: hostda sonlandırmaq
Host tərəfində qəsdən konfiqurasiya edilmiş frontend, məsələn TCP proksisi və ya konteynerin qarşısında tərs proksi, cavabın host ünvanından çıxmasını saxlayır. Host üçün yazılmış qaydalar sonra gözlənildiyi kimi davranır və konteyner öz şəxsi şəbəkəsində qalır.
Xərc öz konfiqurasiyası, mənbə ünvanı emalı və giriş nəzarəti olan daha bir hərəkətli hissədir. Bu, adətən daha sadə dəstəklənən sərhəddir və marşrut siyasəti işdən çıxa biləcək bir şəxs tərəfindən saxlanılacaqsa, çox vaxt düzgün cavabdır.
Dəyişikliyi yoxlayın, niyyəti deyil
İctimai tərəfdən yeni icazəli bağlantı açın və cavabın nəzərdə tutulan interfeysdən çıxdığını təsdiqləyin. Sonra konteynerin başlatdığı əlaqəsiz sorğunun hələ də VPN-i izlədiyini yoxlayın.
Bir qaydanı sınamaq üçün maşının bağlantı cədvəlini təmizləməyin: mövcud qeydlər əvvəlki xəritələməsini saxlayır və təmizləmə hostdakı hər şeyi pozur. Port dərc etmək əlçatanlığı müəyyən edir. Cavab yolunu müəyyən etmir. Seçilmiş dizaynı cədvəl adları ilə yazın ki, növbəti şəxs onu hadisə zamanı yenidən kəşf etməsin.