---
title: "Sunucuya erişimi kısıtlayın ve uygulamanızın önüne bir WAF koyun"
description: "erpc worker, sunucuya erişimi ilk dağıtımdan itibaren kısıtlar; erpc.toml'daki tek bir tablo ise herkese açık bir API'nin önüne WAF koyar. Ne yapar, ne yapmaz."
canonical: "https://erpc.global/tr/doc/erpc-cli/worker-firewall-and-waf/"
locale: "tr"
---

# Sunucuya erişimi kısıtlayın ve uygulamanızın önüne bir WAF koyun

İlk dağıtımdan itibaren `erpc worker`, SSH'ye yalnızca sizin adresinizden izin verir ve gelen diğer tüm bağlantıları düşürür. Bir `[waf]` tablosu, API'nizin önüne filtreleyen bir proxy koyar.

Bu sayfada bir ön sürüm olan ERPC CLI `v0.1.0-rc.4` anlatılır.

## Güvenlik duvarı

Bir dağıtım, uygulama ilk kez başlamadan önce sunucunun güvenlik duvarını ayarlar:

- SSH yalnızca `firewall.ssh_allow` adreslerinden ve dağıtımın geldiği adresten;
- gelen diğer tüm bağlantılar düşürülür, `firewall.app_allow` adreslerinden `run.port` bağlantı noktasına gelenler hariç; WAF'ın arkasındaki bir uygulamada bunun yerine WAF'ın bağlantı noktası, ve bu da yalnızca sunucudaki WAF, `[waf]` tablosunun şimdi oluşturduğu kuralları zaten çalıştırıyorsa ([aşağıda](https://erpc.global/tr/doc/erpc-cli/worker-firewall-and-waf/#uygulamanızın-önüne-bir-waf-koyun)).

Her değişiklik 120 saniyelik bir geri alma zamanlayıcısı altında çalışır ve yalnızca yeni bir bağlantı içeri girebildiğinde kalıcı olur; böylece hatalı bir değişiklik sizi dışarıda bırakamaz.

Ancak allowlist, oluşturulduğu adresten daha uzun yaşar: ev adresiniz değişirse, içeri geri dönmenin yolu bir ERPC sunucusu için ERPC desteği, kendi sunucunuz için ise sağlayıcının konsoludur. Bir ev adresine güvenmeden önce, sunucuya erişebileceğiniz ikinci bir adresi (bir ofis, bir VPN çıkışı) `firewall.ssh_allow` içinde tutun.

Adresiniz değişirse, yöneticilerinizin kullandığı tüm sabit adresleri ekleyin:

```bash
erpc worker firewall allow --to ssh 203.0.113.10 198.51.100.7
```

| Komut | Ne yapar |
| --- | --- |
| `erpc worker firewall list` | Sunucuya kimin erişebileceğini gösterir: `erpc.toml` ile sunucunun tablosu yan yana |
| `erpc worker firewall allow --to ssh\|app <addresses>` | Adreslerin içeri girmesine izin verir ve bunu uygular. SSH'ye tek tek adreslerden izin verilir; bir ağ yalnızca `--to app` ile kabul edilir |
| `erpc worker firewall deny --to ssh\|app <addresses>` | Onların içeri girmesine izin vermeyi bırakır |
| `erpc worker firewall sync` | Sunucunun güvenlik duvarını yeniden `erpc.toml` dosyasında yazılanla aynı hâle getirir |

## Uygulamanızın önüne bir WAF koyun

`erpc.toml` dosyasına tek bir tablo ekleyin:

```toml
[waf]
port = 8080
```

Ardından `erpc worker deploy`, sunucuda kendine ait bir systemd biriminde (`erpc-waf-<app>-<env>`) bir HTTP ters proxy çalıştırır: proxy, anahtarı, gizli değeri ve worker'a ait hiçbir şeyi olmayan, 1 GiB bellekle sınırlandırılmış, ayrıcalıksız bir dinamik kullanıcı olarak çalışır. `waf.port` üzerinde dinler, her isteği uygulamadan önce okur, kurallarında adı geçeni reddeder ve geri kalanını `127.0.0.1:<run.port>` üzerindeki uygulamaya iletir.

- **Uygulama loopback üzerinde kalır.** Kendi bağlantı noktası dışarıdan asla açılmaz. `erpc worker api` ve sağlık kontrolü, WAF'ı atlayarak uygulamaya loopback üzerinden ulaşır.
- **Kimin bağlanabileceğini yine güvenlik duvarının listesi belirler**; WAF'ın bağlantı noktası, bu listenin herkese izin verebileceği tek yerdir:

  ```sh
  erpc worker firewall allow --to app 0.0.0.0/0     # and ::/0
  ```

  Listede kimse yoksa WAF dinler ama kimse içeri alınmaz ve dağıtım bunu söyler.
- **Bağlantı noktası, WAF onu dinlemeye başladığında açılır**, asla daha önce değil. WAF'ı ayağa kalkmayan bir dağıtım başarısız olur ve nedenini söyler; uygulama ise çalışmaya devam eder.
- **`[waf]` tablosunu değiştirdiğinizde,** bir dağıtım yeni kuralları yerine koyana kadar bağlantı noktası yeni hiç kimseye açılmaz.
- **`[waf]` tablosunu** `erpc.toml` dosyasından çıkarıp dağıtım yapmak, WAF'ı sunucudan kaldırır.

## WAF ayarları

Yalnızca `port` zorunludur. Tüm anahtarlar, varsayılan değerleriyle:

```toml
[waf]
port = 8080          # the public port, 1024 or above; the app keeps [run] port
methods = ["GET", "POST", "PUT", "DELETE"]
allow_paths = []     # every path
deny_paths = []
max_body_bytes = 1048576
max_header_bytes = 16384
rate = { per_second = 50, burst = 100 }
max_connections_per_address = 32
ban = { after = 100, window_secs = 60, for_secs = 600 }
block_probes = true
header_timeout_secs = 10
body_timeout_secs = 30
upstream_timeout_secs = 30
new_connections = { per_second = 50, burst = 100 }
```

| Anahtar | Ne yapar | Reddedilen ne alır |
| --- | --- | --- |
| `methods` | İletilen yöntemler, büyük harflerle (en fazla 16; asla `CONNECT` değil) | 405, `Allow` ile |
| `allow_paths` | İletilen yollar; hiçbiri listelenmemişse tüm yollar. Bir desen tek bir yoldur ya da `*` ile bitiyorsa bir önekin altındaki her şeydir: `/api/*`, `/api` ve altındaki her şeydir. Yüzde kodlaması bir kez çözülmüş yolla, büyük/küçük harfe duyarlı olarak karşılaştırılır | 404 |
| `deny_paths` | Reddedilen yollar; aynı biçimde yazılır ve önce denetlenir | 403 |
| `max_body_bytes` | En büyük istek gövdesi, en fazla 64 MiB | 413 |
| `max_header_bytes` | İstek satırı ile başlıkların toplamda en büyük boyutu, 1024 ile 65536 arası | 431 |
| `rate` | Bir adresten saniyedeki istek sayısı ve hız sınırı devreye girmeden önce aynı anda kaç istek | 429, `Retry-After` ile |
| `max_connections_per_address` | Bir adresin aynı anda tuttuğu bağlantılar | Bağlantı yanıtsız kapatılır |
| `ban` | `after` sayıda engellenen istek `window_secs` içinde gerçekleştikten sonra adres `for_secs` boyunca (en fazla 30 gün) reddedilir | Bağlantıları yanıtsız kapatılır |
| `block_probes` | Tarama araçlarının istediklerini reddeder (`/.env`, `/.git`, `/wp-login.php` ve benzerleri) | 403 |
| `header_timeout_secs` | Bir istemcinin bir isteğin baş kısmını göndermek için ne kadar süresi olduğu, 1 ile 120 arası. Ayrıca bir gövdenin ortasında durmuş ya da yanıtını almayı bırakmış bir istemcinin ne kadar bekleneceği | Baş kısmı için 408; durmuş bir gövde için 400; alınmayan bir yanıt için bağlantı kapatılır |
| `body_timeout_secs` | Bir isteğin gövdesinin toplamda ne kadar sürebileceği, 1 ile 600 arası; WAF'ın uygulamayı beklediği süre sayılmaz | 408 |
| `upstream_timeout_secs` | Uygulamanın bağlantıyı kabul etmek ve yanıt vermeye başlamak için ne kadar süresi olduğu, 1 ile 600 arası | 504; uygulama dinlemiyorsa 502 |
| `new_connections` | Güvenlik duvarının, bir adresten WAF'ın bağlantı noktasına saniyede açılan yeni TCP bağlantıları için kendi sınırı; bunlar, proxy onları görmeden önce nftables tarafından düşürülür. nftables'ın adres kümesi doluyken kümede olmayan bir adres sayılmaz, bu yüzden kümede yeniden yer açılana kadar bu sınır ona uygulanmaz; proxy'nin kendi sınırları (`rate`, `max_connections_per_address`, `ban`) yine de uygulanır | Paket düşürülür |

`rate`, `max_connections_per_address`, `ban` ve `new_connections`, `false` ile kapatılır (`ban = false`); dışarıda bırakılan bir anahtar varsayılan değerini alır. `erpc worker check`, herhangi bir dağıtımdan önce `[waf]` tablosunun ne yapacağını ve nesinin yanlış olduğunu söyler.

## WAF'ın ayar gerektirmeden yaptıkları

- Belirsizlik içermeyen tek bir HTTP/1 isteği olarak okunamayan bir istek 400 alır; normal biçimde olmayan bir yol da öyle.
- Protokol değiştirme isteği (`Upgrade`) 501 alır.
- Her reddetme yasaklama sayacına eklenir ve her reddetme kendi bağlantısını sonlandırır.
- Adres derken bir IPv4 adresi ya da bir IPv6 `/64` kastedilir.
- WAF, istemcinin proxy'ye olan bağlantısına ait başlıkları (`Connection` ve onun adını verdiği başlıklar, `Keep-Alive`, `Proxy-Authenticate`, `Proxy-Authorization`, `Proxy-Connection`, `TE`, `Trailer`), `Expect` başlığını, adında alt çizgi bulunan başlıkları ve istemcinin kendi `Forwarded`, `X-Real-IP` ve `X-Forwarded-Proto` başlıklarını iletmez. `X-Real-IP` başlığını bağlantının geldiği adrese ayarlar ve bu adresi `X-Forwarded-For` başlığının sonuna ekler; `X-Forwarded-For` başlığının yalnızca son girdisi proxy'nin kendi beyanıdır.

## WAF'ın ne yaptığını görme

| Komut | Gösterdiği |
| --- | --- |
| `erpc worker status` | WAF'ın bağlantı noktası, nereye ilettiği, ne zamandan beri çalıştığı ve o zamandan bu yana sayımlar |
| `erpc worker firewall list` | WAF'ın bağlantı noktasına kimin erişebileceği ve kurala göre neyin engellendiği |
| `erpc worker logs --waf` | Engellenen her istek: kural, durum, istemcinin adresi, yöntem ve hedefin ilk 200 baytı |

İletilen bir istek log satırı bırakmaz ve hiçbir başlık ya da gövde asla loglanmaz; engellenen bir isteğin sorgusu ise 200 baytın yettiği kadarıyla loglanır. Bir istemcinin gönderdiği şey terminalinize yazamaz: WAF, journal'ını yazdırılabilir ASCII olarak yazar.

## WAF'ın yapmadıkları

- **TLS yok.** Kendi bağlantı noktasında düz HTTP/1.1 konuşur.
- **HTTP/2 yok:** ona 400 ile yanıt verir.
- **WebSocket yok**, başka herhangi bir `Upgrade` da yok: 501.
- **Gövdelerin içine bakmaz.** Bir gövde ölçülür, asla okunmaz. Tarama isteği listesi kısadır ve bir gürültü filtresidir, bir güvence değildir: uygulama girdisini yine de kendisi denetler.
- **Kimlik doğrulama yok.** Uygulamayı kimin çağırabileceğine uygulamanın kendisi ve güvenlik duvarının listesi karar verir.
- **Bir adres bir istemcidir.** Tek bir NAT, proxy veya CDN arkasındaki istemciler aynı hız sınırını ve aynı yasaklamayı paylaşır; çok sayıda adresi olan bir istemcinin de adresi kadar hız sınırı olur.
- **Yasaklamalar ve sayımlar** WAF yeniden başladığında unutulur.
- **En fazla 8192 adresi hatırlar** ve aynı anda en fazla 1024 bağlantı tutar.
- **Yalnızca IPv4 üzerinde dinler,** bu yüzden `app_allow` içindeki bir IPv6 girdisi henüz hiçbir yere ulaşmaz.
- **Bir yol, çözüldüğü baytlar olarak karşılaştırılır.** Yolları daha gevşek okuyan bir uygulamaya (büyük/küçük harfi yok sayan, `;` parametrelerini kabul eden, iki kez çözen) `deny_paths` kapsamının dışında kalan bir adla ulaşılabilir. `allow_paths` tarafında böyle bir açık yoktur: listelenmeyen iletilmez.
- **Yavaş okuyan bir istemciye sonuna kadar hizmet verilir.** Bir yanıtı ne kadar yavaş olursa olsun almaya devam eden bir istemciye sonuna kadar hizmet verilir.
- **Bir istek seli büyük bir yüklemeyi kesebilir.** WAF tek bir iş parçacığında çalışır, bu yüzden bir sel büyük bir yüklemeyi 408 ile kesebilir. Büyük gövdeler alan bir uygulama `body_timeout_secs` değerini `max_body_bytes` ile birlikte yükseltir.

[Worker kılavuzu](https://github.com/elsoul/erpc-cli/blob/v0.1.0-rc.4/docs/worker.md), `app_allow` üzerindeki bir değişikliğin ne zaman bir sonraki dağıtıma kadar bekletildiği de dahil olmak üzere her kuralı içerir.
