---
title: "Node Unblocker Nedir ve Nasıl Kurulur?"
description: "Node Unblocker, bir Node.js sunucusunu sayfaları yeniden yazan bir web proxy'ye çeviren Express middleware'idir. İşleyişi, test edilmiş kurulum ve güvenlik."
url: https://proxynet.io/tr/blog/node-unblocker
date: 2026-10-11
author: "Acar Diveroli"
category: "Nasıl Yapılır, Proxy 101"
lang: tr
---

# Node Unblocker Nedir ve Nasıl Kurulur?

Küçük bir Express uygulaması başlatıyor, tarayıcıda `http://127.0.0.1:8080/proxy/https://example.com/` adresini açıyorsunuz ve sayfa kendi sunucunuzun adresi altında karşınıza geliyor. Sayfadaki linkler, görseller ve formlar artık `/proxy/` ile başlıyor; her tıklama yeniden sizin sunucunuzdan geçiyor. Bu, npm'deki `unblocker` paketi, yani Node Unblocker: bir Node.js sunucusunu, herkesin sıradan bir tarayıcıyla kullanabileceği bir web proxy'ye çeviren birkaç satır kod. Açık bırakıldığında aynı satırlar yabancıların da sunucunuzu kullanmasının yolunu açar; ilk test sunucumuz, yerel bir servisin yalnızca `127.0.0.1` adresine gösterdiği bir yönetim sayfasını getirdi.

Bu yazıda paketin nasıl çalıştığını, en sade sunucuyu, yabancıları ve iç ağ adreslerini dışarıda tutan korumalı bir sunucuyu, giden trafik için upstream proxy kullanımını ve paketin sınırlarını anlatıyoruz. Bütün örnekleri 11 Ekim 2026'da unblocker 2.3.1, Express 4.22.3 ve Node.js 24.11.1 ile; yerel bir test sitesi, bir WebSocket yankı (echo) sunucusu ve kullanıcı adıyla parola isteyen bir test proxy'si üzerinde çalıştırdık.

> **Not: Kısa cevap**
>
> Node Unblocker (npm'de `unblocker`), bir Node.js sunucusunu web proxy'ye çeviren, Express ile uyumlu bir middleware'dir. Ziyaretçi `/proxy/https://site.example/` adresini açar; sunucu sayfayı getirir, linklerini, çerezlerini ve yönlendirmelerini `/proxy/` adresine dönecek şekilde yeniden yazar ve tarayıcıya akıtır. Site ziyaretçinin değil, sunucunuzun IP adresini görür. Giriş kontrolü, site izin listesi ve özel adres engeli olmadan internete açmayın; yoksa herkes kendi trafiğini sunucunuz üzerinden geçirebilir.

## Node Unblocker nedir?

Node Unblocker, Nathan Friedly'nin yazdığı ve npm'de `unblocker` adıyla yayımlanan açık kaynaklı bir Node.js kütüphanesidir. 11 Ekim 2026 itibarıyla en güncel sürüm, Haziran 2024 tarihli 2.3.1'dir; Node.js 16.17 veya üstünü ister ve AGPL-3.0 lisansıyla dağıtılır. [GitHub'daki README](https://github.com/nfriedly/node-unblocker) onu, uzak web sayfalarını proxy'den geçirip yeniden yazan genel amaçlı bir kütüphane olarak tanımlar.

Kısacası bir web proxy'dir: başka web sitelerini sizin yerinize yükleyen bir web sitesi. Ziyaretçi hiçbir ayarı değiştirmez, yalnızca sunucunuzun adresini bilmesi yeter. HTTP veya SOCKS5 proxy ise uygulamada ya da işletim sisteminde tanımlanır ve trafiği değiştirmeden taşır. Node Unblocker yalnızca web sayfalarını ve WebSocket bağlantılarını taşır ve tek bir çıkışı vardır: çalıştığı makinenin IP adresi. Dizüstü bilgisayarınızda çalıştırırsanız site sizin ev IP'nizi görür.

## Node Unblocker nasıl çalışır?

Yolu önekle (varsayılan olarak `/proxy/`) başlayan her istek şu adımlardan geçer:

1. **Tarayıcı sunucudan bir proxy adresi ister**, örneğin `GET /proxy/https://example.com/`. Önekten sonraki her şey hedef adrestir. Şeması olmayan bir adres, örneğin `/proxy/example.com`, `/proxy/http://example.com/` adresine `307` ile yönlendirilir.
2. **İstek middleware'leri çalışır.** Yerleşik fonksiyonlar `Host` ve `Referer` başlıklarını, sıkıştırmayı ve çerezleri düzeltir. Ardından `requestMiddleware` dizisine sizin eklediğiniz fonksiyonlar çalışır; erişim kontrolleri buraya yazılır.
3. **Sunucunuz hedefe kendisi bağlanır** ve tarayıcının başlıklarını gönderir; `httpAgent` veya `httpsAgent` tanımladıysanız bağlantı o ajan üzerinden kurulur. Hedef, sunucunuzun IP adresini görür.
4. **Cevap middleware'leri yanıtı düzenler.** `Content-Security-Policy`, `Strict-Transport-Security` ve `Public-Key-Pins` başlıklarını kaldırır, yönlendirmeleri ve HTML ile CSS içindeki adresleri yeniden yazar, çerezleri `/proxy/<site>/` yoluna taşır, sayfaya bir betik ekler ve `NOINDEX, NOFOLLOW` robots etiketi koyar.
5. **Sayfa tarayıcıya parça parça akar.**
6. **Gözden kaçan linkler kurtarılır.** `/about` gibi köke göre yazılmış bir istek öneksiz gelir; Node Unblocker `Referer` başlığını okur ve tam proxy adresine `307` ile yönlendirir.

Sayfaya eklenen betik `fetch`, `XMLHttpRequest`, WebSocket, yeni oluşturulan öğeler ve geçmiş (history) değişikliklerini sarar; böylece JavaScript'in sonradan ürettiği adresler de öneki alır. JavaScript dosyalarının kendisi yeniden yazılmaz. Mutlak, köke göre ve göreli birer link, protokolü belirtilmemiş bir görsel ve bir form içeren test sayfamız proxy'den şöyle döndü:

```text
set-cookie: session=abc123; Path=/proxy/http://127.0.0.1:9000/; HttpOnly

<script src="/proxy/client/unblocker-client.js"></script>
<script>unblockerInit({"prefix":"/proxy/","url":"http://127.0.0.1:9000/"}, window);</script>
<title>Test page</title><meta name="ROBOTS" content="NOINDEX, NOFOLLOW"/>
<a href="/proxy/https://www.iana.org/help/example-domains">absolute</a>
<a href="/proxy/http://127.0.0.1:9000/about">root-relative</a>
<a href="contact">relative</a>
<img src="/proxy/http://cdn.example.net/logo.png">
<form action="/proxy/http://127.0.0.1:9000/login" method="post"></form>
```

Göreli link zaten proxy yolunun altında çözüldüğü için olduğu gibi kalır. Sayfanın `Content-Security-Policy` ve `Strict-Transport-Security` başlıkları tarayıcıya hiç ulaşmadı.

## Forward ve reverse proxy'den farkı nedir?

Üçü de tarayıcı ile site arasında durur. Farkları, onları kimin kurduğu ve sayfayı değiştirip değiştirmedikleridir.

| | Node Unblocker | Forward proxy | Reverse proxy |
|---|---|---|---|
| Nasıl kullanılır? | `/proxy/` adresi açılır | Uygulamada veya işletim sisteminde host:port girilir | Sitenin kendi adresine gidilir |
| Kim kurar? | Sunucuyu çalıştıran | Kullanıcı ya da şirketi | Site sahibi |
| Sayfayı değiştirir mi? | Evet: link, çerez, yönlendirme | Hayır | Genellikle hayır |
| HTTPS | Sizin sunucunuzda çözülür | Tünelden geçer, şifreli kalır | Site sahibinde çözülür |
| Trafik | Web sayfaları ve WebSocket | Her türlü HTTP; SOCKS5 UDP de taşır | Sitenin sunucularına HTTP(S) |

Forward proxy, proxy ayarı olan her uygulamaya hizmet eder ve sayfayı anlaması gerekmez. Nginx gibi bir reverse proxy ise sizin kendi sitenizin önünde durur; ikisini [Forward Proxy ve Reverse Proxy Arasındaki Fark](/tr/blog/forward-vs-reverse-proxy) yazımızda ayrıntılı anlattık. Node Unblocker bu ikisinden ayrılır: ayarı değiştirilemeyen ya da değiştirilmemesi gereken tarayıcılar için sayfayı yeniden yazan bir proxy'dir.

## En sade Node Unblocker sunucusu nasıl kurulur?

Boş bir klasörde Express'i ve paketi kurun, ardından kodu `server.mjs` adıyla kaydedin:

```bash
npm install express unblocker
```

```js
import express from "express";
import Unblocker from "unblocker";

const app = express();
const unblocker = new Unblocker({ prefix: "/proxy/" });

// Unblocker ilk app.use() çağrılarından biri olmalı ve bir alt yolda değil, kökte durmalı
app.use(unblocker);

app.get("/", (req, res) => res.send("Open /proxy/https://example.com/"));

// upgrade dinleyicisi, Unblocker'ın WebSocket bağlantılarını aktarmasını sağlar
app.listen(8080, "127.0.0.1").on("upgrade", unblocker.onUpgrade);
```

`node server.mjs` ile başlatın ve `http://127.0.0.1:8080/proxy/https://example.com/` adresini açın. README, middleware'in bir alt yola bağlanmaması gerektiğini söyler ve önek olarak `/` kullanmanın bazı uç durumlarda sorun çıkardığını belirtir. `upgrade` dinleyicisi olmadan, proxy'den açılan sayfalardaki sohbet kutuları ve canlı paneller bağlantı kuramaz.

Sunucu `127.0.0.1` adresini dinler, yani ona yalnızca sizin bilgisayarınız ulaşabilir; bu sürümü öyle bırakın. Testimizde sayfaları yükledi, bir `302` yönlendirmesini yeniden yazdı, bir form `POST` isteğini aktardı ve WebSocket mesajlarını yankıladı. Ayrıca test servisimizin yalnızca aynı makineye gösterdiği `/proxy/http://127.0.0.1:9000/admin` sayfasını da getirdi:

```text
INTERNAL ADMIN PAGE - only for 127.0.0.1
```

**Express 5.** Paket Express 4'e bağımlı olduğu için testi Express 5.3.0 ile tekrarladık. Sayfalar, yönlendirmeler, formlar ve WebSocket aynı şekilde çalıştı; npm paketin içine ona özel bir Express 4 kopyası kurdu.

## Açık bir Node Unblocker sunucusu neden tehlikelidir?

Açık bir sunucu, herkesin sizin IP adresinizden trafik göndermesine ve yalnızca sunucunuzun erişebildiği yerlere ulaşmasına izin verir:

- **Suç sizin IP'nize kalır.** Sunucu üzerinden gönderilen form spam'i ve kaba kuvvet (brute force) giriş denemeleri sizin adresinizden gelir. Siteler bu adresi engeller ya da barındırma firmanıza şikâyet eder; firma da sunucuyu askıya alabilir.
- **İç ağınız erişilebilir olur.** Buna SSRF (Server-Side Request Forgery, sunucu taraflı istek sahteciliği) denir: dışarıdaki biri, kendisinin ulaşamadığı bir adrese sunucunuzun istek atmasını sağlar. Bulut sunucularda klasik hedef, metadata servisinin kimlik bilgisi dağıttığı `169.254.169.254` adresidir. [OWASP SSRF Önleme Rehberi](https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html), hedefler için bir izin listesi tutmayı ve her adın çözüldüğü IP'yi kontrol etmeyi önerir.
- **Sunucu her şeyi okur.** Sayfaları yeniden yazabilmek için okuması gerektiğinden HTTPS sizin sunucunuzda sona erer; proxy'den açılan sitelere yazılan parolalar sunucudan açık metin olarak geçer.
- **Bütün siteler aynı origin'i paylaşır.** Origin, protokol, alan adı ve porttan oluşan köken bilgisidir; proxy'den açılan siteler birbirinden yalnızca çerez yollarıyla ayrılır. [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie), çerezlerdeki `Path` özniteliğinin bir güvenlik önlemi olmadığını belirtir. Proxy'den açılan bir sayfadaki betik, başka bir sitenin `HttpOnly` olmayan çerezlerini okuyabilir.

Web proxy kimseye yeni bir hak da vermez. Onu okul ya da iş yeri filtresini veya bir sitenin kullanım şartlarını aşmak için kullanmak yine o kuralları çiğnemek demektir; sitenin `robots.txt` kuralları ve hız sınırları, sunucunuzdan gelen trafik için de diğer ziyaretçilerde olduğu gibi geçerlidir.

## Node Unblocker sunucusu nasıl korunur?

Sunucuyu, belirli kişilerin kısa bir site listesi için kullandığı bir iç araç olarak düşünün. Korumalı sürüm şunları ekler:

1. **Giriş kontrolü:** ekip için sabit sürede karşılaştırılan tek bir HTTP Basic girişi.
2. **Site izin listesi (allowlist):** `requestMiddleware` içinde kontrol edilir ve yalnızca 80 ile 443 portlarına izin verir.
3. **Her DNS cevabının kontrolü:** ajanların `lookup` fonksiyonunda yapılır, çünkü herhangi bir alan adı `127.0.0.1` adresini gösterebilir. Node'un [`net.BlockList`](https://nodejs.org/api/net.html#class-netblocklist) sınıfı özel adres aralıklarını tutar ve IPv6 biçiminde yazılmış IPv4 adreslerini de yakalar.
4. **Başlık temizliği:** ekibin `Authorization` başlığı ve `X-Forwarded-For` içindeki istemci IP'si siteye hiç ulaşmaz.
5. **WebSocket koruması:** upgrade istekleri Express middleware'lerini atladığı için gereklidir.
6. **Hız sınırı, kayıt satırı ve sade bir hata sayfası.**

```bash
npm install express unblocker express-rate-limit
```

Ardından `server.mjs` dosyasını bu sürümle değiştirin:

```js
import crypto from "node:crypto";
import dns from "node:dns";
import http from "node:http";
import https from "node:https";
import net from "node:net";
import express from "express";
import { rateLimit } from "express-rate-limit";
import Unblocker from "unblocker";

const { UI_USER, UI_PASS, PORT = "8080" } = process.env;
if (!UI_USER || !UI_PASS) throw new Error("Set UI_USER and UI_PASS");
const ALLOWED = ["example.com", "iana.org"]; // ekibin açabileceği siteler (alt alan adları dahil)

// 1. Proxy'nin asla bağlanmaması gereken aralıklar (loopback, özel ağ, link-local, bulut metadata)
const blocked = new net.BlockList();
for (const [range, bits] of [["0.0.0.0", 8], ["10.0.0.0", 8], ["100.64.0.0", 10], ["127.0.0.0", 8],
  ["169.254.0.0", 16], ["172.16.0.0", 12], ["192.168.0.0", 16]]) blocked.addSubnet(range, bits);
blocked.addAddress("::1", "ipv6");
blocked.addSubnet("fc00::", 7, "ipv6");
blocked.addSubnet("fe80::", 10, "ipv6");
const isBlockedIp = (ip) => blocked.check(ip, net.isIPv6(ip) ? "ipv6" : "ipv4");

// 2. Soket açılmadan önce her DNS cevabını kontrol et; izinli bir ad iç ağınızı gösteremesin
function safeLookup(hostname, options, callback) {
  dns.lookup(hostname, options, (err, address, family) => {
    if (err) return callback(err);
    const answers = Array.isArray(address) ? address : [{ address, family }];
    if (answers.some((a) => isBlockedIp(a.address))) {
      return callback(new Error(`${hostname} resolves to a blocked address`));
    }
    callback(null, address, family);
  });
}

// 3. Yalnızca izin listesindeki sunucular, yalnızca varsayılan 80/443 portları
function isAllowed(target) {
  const { hostname, port } = new URL(target);
  return port === "" && ALLOWED.some((h) => hostname === h || hostname.endsWith(`.${h}`));
}

// Sitenin görmemesi gereken başlıklar: ekibin girişi ve reverse proxy'nin eklediği istemci IP'si
const STRIP = ["authorization", "forwarded", "x-forwarded-for", "x-forwarded-host", "x-forwarded-proto", "x-real-ip"];

function checkTarget(data) {
  const ok = isAllowed(data.url);
  console.log(new Date().toISOString(), ok ? "ALLOW" : "DENY", data.url);
  if (ok) {
    for (const h of STRIP) delete data.headers[h];
    return;
  }
  if (data.clientResponse) return data.clientResponse.status(403).send("This site is not on the allowlist.");
  throw new Error("Blocked WebSocket target"); // upgrade isteklerinde cevap nesnesi yoktur
}

// 4. Ekip için tek ortak giriş (HTTP Basic), sabit sürede karşılaştırılır
const hash = (s) => crypto.createHash("sha256").update(s).digest();
function loginOk(req) {
  const [scheme, value = ""] = (req.headers.authorization ?? "").split(" ");
  const given = Buffer.from(value, "base64").toString();
  return scheme === "Basic" && crypto.timingSafeEqual(hash(given), hash(`${UI_USER}:${UI_PASS}`));
}

const unblocker = new Unblocker({
  prefix: "/proxy/",
  requestMiddleware: [checkTarget],
  httpAgent: new http.Agent({ lookup: safeLookup }),
  httpsAgent: new https.Agent({ lookup: safeLookup }),
});

const app = express();
app.set("trust proxy", "loopback"); // bu makinedeki reverse proxy gerçek istemci IP'sini iletir
app.use(rateLimit({ windowMs: 60_000, limit: 600 })); // tek bir sayfa onlarca dosya çekebilir
app.use((req, res, next) => {
  if (loginOk(req)) return next();
  res.set("WWW-Authenticate", 'Basic realm="preview"').status(401).send("Login required");
});
app.use(unblocker);
app.get("/", (req, res) => res.send("Open /proxy/https://example.com/"));
app.use((err, req, res, next) => {
  console.error(err.message);
  res.status(502).send("The site could not be loaded.");
});

// Yalnızca loopback'i dinle: HTTPS ve dışa açık port öndeki reverse proxy'nin işi
const server = app.listen(Number(PORT), "127.0.0.1");
// Express middleware'leri WebSocket upgrade isteklerinde çalışmaz; girişi burada da kontrol et
server.on("upgrade", (req, socket, head) => {
  if (!loginOk(req)) return socket.destroy();
  try {
    unblocker.onUpgrade(req, socket, head);
  } catch {
    socket.destroy();
  }
});
```

Giriş bilgilerini ortam değişkeniyle vererek başlatın: `UI_USER=team UI_PASS='uzun-rastgele-bir-parola' node server.mjs`. Sonuçlarımız şöyleydi:

- Giriş yapılmadan her yol `WWW-Authenticate: Basic` başlığıyla `401` döndü.
- `example.com` ve `www.iana.org` açıldı. `example.org`, `evilexample.com`, `example.com:8443`, `127.0.0.1:9000` ve `169.254.169.254` ise `403` aldı.
- Herkese açık DNS'te `127.0.0.1` adresine çözülen `localtest.me` alan adını bir test kopyasının izin listesine eklediğimizde istek `502` ile döndü, kayıtta `localtest.me resolves to a blocked address` yazdı.
- Girişsiz WebSocket bağlantısı hemen kapatıldı. Giriş yapılmış bağlantılardan yerel yankı sunucumuza giden `DENY` olarak kaydedilip kapatıldı; izin listesindeki `echo.websocket.org` adresine giden ise çalıştı.
- Bir dakika içinde 600 istek dolduktan sonra gelen istekler `Retry-After: 59` başlığıyla `429 Too Many Requests` cevabı aldı.

Bu korumalardan ikisi, akla ilk gelen çözüm işe yaramadığı için eklendi. README'deki izin listesi örneği isteği `data.clientResponse.status(403)` ile reddeder; ama WebSocket upgrade isteğinde cevap nesnesi yoktur ve sunucumuz `TypeError: Cannot read properties of null (reading 'status')` hatasıyla çöktü. Boş değer kontrolü eklediğimizde sunucu ayakta kaldı, fakat WebSocket bağlantısı giriş yapılmadan engelli hedefe yine ulaştı. Middleware'de hata fırlatıp upgrade dinleyicisinde yakalamak bağlantıyı kurulmadan durdurur. `STRIP` listesini eklemeden önce ise test proxy'miz, ekibin `Authorization: Basic` başlığını ve test için gönderdiğimiz `X-Forwarded-For` değerini siteye giderken gördü.

HTTPS için sunucunun önüne, aynı makinede çalışan nginx ya da Caddy koyun; `trust proxy` ayarının `loopback` olması, Express'in ve hız sınırlayıcının gerçek istemci IP'sini görmesini sağlar. Nginx kullanıyorsanız README, `/proxy/https://` içindeki `//` korunsun diye `merge_slashes off;` ayarını önerir. `ALLOW` ve `DENY` kayıt satırlarını saklayın; bir site sunucunuzun ne yaptığını sorduğunda cevap onlardadır.

## Node Unblocker trafiği upstream proxy'den nasıl geçirilir?

Upstream proxy, sunucunuzun dışarı çıkarken kullandığı proxy'dir. `httpAgent` ve `httpsAgent` seçenekleri her türlü Node.js ajanını kabul eder; proxy'ye bağlanan bir ajan verdiğinizde çıkış noktası proxy'ye taşınır. `http-proxy-agent` ve `https-proxy-agent` paketlerini kurun, ardından korumalı sunucudaki iki ajan satırını değiştirin:

```bash
npm install http-proxy-agent https-proxy-agent
```

```js
import { HttpProxyAgent } from "http-proxy-agent";
import { HttpsProxyAgent } from "https-proxy-agent";

const UPSTREAM = process.env.UPSTREAM_PROXY; // http://user:pass@pr.proxynet.io:8000

const unblocker = new Unblocker({
  prefix: "/proxy/",
  requestMiddleware: [checkTarget],
  httpAgent: new HttpProxyAgent(UPSTREAM), // http:// hedefler: proxy'ye tam adresli istek
  httpsAgent: new HttpsProxyAgent(UPSTREAM), // https:// hedefler: proxy üzerinden CONNECT tüneli
});
```

`user:pass` isteyen test proxy'miz her hedef için bir satır kaydetti:

```text
[test-proxy] CONNECT example.com:443 auth=user
[test-proxy] GET http://example.com/ auth=user fwd-authorization=- x-forwarded-for=-
```

HTTPS sayfası bir `CONNECT` tünelinden geçtiği için proxy yalnızca sunucu adını gördü; HTTP satırındaki tireler, temizlenen başlıkların siteye gitmediğini gösteriyor. Parola yanlış olduğunda iki sayfa da proxy'nin kendi `407 Proxy Authentication Required` cevabını döndürdü. Paroladaki `@`, `:` veya `/` karakterlerini `encodeURIComponent` ile kodlayın. Aynı ajanların Axios, node-fetch ve undici ile kullanımını [Node.js'te Proxy Kullanımı](/tr/blog/nodejs-proxy) yazımızda anlattık.

Upstream kullanıldığında `safeLookup` artık çalışmaz, çünkü adları proxy kendi ağında çözer; bu yüzden izin listesini sıkı tutun. Parolayı tamamen kaldırmak da mümkündür: sunucunuzun genel IP adresini paneldeki IP whitelist'e ekleyin (en fazla 10 adres). İki yöntemi [Proxy Kimlik Doğrulama: User:Pass ve IP Whitelist](/tr/blog/proxy-authentication-methods) yazımızda karşılaştırdık.

[Datacenter Proxy](https://proxynet.io/tr/datacenter-proxy), ekibe trafiği ölçülmeyen sabit bir çıkış IP'si verir. IP başına satılan paketler varsayılan olarak belirli hedef sitelere erişimle gelir, bütün sitelere erişim ise ücretli bir eklentidir; izin listenizdeki sitelerin kapsandığını kontrol edin.

Bir sayfayı başka bir ülkedeki ev kullanıcısının gördüğü gibi görmek istiyorsanız, örneğin bir yerelleştirme kontrolünde, ülke ve şehir seçilerek alınan bir [Residential Proxy](https://proxynet.io/tr/residential-proxy) çıkışı kullanın. 1 ile 60 dakika arasında ayarlanan sticky oturum, bir akış boyunca aynı çıkışı korur.

## Node Unblocker'ın sınırları nelerdir?

Node Unblocker, içeriğinin çoğu sunucuda oluşturulan sıradan sayfalarda en iyi sonucu verir. Geri kalanını README açıkça yazar:

- **OAuth ile giriş ve `postMessage`.** Başka bir sağlayıcının penceresinden yapılan girişlerin çalışması pek olası değildir.
- **Büyük tek sayfa uygulamaları.** README, çalışmayan birkaç tanınmış sohbet, video ve sosyal medya platformunu adıyla sayar. Sayfaya eklenen betik yaygın istek API'lerini sarar; ama `window.location`, `document.cookie` ve `postMessage` hâlâ yapılacaklar listesindedir.
- **Web sayfası olmayan her şey.** Masaüstü uygulamaları, e-posta istemcileri ve komut satırı araçları için forward proxy gerekir.
- **Yavaş bakım.** Haziran 2024 sürümü, Ekim 2026'da hâlâ en güncel sürümdü. `lib/` klasöründeki middleware dosyaları kısadır; pakete güvenmeden önce onları okuyun.

## Kullanım alanları

- Bir QA ya da yerelleştirme ekibi için, şirketin kendi sayfalarını hedef ülkedeki residential bir çıkıştan açan iç önizleme aracı.
- Proxy ayarı değiştirilemeyen ama onaylı birkaç siteye kimlik doğrulamalı bir upstream üzerinden ulaşması gereken, yalnızca tarayıcı çalıştıran bir kiosk.
- İş ortağının izin listesine aldığı tek bir sabit IP'den iş ortağı portalına erişmesi gereken küçük bir ekip.
- Sayfa yeniden yazan proxy'lerin nasıl çalıştığını öğrenmek: paketi `DEBUG=unblocker:*` ile çalıştırıp her middleware'i izlemek.

Hepsinde aynı çerçeve geçerlidir: yalnızca kullanma izniniz olan siteler, sitenin kaldırabileceği bir hızda ve hiçbir zaman bir filtreyi ya da engeli aşmanın yolu olarak değil.

## Sık yapılan hatalar

- **Girişsiz olarak `0.0.0.0` adresini dinlemek.** Sunucu herkese açık bir aktarıcıya dönüşür.
- **Erişimi yalnızca Express middleware'inde kontrol etmek.** WebSocket upgrade istekleri oraya hiç uğramaz.
- **`requestMiddleware` içinde `data.clientResponse` değerini kontrol etmeden kullanmak.** Upgrade isteklerinde `null` olur ve süreci çökertir.
- **Yalnızca sunucu adı kontrolüne güvenmek.** Çözülen IP'yi ajanın `lookup` fonksiyonunda kontrol edin.
- **Tarayıcı başlıklarının hepsini iletmek.** Silmediğiniz sürece `Authorization` ve `X-Forwarded-For` hedefe ulaşır.
- **Express'in varsayılan hata sayfasını bırakmak.** Üretim (production) modu dışında bu sayfa, ziyaretçimize `getaddrinfo ENOTFOUND` hatasını yığın iziyle (stack trace) gösterdi.
- **Kişisel hesaplara proxy üzerinden giriş yapmak.** Sunucu her parolayı görür.

## Karar rehberi

| İhtiyaç | Öneri |
|---|---|
| Nasıl çalıştığını öğrenmek | `127.0.0.1` üzerinde en sade sunucu |
| Küçük bir ekip belirli siteleri açacak | HTTPS veren bir reverse proxy arkasında korumalı sunucu |
| Sayfaları başka bir ülkedeki ziyaretçinin gözüyle görmek | Residential upstream ile korumalı sunucu |
| İş ortağının izin listesine alacağı sabit bir çıkış IP'si | Korumalı sunucu, gerekirse datacenter upstream |
| Uygulamalar, betikler ya da bütün bir tarayıcı | Forward proxy (HTTP veya SOCKS5) |
| OAuth girişleri ya da büyük web uygulamaları | Forward proxy ile sıradan bir tarayıcı |
| Herkese açık bir proxy | Kurmayın |

## Sıkça sorulan sorular

### Node Unblocker bir VPN midir?

Hayır. VPN bir cihazın bütün trafiğini şifreli bir tünelden geçirir; Node Unblocker ise başka sayfaları sizin yerinize yükleyen bir web sitesidir. Yalnızca `/proxy/` adresi altında açtığınız sayfalar ondan geçer ve sunucu bu trafiği açık metin olarak okur.

### Node Unblocker IP adresimi gizler mi?

Sunucu başka bir yerde çalışıyorsa hedef siteden gizler: site sunucunun IP'sini görür. Sunucuyu çalıştıran kişiden gizlemez; reverse proxy arkasında ise `X-Forwarded-For` başlığı silinmedikçe IP'niz bu başlıkla siteye ulaşır.

### Node Unblocker Express 5 ile çalışır mı?

Testimizde çalıştı. Express 5.3.0 ile sayfalar, yönlendirmeler, form gönderimleri ve WebSocket, Express 4.22.3'teki gibi davrandı; npm paketin içine ayrı bir Express 4 kopyası kurar.

### Node Unblocker WebSocket bağlantılarını taşıyabilir mi?

Evet, `unblocker.onUpgrade` sunucunun `upgrade` olayına bağlandığında taşır. Express middleware'leri orada çalışmadığı için girişi ve hedefi bu dinleyicide de kontrol edin.

### Node Unblocker ticari bir üründe kullanılabilir mi?

AGPL-3.0 koşullarıyla kullanılabilir: paketi değiştirip değiştirilmiş sürümü kullanıcılara ağ üzerinden sunarsanız, onlara bu sürümün kaynak kodunu da sunmanız gerekir. README, yazarın ticari lisans da sunduğunu belirtir.

### Giriş yapılıyor ama sonraki sayfada oturum neden düşüyor?

Çoğu zaman site alt alan adları arasında ya da HTTP'den HTTPS'e geçmiştir. Unblocker çerezleri her site için ayrı bir yol altında tutar ve yeni yola fazladan bir yönlendirmeyle kopyalar; kaynak kodundaki not, bu sırada son kullanma tarihi gibi bayrakların kaybolduğunu söyler.

## Özet

Node Unblocker, bir Express sunucusunu sıradan bir tarayıcı için sayfaları yeniden yazan bir web proxy'ye çevirir: ziyaretçi `/proxy/<adres>` yolunu açar, sunucu sayfayı kendi IP'sinden getirir, linkleri, çerezleri ve yönlendirmeleri yeniden yazar ve geri akıtır. En sade sunucu Express 4 veya 5 üzerinde birkaç satırdır; asıl iş onu güvenli hâle getirmektir: giriş kontrolü, izin listesi, çözülen IP kontrolü, temizlenen başlıklar, korunan bir WebSocket dinleyicisi ve önünde HTTPS. Çıkışın başka bir yerde olması gerektiğinde ajan seçenekleri trafiği bir upstream'den geçirir; bunun için datacenter, residential, mobil ve statik ISP çıkışlarını [proxy paketlerimizde](/tr/proxy) bulabilirsiniz.
