Mundarija (26)
- Bu darsda
- 1. Nega bu kerak?
- 2. Reverse proxy nima qiladi
- 2.1 Sxema
- 2.2 Proxy nimalarni oladi
- 3. X-Forwarded-* sarlavhalari
- 3.1 Uchta sarlavha
- 3.2 Standart: Forwarded
- 3.3 Soxta sarlavha muammosi
- 4. Mijoz IP'sini ajratish
- 4.1 Algoritm — toza funksiya
- 4.2 Express'dagi haqiqiy natija
- 5. nginx va Caddy konfiguratsiyasi
- 5.1 nginx
- 5.2 Caddy
- 5.3 WebSocket va boshqa uzun ulanishlar
- 6. Hujumchi nigohi
- 7. API qadami: o'zgarish yo'q (tajriba)
- 8. Ko'p uchraydigan xatolar
- 9. Mashqlar
- 1-mashq (oson): to'ldiring
- 2-mashq (o'rta): ikki proxy
- 3-mashq (qiyin): Forwarded sarlavhasini o'qish
- 10. Real ishda
- Xulosa
- Manbalar
Reverse proxy orqasida Node.js: nginx, Caddy, X-Forwarded-For va trust proxy
Qisqacha: Prodakshnda Node odatda reverse proxy (nginx, Caddy) ortida turadi. Proxy TLS'ni tugatadi va so'rovni Node'ga uzatadi. Shunda Node mijozning haqiqiy IP'sini va protokolini o'zi ko'rmaydi — faqat proxy qo'shgan
X-Forwarded-For,X-Forwarded-ProtovaX-Forwarded-Hostsarlavhalaridan biladi. Bu sarlavhalarni mijoz ham yuborishi mumkin. Shuning uchun ularga faqat ishonchli proxy'dan kelganda ishoniladi: Express'datrust proxy= proxy'lar soni yoki aniq IP. Biz o'lchadik:trust proxy = truebilan soxtaX-Forwarded-For: 6.6.6.6yuborgan mijozning IP'si6.6.6.6deb ko'rindi,trust proxy = 1bilan esa haqiqiy IP qoldi.
Bu darsda
- Reverse proxy nima qilishini va nega Node uning ortida turishini tushuntirasiz.
X-Forwarded-For,-Proto,-Hostva standartForwardedsarlavhasini o'qiysiz.- Mijoz IP'sini proxy zanjiridan to'g'ri ajratadigan funksiya yozasiz.
- Express'ning
trust proxysozlamasining to'rt qiymatini o'lchov bilan solishtirasiz. - nginx va Caddy konfiguratsiyasini, WebSocket va gzip qayerda bo'lishini bilasiz.
Oldin bilishingiz kerak: HTTPS, TLS va HTTP/2, Server timeout'lari va keep-alive, Domen va DNS.
1. Nega bu kerak?
TLS darsida qaror qildik: vazifalar-api HTTPS'ni o'zi qilmaydi, uni oldidagi proxy bajaradi. Timeout'lar darsida esa LB ortidagi 502 ni ko'rdik. Endi shu sxemaning narxini ko'ramiz.
Node'ga kelgan har so'rovning manbai — proxy. req.socket.remoteAddress doim 127.0.0.1. Bu muammo, chunki IP ko'p joyda kerak: loglarda "kim so'radi", so'rovlar sonini cheklash (bir IP'dan daqiqasiga 100 tadan ko'p emas), shubhali kirishlarni bloklash. Hamma mijoz 127.0.0.1 bo'lsa — cheklov butun saytni bitta odam deb hisoblaydi va hammani bloklaydi.
Protokol ham yo'qoladi: foydalanuvchi https:// bilan keldi, Node esa oddiy HTTP so'rov ko'rdi. Secure cookie qo'yish yoki to'g'ri https://... havola yasash uchun buni bilish kerak.
O'xshatish: mehmonxona qabulxonasi. Mehmon xonaga to'g'ridan kirmaydi — qabulxona (proxy) uni qabul qiladi va xizmatchiga qog'oz beradi: "305-xona, ismi Ali, pasport bilan keldi". Xizmatchi (Node) mehmonni o'zi ko'rmaydi, faqat qog'ozga ishonadi. Lekin qog'ozni mehmonning o'zi yozib kelsa-chi? Xizmatchi faqat qabulxonaning qog'oziga ishonishi kerak.
2. Reverse proxy nima qiladi
2.1 Sxema
Reverse proxy (teskari proksi) — mijozlar va serverlar orasidagi dastur. U mijozlar uchun o'zini "server" deb ko'rsatadi, so'rovni esa ichkaridagi haqiqiy serverga uzatadi. Oddiy (forward) proksi aksincha — mijoz tomonida turadi, masalan ofis tarmog'ida.
flowchart LR
M["Mijoz<br/>203.0.113.7"] -- "HTTPS :443" --> P["nginx / Caddy"]
P -- "HTTP<br/>X-Forwarded-For: 203.0.113.7<br/>X-Forwarded-Proto: https" --> N["Node<br/>127.0.0.1:3000"]
H["Hujumchi"] -. "to'g'ridan :3000" .-> NDiagrammadagi uzuq chiziqqa qarang. Node faqat 127.0.0.1 da tinglasa, tashqaridan unga to'g'ridan yetib bo'lmaydi — hujumchi proxy'ni chetlab o'ta olmaydi. Kanonda HOST sukut bo'yicha 127.0.0.1. 0.0.0.0 (hamma interfeys) qo'ysangiz, Node tashqi tarmoqqa ochiladi va proxy'siz ham javob beradi.
2.2 Proxy nimalarni oladi
| Vazifa | Kim qiladi |
|---|---|
| TLS, sertifikat yangilash | proxy |
| Static fayllar, kesh | proxy yoki CDN |
| gzip / brotli siqish | proxy |
| Bir nechta Node jarayoniga taqsimlash | proxy (load balancing) |
| Sekin mijozlar, Slowloris | proxy (so'rovni to'liq olib, keyin uzatadi) |
| Biznes mantiq, JSON API | Node |
Siqish haqida: kanon mashhur middleware'lar darsida compression middleware'ini o'lchadi. Katta ro'yxatda u Node'ning tezligini 45 % ga tushirdi. Shuning uchun vazifalar-api da siqish yo'q — u proxy'ning ishi.
3. X-Forwarded-* sarlavhalari
3.1 Uchta sarlavha
Proxy so'rovni uzatishda uchta sarlavha qo'shadi (de-fakto standart, ko'p proxy'lar shunday qiladi):
| Sarlavha | Misol | Nima |
|---|---|---|
X-Forwarded-For (XFF) |
203.0.113.7, 10.0.0.2 |
IP zanjiri: mijoz, keyin har proxy |
X-Forwarded-Proto |
https |
mijoz qaysi protokolda keldi |
X-Forwarded-Host |
api.example.com |
mijoz qaysi domenga so'radi |
XFF — ro'yxat. Har proxy kelgan qiymatning oxiriga o'zi ko'rgan IP'ni qo'shadi. Ikki proxy bo'lsa (masalan Cloudflare, keyin nginx): mijoz, cloudflare-ip. nginx esa Cloudflare'ni soketdan ko'radi.
3.2 Standart: Forwarded
2014 yilda xuddi shu ma'lumot uchun standart sarlavha chiqdi — RFC 7239:
Forwarded: for=203.0.113.7;proto=https;host=api.example.comU uchta sarlavhani bittaga birlashtiradi. Lekin amalda X-Forwarded-* ancha keng tarqalgan. Express hujjatining "behind proxies" sahifasida ham faqat X-Forwarded-* tilga olinadi — Forwarded haqida gap yo'q. Shu sabab darsda asosan ular.
3.3 Soxta sarlavha muammosi
Sarlavha — oddiy matn. Mijoz X-Forwarded-For: 6.6.6.6 ni o'zi ham yozib yuborishi mumkin. Biz ishga tushirdik: kichik proxy (nginx o'rnida, $proxy_add_x_forwarded_for kabi — kelgan XFF oxiriga mijoz IP'sini qo'shadi) va uning ortida server. Server o'zi ko'rganini qaytaradi:
import { createServer, request } from "node:http";
const serverlar = [];
const tingla = (s) => new Promise((ok) => {
serverlar.push(s);
s.listen(0, "127.0.0.1", () => ok(s.address().port));
});
// Orqa server (bizning Node): nimani ko'rayotganini qaytaradi
const orqa = await tingla(createServer((req, res) => {
res.end(JSON.stringify({
soket: req.socket.remoteAddress,
xff: req.headers["x-forwarded-for"],
proto: req.headers["x-forwarded-proto"],
}));
}));
// Proxy (nginx o'rnida): mijoz IP'sini XFF oxiriga QO'SHADI
const proxy = await tingla(createServer((req, res) => {
const eski = req.headers["x-forwarded-for"];
const ip = req.socket.remoteAddress;
const headers = {
...req.headers,
"x-forwarded-for": eski ? `${eski}, ${ip}` : ip,
"x-forwarded-proto": "https",
};
const opts = { port: orqa, host: "127.0.0.1", path: req.url,
method: req.method, headers };
req.pipe(request(opts, (j) => j.pipe(res)));
}));
const sor = async (port, headers) =>
(await fetch(`http://127.0.0.1:${port}/`, { headers })).text();
console.log("proxy orqali: ", await sor(proxy));
console.log("proxy + soxta XFF: ",
await sor(proxy, { "X-Forwarded-For": "6.6.6.6" }));
for (const s of serverlar) {
s.closeAllConnections(); // keep-alive ulanishlarni kutmaymiz
s.close();
}Konsolda:
proxy orqali: {"soket":"127.0.0.1","xff":"127.0.0.1","proto":"https"}
proxy + soxta XFF: {"soket":"127.0.0.1","xff":"6.6.6.6, 127.0.0.1","proto":"https"}Ikki qatordagi xff qiymatini solishtiring. Ikkinchi qatorda XFF ikki elementli: 6.6.6.6 — mijoz yozgan (yolg'on), 127.0.0.1 — proxy ko'rgan (haqiqat). Bizning sinovda mijoz ham shu kompyuterda, shuning uchun haqiqiy IP ham 127.0.0.1. Qaysi biriga ishonish kerak? Qoida: o'ngdan chapga yuring va ishonchli proxy'larni tashlab keting. Birinchi ishonchsiz manzil — mijoz. Chap tomondagi hamma narsa mijozning qo'lida, ular yolg'on bo'lishi mumkin.
Tekshirib ko'ring: Bitta nginx bor. XFF:
1.1.1.1, 2.2.2.2, 198.51.100.4. Mijozning haqiqiy IP'si qaysi?
Javob
198.51.100.4 — eng o'ngdagi, uni nginx o'zi ko'rgan va qo'shgan. 1.1.1.1, 2.2.2.2 ni mijoz o'zi yozib keldi, ularni tekshirib bo'lmaydi.
4. Mijoz IP'sini ajratish
4.1 Algoritm — toza funksiya
Express ichida proxy-addr paketi aynan shu ishni qiladi. Uning mantig'ini qisqa funksiyada takrorlaymiz. Zanjir: avval soket manzili (bizga eng yaqin), keyin XFF o'ngdan chapga. Ishonchli bo'lsa — keyingisiga o'tamiz:
function mijozIpsi(soket, xff, ishonch) {
const royxat = xff ? xff.split(",").map((s) => s.trim()) : [];
const zanjir = [soket, ...royxat.reverse()];
for (let i = 0; i < zanjir.length - 1; i++) {
const ishonchli = ishonch === true
|| (typeof ishonch === "number" && i < ishonch)
|| (Array.isArray(ishonch) && ishonch.includes(zanjir[i]));
if (!ishonchli) return zanjir[i];
}
return zanjir.at(-1);
}
const soket = "127.0.0.1";
const soxta = "6.6.6.6, 127.0.0.1"; // mijoz yozdi + proxy qo'shdi
console.log("false:", mijozIpsi(soket, soxta, false));
console.log("true: ", mijozIpsi(soket, soxta, true));
console.log("1: ", mijozIpsi(soket, soxta, 1));
console.log("IP: ", mijozIpsi(soket, soxta, ["127.0.0.1"]));Konsolda:
false: 127.0.0.1
true: 6.6.6.6
1: 127.0.0.1
IP: 6.6.6.6To'rt rejim:
false— hech kimga ishonma: soket manzili. Proxy ortida — doim proxy IP'si.true— hammaga ishon: zanjirning eng chap elementi. Hujumchi buni o'zi yozadi — soxtalashtirildi.1— bitta proxy'ga ishon: soketdan keyingi bitta hop (zanjirdagi bitta bo'g'in — mijozdan serverga yo'ldagi bitta oraliq dastur). To'g'ri javob.- IP ro'yxati —
127.0.0.1ga ishon. Bizning sinovda mijoz ham127.0.0.1dan kelgani uchun u ham "ishonchli proxy" bo'lib qoldi va6.6.6.6ga yetdi. Haqiqiy serverda mijoz loopback emas — bu holat sinalmagan.
4.2 Express'dagi haqiqiy natija
Express'ni keyingi darsda boshlaymiz. Hozir bitta narsa yetadi: Express — node:http ustidagi kutubxona. Unda req.ip (mijoz IP'si), req.protocol va req.hostname bor. app.set("trust proxy", qiymat) esa yuqoridagi ishonch parametri (hujjatga ko'ra o'z tekshiruv funksiyangizni ham berish mumkin). Kanon tajribasi — xuddi shu kichik proxy va ortida Express 5.3.0 (asl chiqishdan ip, protocol, hostname maydonlari):
trust proxy |
proxy orqali | proxy + soxta XFF | to'g'ridan + soxta XFF |
|---|---|---|---|
sukut (false) |
127.0.0.1, http, 127.0.0.1 | 127.0.0.1 | 127.0.0.1 |
true |
127.0.0.1, https, api.example.uz |
6.6.6.6 | 6.6.6.6 |
1 |
127.0.0.1, https, api.example.uz |
127.0.0.1 | 6.6.6.6 |
"loopback" |
127.0.0.1, https, api.example.uz |
6.6.6.6 | 6.6.6.6 |
Bizning funksiya Express bilan bir xil natija berdi. Yana uchta kuzatuv:
- Sukut
false— xavfsiz, lekin proxy ortidareq.protocol=http(aslida https edi).X-Forwarded-Protoham,-Hostham e'tiborsiz. 1bilan oxirgi ustun — proxy'ni chetlab, to'g'ridan Node'ga kelgan mijoz baribir6.6.6.6ni o'tkazdi.trust proxyfaqat proxy haqiqatan bo'lsa to'g'ri ishlaydi. Shuning uchun Node porti tashqariga yopiq bo'lishi kerak (127.0.0.1).- Proxy XFF'ni almashtirsa (
$remote_addrbilan, qo'shmasdan) — kanondatrust proxy = 1bilan soxta qiymat butunlay yo'qoldi:xff: "127.0.0.1". Proxy sizning chegarangizda birinchi bo'lsa, bu eng ishonchli variant.
api.example.uz — kanon tajribasidagi soxta X-Forwarded-Host qiymati, haqiqiy domen emas. O'z misollaringizda zaxiralangan example.com domenini ishlating.
Diqqat:
app.set("trust proxy", true)— internetdagi eng ko'p uchraydigan "tuzatish". Ureq.ipni to'g'rilaydi va hamma xursand bo'ladi. Lekin endi har kim o'z IP'sini tanlay oladi: so'rov chegarasini chetlab o'tadi, loglarga boshqa odamning IP'sini yozdiradi. Aniq son (1) yoki proxy IP'si yozing.
5. nginx va Caddy konfiguratsiyasi
Kanon mashinasida nginx va Caddy o'rnatilmagan — quyidagi konfiguratsiyalar rasmiy hujjat bo'yicha, biz sinamadik. Haqiqiy VPS'da ularni deploy qismida ishga tushiramiz.
5.1 nginx
server {
listen 443 ssl;
server_name api.example.com;
# ssl_certificate ... (Let's Encrypt, certbot)
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
}
}$proxy_add_x_forwarded_for — kelgan XFF + mijoz IP'si (bizning kichik proxy shunday edi). $remote_addr — faqat mijoz IP'si (kelganini tashlab yuboradi). nginx sizning birinchi chegarangiz bo'lsa (oldida Cloudflare yo'q), X-Forwarded-For $remote_addr xavfsizroq. Node'da — trust proxy = 1.
5.2 Caddy
api.example.com {
reverse_proxy 127.0.0.1:3000
}Uch qator. Caddy sertifikatni Let's Encrypt'dan o'zi oladi va X-Forwarded-* ni o'zi qo'yadi. Hujjatga ko'ra, mijoz yuborgan X-Forwarded-* qiymatlarini sukut bo'yicha ishonchsiz deb almashtiradi (trusted_proxies sozlanmagan bo'lsa). Kichik loyihalar uchun qulay tanlov.
5.3 WebSocket va boshqa uzun ulanishlar
WebSocket (realtime darsida o'rganamiz) oddiy HTTP so'rov sifatida boshlanadi va Upgrade: websocket bilan boshqa protokolga o'tadi. nginx bu sarlavhalarni sukut bo'yicha uzatmaydi. Hujjatdagi qo'shimcha:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;Oxirgi qator — nginx'ning javob kutish vaqti (sukut 60 s). Usiz jim turgan WebSocket bir daqiqada uziladi. Caddy WebSocket'ni qo'shimcha sozlamasiz uzatadi. vazifalar-api da WebSocket yo'q — sinalmagan.
Tekshirib ko'ring: nginx'da
X-Forwarded-Proto $schemeyozilmagan, Node'datrust proxy = 1. Foydalanuvchihttps://bilan kirdi.req.protocolnima bo'ladi?
Javob
http. Express X-Forwarded-Proto ni faqat bor bo'lsa o'qiydi. Sarlavha yo'q — soket protokoli olinadi, nginx bilan Node orasida esa HTTP. Natijada Node http://... havolalar yasaydi yoki Secure cookie'ni "xavfsiz emas" deb qo'ymaydi.
6. Hujumchi nigohi
| Hujum | Qachon ishlaydi | Himoya |
|---|---|---|
Soxta X-Forwarded-For |
trust proxy = true |
proxy'lar soni (1) yoki IP |
| Proxy'ni chetlab o'tish | Node 0.0.0.0 da, port ochiq |
HOST=127.0.0.1, firewall |
| Rate limit'ni aylanib o'tish | IP soxtalashtirilsa | to'g'ri trust proxy; proxy'da cheklov |
Soxta X-Forwarded-Host |
havola yasashda ishlatilsa | domenlar oq ro'yxati (TLS darsi) |
| Logda boshqa odamning IP'si | soxta XFF | faqat req.ip (to'g'ri sozlangan) logga |
X-Forwarded-Host alohida xavfli: parolni tiklash xatidagi havola req.hostname dan yasalsa va u soxta bo'lsa, xat hujumchining saytiga havola bilan ketadi. Domen nomini konfiguratsiyadan oling, sarlavhadan emas.
7. API qadami: o'zgarish yo'q (tajriba)
Bugun vazifalar-api kodi o'zgarmaydi — u hali Express'da emas. Kanon tajribasi va qarorlari:
- Proxy +
trust proxytajribasi (yuqoridagi jadval) — Express 5.3.0, Node ichidagi 20 qatorli proxy bilan. nginx yo'q. HOSTsukut bo'yicha127.0.0.1— holat 05 dan beri shunday (createServer darsi).trust proxyloyihaga keyinroq kiradi: Env validatsiyasi darsidaTRUST_PROXYmuhit o'zgaruvchisi qo'shiladi (sukutfalse; qiymatlar:true, son,loopback). Lokal ishlashda proxy yo'q —falseto'g'ri.- Rate limit (express-rate-limit) kanonga kirmadi — sabablaridan biri aynan shu: to'g'ri
trust proxysiz IP noto'g'ri (mashhur middleware'lar darsi).
8. Ko'p uchraydigan xatolar
| Belgi | Sabab | Davosi |
|---|---|---|
Hamma so'rov 127.0.0.1 dan |
trust proxy o'rnatilmagan |
app.set("trust proxy", 1) |
| Rate limit hammani bloklaydi | bir IP — proxy | xuddi shu |
req.ip mijoz tanlagan qiymat |
trust proxy = true |
aniq son yoki IP |
https sayt http:// havola yasaydi |
X-Forwarded-Proto yo'q yoki ishonilmagan |
nginx'da $scheme, trust proxy |
| WebSocket ulanmaydi yoki 60 s da uziladi | Upgrade uzatilmagan, proxy_read_timeout |
nginx WebSocket sozlamasi |
| Proxy'siz ham sayt ochiladi | Node 0.0.0.0 da |
HOST=127.0.0.1 |
9. Mashqlar
Yechimlar kurs/mashqlar/25/08-proxy/ da.
1-mashq (oson): to'ldiring
- Mijoz protokolini aytadigan sarlavha —
X-Forwarded- X-Forwarded-*o'rnidagi standart sarlavha (RFC 7239) —- Bitta proxy ortida Express sozlamasi —
app.set("trust proxy", ) - XFF zanjirida haqiqatni proxy qo'shgan tomon — tomon
- Node tashqaridan ko'rinmasligi uchun tinglash manzili —
Yechim
- Proto —
httpsyokihttp. - Forwarded —
for=…;proto=…;host=…. - 1 — bitta ishonchli hop.
- o'ng — har proxy oxiriga qo'shadi; chap tomonni mijoz yozadi.
- 127.0.0.1 — faqat shu kompyuterdagi proxy ulanadi.
2-mashq (o'rta): ikki proxy
Sxema: mijoz → Cloudflare → nginx → Node. nginx $proxy_add_x_forwarded_for ishlatadi. Node'ga XFF: 6.6.6.6, 203.0.113.7, 172.70.1.1 keldi, soket — 127.0.0.1. mijozIpsi («Algoritm — toza funksiya» bo'limidan) bilan trust proxy = 1, 2 va true uchun natijani chiqaring. Qaysi biri to'g'ri va nega?
Yechim
function mijozIpsi(soket, xff, ishonch) {
const royxat = xff ? xff.split(",").map((s) => s.trim()) : [];
const zanjir = [soket, ...royxat.reverse()];
for (let i = 0; i < zanjir.length - 1; i++) {
const ishonchli = ishonch === true
|| (typeof ishonch === "number" && i < ishonch)
|| (Array.isArray(ishonch) && ishonch.includes(zanjir[i]));
if (!ishonchli) return zanjir[i];
}
return zanjir.at(-1);
}
const xff = "6.6.6.6, 203.0.113.7, 172.70.1.1";
for (const t of [1, 2, true]) {
console.log(String(t).padEnd(5), mijozIpsi("127.0.0.1", xff, t));
}Konsolda:
1 172.70.1.1
2 203.0.113.7
true 6.6.6.6To'g'risi — 2. Ikkita proxy bor: nginx (soket) va Cloudflare (172.70.1.1). 1 bilan Cloudflare'ning IP'si "mijoz" bo'lib qoladi — butun sayt bitta IP'dan kelgandek. true bilan mijoz yozgan 6.6.6.6 olinadi. 203.0.113.7 — Cloudflare ko'rgan haqiqiy mijoz.
3-mashq (qiyin): Forwarded sarlavhasini o'qish
forwardedOqi(sarlavha) funksiyasini yozing. U RFC 7239 sarlavhasini obyektlar massiviga aylantirsin: for=192.0.2.43;proto=https, for="[2001:db8::1]:4711" → [{ for: "192.0.2.43", proto: "https" }, { for: "[2001:db8::1]:4711" }]. Elementlar vergul bilan, juftlar nuqtali vergul bilan ajraladi; kalit — kichik harf; qiymat qo'shtirnoqda bo'lsa, qo'shtirnoq olib tashlanadi. Soddalik uchun qiymat ichida vergul yo'q deb hisoblang. Saytda ham ishlaydi.
Yechim
function forwardedOqi(sarlavha) {
return sarlavha.split(",").map((element) => {
const obj = {};
for (const juft of element.split(";")) {
const [k, ...qolgan] = juft.trim().split("=");
if (!k || qolgan.length === 0) continue;
const v = qolgan.join("=").replace(/^"(.*)"$/, "$1");
obj[k.toLowerCase()] = v;
}
return obj;
});
}
const s = 'for=192.0.2.43;Proto=https, for="[2001:db8::1]:4711"';
console.log(JSON.stringify(forwardedOqi(s)));Konsolda:
[{"for":"192.0.2.43","proto":"https"},{"for":"[2001:db8::1]:4711"}]IPv6 manzil va port bo'lsa, qiymat qo'shtirnoqda keladi (: belgisi tufayli). ...qolgan va join("=") — qiymat ichida = bo'lsa ham buzilmasin. Bu yerda ham ishonch qoidasi o'sha: elementlar o'ngdan chapga, faqat ishonchli proxy qo'shganlari haqiqat.
10. Real ishda
- Har prodakshn Node — nginx, Caddy, Traefik yoki bulut LB (AWS ALB, Cloudflare) ortida.
trust proxy— deploy ro'yxatidagi majburiy band. - Cloudflare — haqiqiy IP'ni
CF-Connecting-IPsarlavhasida ham beradi. Unga ham faqat so'rov Cloudflare IP'laridan kelganda ishoniladi. - Kubernetes Ingress (nginx-ingress) —
X-Forwarded-*ni o'zi qo'yadi; zanjirda bir nechta proxy bo'lishi mumkin — sonni to'g'ri hisoblang. - Intervyu: "
req.ipnega127.0.0.1?", "trust proxy: truenega xavfli?", "TLS termination va X-Forwarded-Proto bog'liqligi?".
Xulosa
- Proxy ortida Node mijozni faqat sarlavhalardan biladi:
X-Forwarded-For(zanjir),-Proto,-Host; standart —Forwarded. - XFF'ni o'ngdan chapga o'qing; ishonchli proxy'larni tashlang; birinchi ishonchsiz manzil — mijoz.
trust proxy = truesoxta IP'ni qabul qiladi; to'g'risi — proxy'lar soni yoki IP'lari.- Node
127.0.0.1da tinglasin, aks holda proxy'ni chetlab o'tishadi. - TLS, siqish, WebSocket uzatish va sekin mijozlar — proxy'ning ishi; nginx WebSocket uchun
Upgradesarlavhalari kerak.
Keyingi dars: Express'ga kirish va Express 5 — node:http ustidagi yupqa qatlam: routing va middleware, vazifalar-api ni Express'ga ko'chirish.
Manbalar
- Express hujjati — "Express behind proxies" (
trust proxyqiymatlari): https://expressjs.com/en/guide/behind-proxies.html (2026-10-24 da ochildi) - RFC 7239 "Forwarded HTTP Extension" (2014-06): https://www.rfc-editor.org/rfc/rfc7239
- nginx —
ngx_http_proxy_module($proxy_add_x_forwarded_for), "WebSocket proxying": https://nginx.org/en/docs/http/websocket.html (biz sinamadik) - Caddy —
reverse_proxy(sukut sarlavhalar,trusted_proxies): https://caddyserver.com/docs/caddyfile/directives/reverse_proxy (biz sinamadik) - Kanon: proxy va
trust proxytajribasi (Express 5.3.0, Node 24.21.0, Windows 11; nginx yo'q). Proxy va XFF bloki — biz ishga tushirdik.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!