Приватни API се отвара у вашем десктоп прегледачу, а не успева у развојном контејнеру. То није противречност и ретко је сам VPN. Захтев прегледача и захтев који не успева упутила су различита процеса, са различитим резолверима, проксијима и рутама, а често и из потпуно различитих мрежних именских простора. Израз „на мом лаптопу“ може да значи Windows домаћин, WSL дистрибуцију, виртуелну машину Docker Desktop-а и контејнер унутар те виртуелне машине, четири контекста која истом имену домаћина могу да одговоре различито. Откријте који од њих користи процес који не успева пре него што додирнете иједно подешавање.

Лоцирајте процес пре него што промените подешавање

Почните од контејнерског мотора, а не од VPN клијента. Питајте са којим контекстом командна линија разговара и на ком оперативном систему тај мотор ради, јер је Linux контејнер којим управља десктоп виртуелна машина другачија путања од оног којим управља локални демон:

docker context ls
docker info --format '{{.OperatingSystem}} / {{.Name}}'
docker run --rm alpine ip route

На Windows-у, wsl -l -v вам каже да ли се дистрибуција извршава под WSL 2, што је ставља иза сопственог виртуелног свича. Тај детаљ одређује да ли контејнер дели табелу рутирања домаћина или стоји иза NAT-а коме је потребан прослеђени порт или име домаћина да би достигао домаћина.

Држите један захтев константним и упоредите

Изаберите једну безопасну крајњу тачку на приватном домаћину и користите је за свако поређење, из прегледача, из терминала домаћина, из WSL дистрибуције и изнутра контејнера. Забележите четири ствари за сваки покушај: резолвовану адресу, да ли је коришћен прокси, класу отказа и протекло време. Претрага имена, успостављање везе, TLS валидација и HTTP статус су четири различита проблема, а њихово спајање у „не ради“ троши цело преподне.

Извршите поређење унутар контејнера који не успева, са временским ограничењем, да тихи firewall не би држао терминал минутима. Нов контејнер репродукује мрежни контекст мотора, али не именски простор, прокси променљиве или резолвер апликацијског контејнера, зато је docker exec у прави контејнер меродаван тест, а помоћни контејнер је само начин да се изолује да ли је разлика у мотору или у контејнеру:

docker exec -it app /bin/sh -c "getent hosts api.internal; curl -v --max-time 8 https://api.internal/ 2>&1 | tail -20"
docker run --rm --network container:app curlimages/curl:latest -sv --max-time 8 https://api.internal/ 2>&1 | tail -20

Основна alpine слика садржи busybox и нема curl, и управо такав детаљ чини да копирани дијагностички блок не успе: изаберите слику са клијентом или га додајте у истом извршавању. Поређење са небитним јавним сајтовима не изолује ништа. Ако https://example.com ради из контејнера, научили сте да контејнер има интернет приступ и ништа о томе да ли може да достигне приватну адресу кроз тунел. Исто тако, отварање новог терминала доказује само да нови терминал ради, не и да дели извршно окружење са апликацијом која није успела.

Docker Desktop може да ради са VPN-ом

Документација самог Docker-а о VPN-у и повезивању са домаћином описује ово као подржану поставку, а искрена кратка верзија је да то ради, а не да је аутоматски покварено. Не претпостављајте да десктоп виртуелна машина заобилази тунел домаћина по дизајну; у многим поставкама саобраћај исправно прати тунел домаћина, због чега фолклор „Docker игнорише VPN“ даје самоуверене и погрешне савете.

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

Преклапања адреса и MTU су различити откази

Два отказа заслужују сопствену дијагнозу јер се често мешају са политиком приступа. Први је преклапање адреса: ако VPN гура опсег који се судара са подмрежом подразумеваног моста контејнерске мреже, рута контејнера за тај опсег показује на локални мост и никада не стиже до тунела. Прегледајте стварне подмреже уместо да нагађате:

docker network inspect bridge --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}'
ip route get 10.20.30.40

Други је проблем са MTU-ом. Ако се веза успостави и TLS се заврши, али већи одговори застају, имате проблем са величином пакета, не са ауторизацијом, и замена DNS записа то никада неће поправити. Тестирајте малим и великим захтевом пре него што било шта промените и забележите оба исхода.

Поправка за преклапање је друга подмрежа контејнера или ограничена рута, коју бира онај ко управља планом адреса. Поправка за застој MTU-а је ограничавање или смањивање MTU-а тунела или интерфејса на вредност која преживљава путању, примењено на слоју који контролишете.

Прокси конфигурација је по процесу, не по машини

Унутар контејнера, localhost именује мрежни контекст самог тог контејнера, па прокси који ради на домаћину није доступан тамо под тим именом. Docker Desktop обезбеђује host.docker.internal за приступ домаћину, а на Linux-у га додајете експлицитно са --add-host=host.docker.internal:host-gateway. У оба случаја, то име вам даје руту до домаћина; оно не ствара прокси сервис нити вас овлашћује да га користите.

Користите адресу и порт проксија који су дати за стварно окружење и проверите ко га чита. Променљиве извезене у интерактивном shell-у не конфигуришу аутоматски свако проширење едитора, језички сервер, алат за изградњу и позадински демон. Онај који је важан је процес који је упутио захтев који не успева, зато прегледајте његово окружење, а не окружење свог терминала.

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

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