Nginx o flaen, backend preifat y tu ôl i'r VPN
Mae'r porwr yn siarad â Nginx, ac mae Nginx yn agor ail gysylltiad i mewn i'r twnnel. Llwybrha'r ddau, dilysa'r ddau dystysgrif a chadw'r ailgyfeiriadau cyhoeddus yn gyhoeddus.
Dilynwch un cais o ffôn ar drên hyd at backend sydd ond yn bodoli o fewn rhwydwaith preifat. Mae'r ffôn yn datrys enw cyhoeddus, yn cysylltu â chyfeiriad cyhoeddus ar borth 443 ac yn cwblhau ysgwyd llaw TLS arferol. Mae Nginx yn derbyn y cysylltiad hwnnw ac yna'n agor ail un, hollol ar wahân, i gyfeiriad na all ei gyrraedd ond drwy ryngwyneb VPN. Nid oes dim yn newid ar y ffôn, ac ni fydd y ffôn byth yn gwybod bod twnnel wedi bod yn gysylltiedig.
Dilyn un cais drwy ddau gysylltiad
Mae'r rhan fewnol yn drafodiad HTTP cyhoeddus. Mae ganddo enw cyhoeddus, tystysgrif gyhoeddus a llwybr ateb sy'n rhaid gweithio ar gyfer unrhyw gyfeiriad sydd gan yr ymwelydd ar y pryd. Mae unrhyw newid sy'n tarfu ar y llwybr hwnnw yn torri pob ymwelydd ar unwaith. Dyna pam mai'r rhan gyhoeddus yw'r un yr ydych leiaf eisiau arbrofi arni.
Mae'r rhan allanol yn breifat. Daw Nginx yn gleient, mae'n datrys enw mewnol neu'n defnyddio cyfeiriad sefydlog, ac mae'n cyrraedd gwasanaeth a fyddai'n gwrthod cysylltiad o'r rhyngrwyd.
Public client -> frontend public address:443 (TLS, public name)
Frontend -> VPN private backend 10.40.0.20:8443 (TLS, private name)
Cadwch y ddau ar wahân yn eich pen ac mae'r ffurfweddiad yn dod yn amlwg. Eu cymysgu, ac fe gewch eich hun yn ceisio gwneud i gleient cyhoeddus gymryd rhan mewn twnnel, a dyna lle mae'r rhan fwyaf o'r dryswch yn y cynllun hwn yn dod o. Caniateir i'r rhan breifat fod yn fregus. Nid y rhan gyhoeddus.
Cyn adeiladu unrhyw beth o hyn, cadarnhewch fod cyhoeddi'r ap yn fwriadol. Mae dirprwy sy'n gweithio hefyd yn ddatguddiad sy'n gweithio, ac mae'n rhaid i'r model dilysu fod yn benderfyniad, nid yn sgil-effaith.
Rhaid i enw'r porth fyw drwy'r twnnel
Mae trap cyfrwys yn natrysiad enwau. Os yw DNS preifat yn trosysgrifo'r un enw ag y mae'r proffil VPN yn ei ddefnyddio ar gyfer ei borth ei hun, gall ailgysylltu orffen trwy geisio cyrraedd y porth hwnnw drwy'r twnnel y dylai ei greu ei hun. Mae angen i'r cleient gael yr enw hwnnw wedi'i ddatrys cyn bod y twnnel. Unwaith y caiff ei ddatrys y tu mewn i'r twnnel, ni ellir adeiladu'r cysylltiad o gwbl.
Defnyddiwch enwau cymeradwy ar wahân ar gyfer y porth a'r backend, a chyfyngwch bolisi'r datryswr fel bod pob enw'n datrys i'r cyfeiriad sydd ei angen ar ei ddefnyddiwr. Nid yw newid pennawd Host ap yn helpu dim yma, oherwydd y cleient VPN sy'n gwneud y chwiliad.
Yna meddyliwch am gwmpas. Mae angen llwybr ar y frontend i gyfeiriad y backend, ac mae hefyd angen parhau i ateb cleientiaid cyhoeddus. Gall twnnel llawn ar y gwesteiwr hwnnw fodloni'r gofyniad cyntaf a thorri'r ail.
Lle mae'r polisi'n caniatáu, twnnel i gyrchfan benodol yw'r cynllun glanach. Lle mae'r polisi'n mynnu twnnel llawn, mae'r frontend yn perthyn i gyd-destun rhwydwaith ar wahân yn hytrach na chael ei glytio â llwybrau achlysurol ar gyfer ymwelwyr hysbys.
Ysgrifennu'r bloc gweinydd fel bod y ddwy ran yn dilysu
Tybiwch fod y backend yn cyflwyno tystysgrif ar gyfer yr enw hwn: backend.corp.example ac yn ateb ar gyfeiriad preifat. Cysylltu â chyfeiriad wrth ddilysu enw yw'n union ddiben opsiynau SNI ac enw'r modiwl dirprwy.
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;
}
}
Mae pob llwybr a chyfeiriad uchod yn ddeiliad lle. Y rhannau pwysig yw'r rhai sy'n cadw dilysu ymlaen: enw i'w wirio, bwndel ymddiriedaeth i'w wirio yn ei erbyn, a dyfnder sy'n cyd-fynd â'r gadwyn gymeradwy.
proxy_set_header Host app.example.com yn fwriadol. Dylai'r backend gael ei ffurfweddu i dderbyn y tarddiad cyhoeddus hwnnw, a dylai ymddiried mewn penawdau a basiwyd ymlaen yn unig o'r frontend hwn. Ysgrifennu dros y X-Forwarded-For gyda chyfeiriad y cleient sydd gywir ar gyfer un dirprwy ac yn anghywir ar gyfer cadwyn, felly mae angen i wasanaethiad aml-ddirprwy gael ei drefniant ei hun ar gyfer cyfeiriadau dibynadwy.
Gwneud i'r tarddiad cyhoeddus ymddwyn fel tarddiad cyhoeddus
Dylai'r ap ryddhau URLau absoliwt, ailgyfeiriadau a chwcis ar gyfer y tarddiad cyhoeddus. Os yw'n ailgyfeirio ymwelydd i'r backend.corp.example, mae'r ymwelydd hwnnw'n cael ei anfon i enw na all ei ddatrys.
Trwsiwch hynny drwy osodiad URL allanol yr ap a bolisi ailgyfeirio wedi'i adolygu, nid drwy ailysgrifennu enwau gwesteiwr yng nghyrff yr atebion. Mae disodli llinynnau mewn cynnwys mympwyol yn torri llwythi wedi'u llofnodi ac yn creu bygiau sy'n anodd eu holrhain.
Mae cwcis yn haeddu'r un gofal. Ni fydd cwci sydd wedi'i gwmpasu i'r enw preifat byth yn cael ei anfon gan borwr nad yw ond yn gwybod yr un cyhoeddus.
Cadarnhewch hefyd y gall Nginx wir feddu ar y soced cyhoeddus. Rhaid i wasanaeth gwe sy'n bodoli eisoes ar 443 symud neu mae'n rhaid i'r frontend fyw yn rhywle arall, oherwydd ni all dau broses rwymo'r un cyfeiriad a phorth.
Gwirio pob rhan lle mae'n rhedeg mewn gwirionedd
Dilyswch y ffurfweddiad gyda'r dadansoddwr sydd wedi'i osod cyn unrhyw ail-lwytho, fel nad yw camgymeriad teipio yn cwympo'r gwrandäwr sy'n gwasanaethu ar hyn o bryd.
Yna profwch ran y backend o westeiwr y frontend ei hun, yn yr un cyd-destun rhwydwaith ag y mae Nginx yn ei ddefnyddio. Mae ping drwy'r twnnel yn profi cyrhaeddedd a dim byd am TLS, awdurdodiad na'r ap.
Yn olaf gwnewch gais cyhoeddus newydd i'r gwesteiwr enw go iawn gyda dilysu tystysgrif arferol, ac arsylwch y llwybr ateb yn hytrach na chorff yr ateb yn unig.
Cadwch y ddau arsylwad gyda'r ffurfweddiad a osodwyd, a chofnodwch beth sy'n digwydd pan nad yw'r twnnel ar gael. Dylai'r frontend ddychwelyd gwall upstream a reolir, nid disgyn yn dawel i backend arall na chafodd neb ei ddogfennu. Mae 502 â llinell log glir yn ganlyniad da. Tudalen wedi'i chache o darddiad anfwriadol nad yw'n ganlyniad da.