Прегледач на домаћину показује излазну адресу VPN-а, контејнер пријављује вашу кућну везу, а неко то назива цурењем. Ништа није исцурило. Тунел домаћина је скуп интерфејса, рута и правила који припадају мрежном простору имена домаћина, а контејнер на мосту је други простор имена са својом подразумеваном рутом. Седео сам на Compose стеку где је VPN клијент био повезан недељама и ниједан контејнерски пакет никада није ушао у њега.

Проверите простор имена пре иконе у системској траци

Простори имена су цео аргумент. Када Docker покрене контејнер на мостовној мрежи, он ствара мрежни простор имена, причвршћује један крај veth пара унутар њега и даје том простору адресу и подразумевану руту. Интерфејс тунела, како год се звао, живи у простору имена домаћина. Саобраћај унутар контејнера не може да га види, и ниједно подешавање клијента то не мења споља.

Два подржана потеза вас извлаче из изолације. --network host смешта контејнер у простор имена домаћина, па он наслеђује руте домаћина и тиме тунел. --network container:vpn дели простор имена другог контејнера, и тако већина sidecar решења шаље радно оптерећење кроз VPN контејнер. Оба су експлицитни избори; обично је само један од њих оно што је особа која распоређује имала на уму.

Режим домаћина није бесплатна надоградња. Контејнер престаје да има сопствену адресу, објављивање портова престаје да важи, а процес који тамо држи NET_ADMIN може да препише рутирање домаћина. Прихватити то може бити исправан потез. Претпоставити да је већ укључено јесте начин на који људи проведу вече отклањајући грешке на тунелу који никада није био на путу.

Пратите пакет са моста

Контејнер на мосту шаље свој пакет свом подразумеваном гејтвеју, а то је интерфејс моста на домаћину. Домаћин затим прослеђује пакет и, у подразумеваној конфигурацији, преводи изворну адресу у своју пре него што пакет изађе. Управо тај корак превођења тихо поништава политику.

Док пакет стигне до крајње тачке тунела, носи адресу домаћина. Свако правило, политичка рута или одлука о подељеном тунелу везана за оригиналну адресу контејнера престаје да се поклапа, а два контејнера намењена различитим излазима не могу се разликовати само по извору. Ако вам треба рутирање по контејнеру, одлука мора пасти пре превођења или унутар простора имена који контролишете.

Docker сам одржава ова правила, кроз који год firewall backend демон био конфигурисан. Руком писана правила изван подржане куке за прослеђени саобраћај, DOCKER-USER, могу бити преуређена или одбачена када се демон поново покрене или домаћин надогради. Docker документација о филтрирању пакета показује редослед ланаца; практична поента је да свако правило треба власника и пут за поновно учитавање који сте заиста тестирали.

Тестирајте два система одвојено

Докази из једног простора имена не говоре ништа о другом. Захтев покренут унутар VPN контејнера доказује да тунел ради за тај контејнер. То није доказ о домаћину, а иста команда покренута из контејнера са --network host није доказ о мосту.

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

Затим поновите тест унутар стварног контејнера апликације, а не сличне слике. Апликација може носити додатну руту, променљиву окружења за прокси или други резолвер, и свака од тога мења одговор. Проверите разрешавање имена и другу фамилију адреса сваки пут: контејнери на кориснички дефинисаним мостовима разрешавају се кроз Docker-ов уграђени резолвер на 127.0.0.11, а подразумевана рута IPv6 на мосту може изнети саобраћај напоље док сте заузети тестирањем тунела само за IPv4.

Прочитајте образац пре него што дотакнете акредитиве

Када домаћин ради, а контејнер не, узрок је готово увек структурни, а ротирање кључева или поновна инсталација клијента губи поподне. Прво сортирајте симптом и исправка се обично сама именује.

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

Ред о преклапању заслужује своју реченицу. VPN профил који гура руту за 172.17.0.0/16, или за 10.0.0.0/8 која случајно садржи префикс вашег моста, тера тунел да присвоји подмрежу контејнера, а одговори на преведене адресе кренуће у погрешном смеру или нестати. Пренумерисање Docker мреже обично је чистије од гомилања изузетака.

Учините покривеност експлицитном, па је намерно покварите

Два дизајна издржавају преглед. Поделите простор имена VPN контејнера и свако покривено радно оптерећење користи један тунел са једном границом поновног покретања, што је једноставно док једној услузи не затреба другачији излаз или сопствена DNS путања. Или усмерите мрежу контејнера на VPN гејтвеј на домаћину: прослеђивање укључено, префикс моста усмерен на тунел, повратни саобраћај експлицитно обрађен. То купује контролу по мрежи и кошта вас скуп правила који морате одржавати кроз надоградње демона и клијента.

Било како било, тест који је важан је случај квара. Зауставите тунел са захтевом контејнера у лету и гледајте куда пакет иде. Ако се врати на директну путању, покривеност никада није била наметнута, јер kill switch клијента управља сопственим саобраћајем клијента, а не прослеђеним пакетима са моста. Затим поново покрените демон и домаћина и потврдите резултат други пут; то је тренутак када руком писана правила нестају.

Пре него што то назовете готовим, потврдите четири ствари: интерфејс тунела је у истом простору имена као саобраћај, тест контејнера је изведен унутар стварног контејнера, разрешавање имена и обе фамилије адреса су проверене, и тест квара тунела и даље не успева затворено. Затим запишите firewall backend, верзију клијента и власника сваког правила. Тај запис спречава следећу надоградњу да остави недокументовану мешавину старих претпоставки.

Повезани чланци