Ĉiu linio en la alirkontrola protokolo montras la saman loopback-adreson, dum la paĝo mem ŝargiĝas kaj la atestilo kontroliĝas ĝuste. Nenio estas rompita laŭ tiu senco, ke ĝi estus neatingebla, kaj ĝuste tial ĉi tio postvivas monatojn. Tio, kio rompiĝis, estas la atribuado: la reta malantaŭaĵo registras la adreson de la salto, kiu plusendis la konekton, kaj ĉiu posta decido, kiu fidis la protokolon, heredis la saman malĝustan respondon.

La subaj kontroloj iras de la kablo enen. Haltu ĉe la unua, kiu klarigas la valoron, kiun vi vidas, ĉar ĉiu posta paŝo supozas, ke la antaŭaj jam veras. Neniu el ili postulas diveni la agordon de la antaŭaĵo.

Sekvu la du konektojn, ne la protokolan linion

Port-Share multobligas du protokolojn sur unu TCP-aŭskultanto. OpenVPN ekzamenas la unuajn bajtojn de alvenanta konekto, retenas ĝin, kiam ĝi aspektas kiel ĝia propra protokolo, kaj transdonas ĉion alian al dua celo. Tiu celo kutime estas retservilo sur la sama gastiganto, do la akceptita ingo de la retservilo havas la procezon OpenVPN kiel sian kunulon.

ss -ltnp 'sport = :443'
ss -tnp 'dport = :8080'

La unua komando montras, kiu posedas la publikan aŭskultanton. La dua montras la konektojn alvenantajn ĉe la malantaŭa pordo, kaj ilia kunula adreso estas tiu, kiun la alirkontrola protokolo presos. Se tiu kunulo estas loopback, la protokolo estas preciza kaj la informo perdiĝis unu tavolon pli frue. Renomi la protokolan kampon aŭ ŝalti modulon por klienta IP ne rekuperos adreson, kiun la konekto neniam portis.

Ĉi tiu kontrolo decidas ĉion alian. Se la kunulo de la malantaŭaĵo estas la adreso de la retumilo, la divido de la pordo ne estas via problemo, sed la formato de la protokolo.

Transporta plusendado ne estas enĵeto de kaplinio

La plusendilo movas bajtojn. Ĝi ne analizas HTTP, do ĝi ne povas enmeti kaplinion en peton, kiun ĝi neniam legas kiel peton, kaj ĝi ne povas aldoni ion al TLS-fluo, kiun ĝi trapasas netuŝita. Modulo, kiu atendas kaplinion de prokurilo, daŭre atendas tian, kiun neniu komponanto produktas.

Du mekanismoj povas porti la originan adreson, kaj ambaŭ postulas interkonsenton ĉe ambaŭ flankoj. La protokolo PROXY antaŭmetas malgrandan kaplinion al la konekto, kaj la malantaŭaĵo devas esti agordita atendi ĝin; malantaŭaĵo, kiu ne atendas ĝin, traktos tiujn bajtojn kiel la komencon de la peto kaj malsukcesos konfuze. Fidindaj prokurilaj kaplinioj kiel X-Forwarded-For funkcias, kiam HTTP-konscia prokurilo starigas ilin kaj oni diras al la malantaŭaĵo, kiuj kunuloj rajtas aserti ilin.

Neniu el ili estas aŭtomata, kaj neniu estas sekura defaŭlte. Malantaŭaĵo, kiu kredas ĉiun alvenantan plusenditan kaplinion, permesas al kliento elekti sian propran adreson, kio transformas neĝustecon en la protokolo en ĉirkaŭiron de la alirkontrolo. Rulu la demonstron unufoje sur testa gastiganto antaŭ ol fidi iun ajn kaplinion sur produktada vojo.

curl -sS -H 'X-Forwarded-For: 127.0.0.1' https://site.example.com/health
grep -F '127.0.0.1' /var/log/nginx/access.log | tail -n 3

La laŭvola fontmapa dosierujo

La divido de pordo havas laŭvolan dosierujan argumenton, kiu registras mapadon inter la origina fonta adreso kaj la plusenda konekto, sur platformoj, kie la funkcio estas realigita. La reta flanko devas konsulti tiun mapadon; ĝi ne estas kaplinio, kaj ĝi ne estas enĵetata en la peton.

Tiu dezajno indas esti konata, ĉar ĝi klarigas, kial iuj instaloj raportas verajn adresojn kaj aliaj ne, kun ŝajne identa agordo de la antaŭaĵo. La diferenco estas ĉe la ricevanta flanko, kaj ĝi kutime loĝas en modulo aŭ flikaĵo, kiun plej multaj pakitaj retserviloj ne ŝaltas defaŭlte. Legu la dokumentaron de via retservilo pri la preciza hoko, kiun ĝi proponas, kaj konfirmu, ke la modulo estas ŝargita anstataŭ supozi ĝin.

Se vi sekvas ĉi tiun vojon, traktu ĝin kiel integriĝon el du duonoj: la mapado, kiun skribas la plusendilo, kaj la serĉo, kiun faras la malantaŭaĵo. Kontrolu ambaŭ, kaj konfirmu, ke la dosierujo postvivas restarton kaj ne kreskas senlime sur okupata aŭskultanto.

Decidu, kiu komponanto garantias la adreson

Antaŭ ol ŝanĝi la agordon, nomu la komponanton, kiu rajtas aserti klientan adreson, kaj la komponantojn, kiuj rajtas kredi ĝin. Unu sola skribita respondo malhelpas la kutiman drivon, kie tri malsamaj tavoloj fidas malsaman fonton.

Tri dezajnoj kovras la plej multajn bezonojn. Tenu la publikan aŭskultanton kaj la retan aŭskultanton aparte, por ke la retservilo vidu verajn kunulojn kaj ekzistu neniu atribua problemo. Metu antaŭen HTTP-konscian inversan prokurilon, finu aŭ analizu la peton tie, kaj lasu ĝin starigi plusenditan kaplinion por malantaŭaĵo, kiu fidas nur tiun prokurilon. Aŭ tenu la dividon de la pordo kaj akceptu, ke protokoloj montras la salton, kun alirreguloj skribitaj kontraŭ la aplika identeco anstataŭ adreso.

Tio, kio ne funkcias, estas trakti plusenditan loopback-adreson kiel pruvon, ke la peto originis sur ĉi tiu maŝino. Tiu konkludo estas ĝuste mala: la adreso ĉeestas ĝuste tial, ĉar loka komponanto faris la konekton. Regulo skribita tiel akceptas ĉiun, kiu povas atingi la aŭskultanton.

Testu la regulon, ne la paĝon

Paĝo, kiu ŝargiĝas, pruvas, ke la plusenda vojo funkcias, kaj diras nenion pri atribuado. Testu la konsumanton de la adreso: la alirregulon, la rapidolimon, la revizian rikordon, la geografian serĉon.

curl -sS -o /dev/null -w '%{http_code}\n' https://site.example.com/
tail -n 5 /var/log/nginx/access.log
grep -c '' /var/log/nginx/access.log

Komparu rajtigitan eksteran peton kun la rikordoj de kaj la antaŭaĵo kaj la malantaŭaĵo, kaj konfirmu, ke regulo, kiu devus rifuzi, ankoraŭ rifuzas, kaj tiu, kiu devus permesi, ankoraŭ permesas. Se la protokola linio estas ĝusta sed la regulo ankoraŭ kondutas kvazaŭ ĉiuj estus lokaj, la regulo legas alian kampon ol tiun, kiun vi riparis.

Finu skribante la atribuan ĉenon en la deplojajn notojn: kiu aŭskultanto, kiu plusendilo, kiu kaplinio aŭ mapado, kaj kiu malantaŭaĵo estas agordita fidi ĝin. La sekva persono, kiu legos protokolan linion, bezonos ĉiujn kvar, kaj la manko de tiu noto estas la maniero, kiel la sama bileto remalfermiĝas jaron poste. Tenu ĝin apud la agordo anstataŭ en babilfadeno.

Rilataj artikoloj