Xostingizdagi brauzer VPN chiqish manzilini ko'rsatadi, konteyner uy ulanishi haqida xabar beradi, va kimdir buni oqish deb ataydi. Hech narsa oqib ketmagan. Xost tunneli xostning tarmoq nomlar fazosiga tegishli interfeyslar, marshrutlar va qoidalar to'plamidir, ko'prikdagi konteyner esa o'z standart marshrutiga ega boshqa nomlar fazosidir. Men VPN mijozi haftalab ulangan, lekin birorta konteyner paketi hech qachon unga kirmagan Compose stekida o'tirganman.

Nomlar fazosini tray belgisidan oldin tekshiring

Nomlar fazolari butun dalil. Docker ko'prik tarmog'ida konteyner ishga tushirganda, u tarmoq nomlar fazosini yaratadi, veth juftining bir uchini uning ichiga ulaydi va bu fazoga manzil hamda standart marshrut beradi. Tunnel interfeysi, qanday nomlanishidan qat'i nazar, xostning nomlar fazosida yashaydi. Konteyner ichidagi trafik uni ko'ra olmaydi, va hech qanday mijoz sozlamasi buni tashqaridan o'zgartirmaydi.

Izolyatsiyadan chiqishning ikkita qo'llab-quvvatlanadigan yo'li bor. --network host konteynerni xostning nomlar fazosi ichiga joylashtiradi, shuning uchun u xost marshrutlarini va shu bilan tunnelni meros oladi. --network container:vpn boshqa konteynerning nomlar fazosini bo'lishadi, va aksariyat sidecar loyihalari ish yukini VPN konteyneri orqali shunday yuboradi. Ikkalasi ham aniq tanlov; odatda ulardan faqat bittasi joylashtiruvchining niyati bo'lgan.

Xost rejimi bepul yangilanish emas. Konteyner o'z manziliga ega bo'lishni to'xtatadi, port e'lon qilish amal qilmaydi, va u yerda NET_ADMIN tutgan jarayon xost marshrutlashini qayta yozishi mumkin. Buni qabul qilish to'g'ri qaror bo'lishi mumkin. U allaqachon yoqilgan deb o'ylash — odamlar yo'lda hech qachon bo'lmagan tunnelni kechqurun tuzatish bilan o'tkazishining sababi.

Paketni ko'prikdan tashqariga kuzatib boring

Ko'prik konteyneri paketini o'z standart shlyuziga yuboradi, bu xostdagi ko'prik interfeysidir. So'ngra xost paketni uzatadi va standart konfiguratsiyada paket chiqishidan oldin manba manzilini o'z manziliga aylantiradi. Aynan shu tarjima bosqichi siyosatni jimgina yengadi.

Paket tunnelning oxirgi nuqtasiga yetganda xost manzilini olib yurgan bo'ladi. Konteynerning asl manziliga asoslangan har qanday qoida, siyosat marshruti yoki bo'lingan tunnel qarori mos kelishni to'xtatadi, va turli chiqishlardan chiqishi kerak bo'lgan ikki konteynerni faqat manba bo'yicha ajratib bo'lmaydi. Agar sizga har bir konteyner uchun marshrutlash kerak bo'lsa, qaror tarjimadan oldin yoki siz boshqaradigan nomlar fazosi ichida qabul qilinishi kerak.

Docker bu qoidalarni o'zi yuritadi, daemon qaysi xavfsizlik devori backend bilan sozlangan bo'lsa, o'sha orqali. Uzatiladigan trafik uchun qo'llab-quvvatlanadigan ilgakdan tashqarida qo'lda yozilgan qoidalar, DOCKER-USER, daemon qayta ishga tushganda yoki xost yangilanganda qayta tartiblanishi yoki olib tashlanishi mumkin. Dockerning paketlarni filtrlash bo'yicha hujjati zanjirlar tartibini ko'rsatadi; amaliy jihat shundaki, har bir qoidaga egasi va siz haqiqatan sinab ko'rgan qayta yuklash yo'li kerak.

Ikki tizimni alohida sinang

Bir nomlar fazosidan olingan dalil boshqasi haqida hech narsa demaydi. VPN konteyneri ichida bajarilgan so'rov tunnel o'sha konteyner uchun ishlashini isbotlaydi. Bu xost haqida dalil emas, va --network host konteyneridan bajarilgan xuddi shu buyruq ko'prik haqida dalil emas.

# 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'

So'ngra sinovni o'xshash obrazda emas, haqiqiy dastur konteyneri ichida takrorlang. Dastur qo'shimcha marshrut, proksi muhit o'zgaruvchisi yoki boshqa hal qiluvchi olib yurishi mumkin, va ularning har biri javobni o'zgartiradi. Har safar nom hal qilish va ikkinchi manzil oilasini tekshiring: foydalanuvchi belgilagan ko'priklardagi konteynerlar Dockerning o'rnatilgan hal qiluvchisi orqali 127.0.0.11 da hal qilinadi, va ko'prikdagi IPv6 standart marshruti siz faqat IPv4 tunnelni sinash bilan band bo'lganingizda trafikni tashqariga olib chiqishi mumkin.

Hisob ma'lumotlariga tegishdan oldin namunani o'qing

Xost ishlab, konteyner ishlamasa, sabab deyarli har doim tizimli bo'ladi, va kalitlarni aylantirish yoki mijozni qayta o'rnatish yarim kunni yo'qotadi. Avval belgini tartibga soling va tuzatish odatda o'zini o'zi nomlaydi.

What you seeUsual causeFirst check
Host exits through the VPN, container shows the ISP addressThe container never entered the tunnelDefault route inside the container
Container works until the daemon restarts, then stopsRules outside the supported hook, or a changed backendDaemon's reported firewall backend and DOCKER-USER
Container loses internal hosts after the tunnel comes upVPN prefix overlaps the Docker bridge subnetip route on the host, then docker network inspect
Small replies arrive, large ones hangTunnel MTU or missing MSS clampingLink MTU on both ends of the tunnel
Container falls back to the ISP address when the tunnel dropsNothing enforces the kill switch for forwarded trafficStop the tunnel with a request in flight

Qoplanish satri o'z gapiga loyiq. 172.17.0.0/16 uchun yoki ko'prik prefiksingizni tasodifan o'z ichiga olgan 10.0.0.0/8 uchun marshrutni itarib yuboradigan VPN profili tunnelni konteyner quyi tarmog'iga da'vo qilishga majbur qiladi, va tarjima qilingan manzillarga ketadigan javoblar noto'g'ri tomonga ketadi yoki yo'qoladi. Docker tarmog'ini qayta raqamlash odatda istisnolarni to'plashdan tozaroq.

Qamrovni aniq qiling, so'ngra ataylab buzing

Ikki loyiha ko'rikdan o'tadi. VPN konteynerining nomlar fazosini bo'lishing, va har bir qamrab olingan ish yuki bitta qayta ishga tushirish chegarasiga ega bitta tunneldan foydalanadi, bu bitta xizmatga boshqa chiqish yoki o'z DNS yo'li kerak bo'lgunga qadar oddiy. Yoki konteynerlar tarmog'ini xostdagi VPN shlyuziga yo'naltiring: uzatish yoqilgan, ko'prik prefiksi tunnelga qaratilgan, qaytish trafigi aniq ko'rib chiqilgan. Bu har bir tarmoq uchun nazorat sotib oladi va daemon hamda mijoz yangilanishlari davomida saqlashingiz kerak bo'lgan qoidalar to'plamini sizga qimmatga tushiradi.

Qanday bo'lmasin, muhim sinov — bu nosozlik holati. Konteyner so'rovi havoda bo'lganda tunnelni to'xtating va paket qayerga ketishini kuzating. Agar u to'g'ridan-to'g'ri yo'lga qaytsa, qamrov hech qachon joriy qilinmagan, chunki mijozning kill switch o'z trafigini boshqaradi, ko'prikdan uzatilgan paketlarni emas. So'ngra daemon va xostni qayta ishga tushiring va natijani ikkinchi marta tasdiqlang; qo'lda yozilgan qoidalar yo'qoladigan payt aynan o'sha.

Buni tugallangan deb aytishdan oldin to'rt narsani tasdiqlang: tunnel interfeysi trafik bilan bir nomlar fazosida, konteyner sinovi haqiqiy konteyner ichida o'tdi, nom hal qilish va ikkala manzil oilasi tekshirildi, va tunnel nosozligi sinovi hamon yopiq holda muvaffaqiyatsiz tugaydi. So'ngra xavfsizlik devori backendini, mijoz versiyasini va har bir qoidaning egasini yozib qo'ying. Aynan o'sha yozuv keyingi yangilanish eski taxminlarning hujjatlashtirilmagan aralashmasini qoldirishiga yo'l qo'ymaydi.

O'xshash maqolalar