Fuatilia ombi moja kutoka simu iliyo kwenye treni hadi backend inayopatikana tu ndani ya mtandao wa faragha. Simu hutatua jina la umma, huunganisha na anwani ya umma kwenye lango 443 na hukamilisha TLS handshake ya kawaida. Nginx hukubali muunganisho huo kisha hufungua wa pili, uliotengana kabisa, kwa anwani ambayo huifikia tu kupitia kiolesura cha VPN. Hakuna kinachobadilika kwenye simu, na simu haijui kamwe kwamba handaki ilihusika.

Kufuatilia ombi moja kupitia muunganisho miwili

Sehemu inayoingia ni shughuli ya HTTP ya umma. Ina jina la umma, cheti cha umma na njia ya majibu ambayo lazima ifanye kazi kwa anwani yoyote aliyo nayo mgeni wakati huo. Mabadiliko yoyote yanayovuruga njia hiyo huvunja wageni wote kwa wakati mmoja. Ndiyo sababu sehemu ya umma ni sehemu ambayo unataka kufanya majaribio nayo kidogo zaidi.

Sehemu inayotoka ni ya faragha. Nginx huwa mteja, hutatua jina la ndani au hutumia anwani isiyobadilika, na hufikia huduma ambayo ingekataa muunganisho kutoka mtandao.

Public client  -> frontend public address:443   (TLS, public name)
Frontend       -> VPN private backend 10.40.0.20:8443  (TLS, private name)

Ziweke tofauti akilini mwako na usanidi utakuwa wazi. Ukizichanganya, utaishia kujaribu kumfanya mteja wa umma ashiriki katika handaki, na hapo ndipo sehemu kubwa ya mkanganyiko wa muundo huu inatoka. Sehemu ya faragha inaweza kuwa dhaifu. Sehemu ya umma haifai.

Kabla ya kujenga chochote kati ya hivi, thibitisha kwamba kuchapisha programu ni kwa kusudi. Proksi inayofanya kazi pia ni ufichuzi unaofanya kazi, na modeli ya uthibitishaji lazima iwe uamuzi, si athari ya pembeni.

Jina la lango lazima lidumu kupitia handaki

Kuna mtego wa hila katika utatuzi wa majina. Ikiwa DNS ya faragha inabatilisha jina lile lile ambalo wasifu wa VPN hutumia kwa lango lake mwenyewe, kuunganisha upya kunaweza kuishia kujaribu kufikia lango hilo kupitia handaki ambalo linapaswa kuliunda yenyewe. Mteja anahitaji jina hilo litatuliwe kabla handaki haipo. Mara linapotatuliwa ndani ya handaki, muunganisho hauwezi kujengwa kabisa.

Tumia majina tofauti yaliyoidhinishwa kwa lango na backend, na unganisha sera ya kutatua majina ili kila jina litatuliwe kwa anwani ambayo mtumiaji wake anaihitaji. Kubadilisha kichwa cha Host cha programu hakusaidii hapa, kwa sababu mteja wa VPN ndiye anayefanya utafutaji.

Kisha fikiria wigo. Frontend inahitaji njia kwa anwani ya backend, na pia lazima iendelee kujibu wateja wa umma. Handaki kamili kwenye mwenyeji huyo linaweza kutimiza sharti la kwanza na kuvunja la pili.

Ambapo sera inaruhusu, handaki kwa lengo maalum ni muundo safi zaidi. Ambapo sera inalazimisha handaki kamili, frontend ni ya muktadha tofauti wa mtandao badala ya kubandikwa kwa njia za muda kwa wageni wanaojulikana.

Andika kizuizi cha seva ili sehemu zote mbili zithibitishe

Dhana kwamba backend inawasilisha cheti cha jina hili: backend.corp.example na hujibu kwenye anwani ya faragha. Kuunganisha na anwani huku ukithibitisha jina ni kusudi hasa la chaguo za SNI na jina za moduli ya proksi.

upstream private_app {
    server 10.40.0.20:8443;
}

server {
    listen 443 ssl;
    server_name app.example.com;

    ssl_certificate     /etc/nginx/tls/app-fullchain.pem;
    ssl_certificate_key /etc/nginx/tls/app-key.pem;

    location / {
        proxy_pass https://private_app;
        proxy_ssl_server_name on;
        proxy_ssl_name backend.corp.example;
        proxy_ssl_trusted_certificate /etc/nginx/trust/backend-ca.pem;
        proxy_ssl_verify on;
        proxy_ssl_verify_depth 3;

        proxy_set_header Host app.example.com;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

Kila njia na anwani hapo juu ni kishika nafasi. Muhimu ni sehemu zinazoweka uthibitishaji ukiwa hai: jina la kukagua, kifurushi cha uaminifu cha kukagua nacho, na kina kinacholingana na mnyororo ulioidhinishwa.

proxy_set_header Host app.example.com ni kwa kusudi. Backend inapaswa kusanidiwa kukubali asili hiyo ya umma, na inapaswa kuamini vichwa vilivyopelekwa tu kutoka frontend hii. Kuandika juu ya X-Forwarded-For kwa anwani ya mteja ni sahihi kwa proksi moja na si sahihi kwa mnyororo, kwa hivyo usambazaji wa proksi nyingi unahitaji mpangilio wake wa anwani zinazoaminika.

Kufanya asili ya umma ijifanye kama asili ya umma

Programu inapaswa kutoa URL kamili, uelekezaji upya na vidakuzi kwa asili ya umma. Ikiwa inaelekeza mgeni kwenye backend.corp.example, mgeni huyo anapelekwa kwa jina ambalo hawezi kulitatua.

Rekebisha hilo kupitia mpangilio wa URL ya nje unaoungwa mkono na programu na sera iliyopitiwa ya uelekezaji upya, si kwa kuandika upya majina ya mwenyeji katika miili ya majibu. Ubadilishaji wa mifuatano katika maudhui holela huvunja mizigo iliyosainiwa na kuunda hitilafu ambazo ni ngumu kufuatilia.

Vidakuzi vinastahili uangalifu sawa. Kidakuzi kilichowekwa kwa jina la faragha hakitumiwi kamwe na kivinjari kinachojua tu la umma.

Thibitisha pia kwamba Nginx inaweza kweli kumiliki soketi ya umma. Huduma ya wavuti iliyopo kwenye 443 lazima ihame au frontend lazima iishi mahali pengine, kwa sababu michakato miwili haiwezi kufunga anwani na lango moja.

Kagua kila sehemu mahali inapofanya kazi kweli

Thibitisha usanidi kwa kichanganuzi kilichosakinishwa kabla ya upakiaji upya wowote, ili makosa ya uchapaji yasiangushe msikilizaji anayehudumia sasa.

Kisha jaribu sehemu ya backend kutoka kwa mwenyeji wa frontend wenyewe, katika muktadha wa mtandao ambao Nginx hutumia. Ping kupitia handaki huthibitisha ufikivu na hakuna kitu kuhusu TLS, idhini au programu.

Mwisho, tuma ombi jipya la umma kwa jina halisi la mwenyeji ukiwa na uthibitishaji wa kawaida wa cheti, na uangalie njia ya majibu si mwili wa majibu pekee.

Hifadhi uchunguzi wote wawili pamoja na usanidi uliosambazwa, na andika kinachotokea handaki linapokosekana. Frontend inapaswa kurudisha hitilafu ya upstream iliyodhibitiwa, si kunyamaza na kuanguka kwa backend nyingine ambayo hakuna aliyeidokumenta. 502 yenye mstari wazi wa kumbukumbu ni matokeo mazuri. Ukurasa uliohifadhiwa kwenye akiba kutoka asili isiyokusudiwa si matokeo mazuri.

Makala zinazohusiana