---
title: 'Linux Ağ Yönetimi ve Sorun Giderme'
source: 'https://academia.sh/tr/kurslar/linux-ag-yonetimi'
language: tr
updated: '2026-08-17T04:41:50+00:00'
license: 'CC BY-SA 4.0'
lessons: 13
outcomes:
    - 'Bir sunucunun ağ yapılandırmasını okur ve değiştirir'
    - 'Bağlantı sorununu katman katman daraltır ve her sınamanın elediği aday nedeni sayar'
    - 'Güvenlik duvarı kurallarını ve uzak erişimi kilitlenmeye yol açmadan yapılandırır'
---

# Linux Ağ Yönetimi ve Sorun Giderme

Tek bir sunucunun ağ yapılandırmasının okunması ve bir bağlantı arızasının, her sınamanın elediği aday neden sayılarak daraltılması.

## Ağ Yapılandırması

Arayüzler ve adresler, yönlendirme tablosu, ad çözümleme yapılandırması ve dinleyen bağlantı noktalarının envanteri; her okumanın kaç aday nedeni elediği.

### Arayüzler ve Adresler

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/arayuzler-ve-adresler

Arayüz listesi sekiz aday nedene karşı üç ayrı yanıt veriyor; iki yanıt tek başına yedi adayı eliyor, üçüncüsü yalnız ikisini eliyor ve geriye altı aday bırakıyor.

Bir önceki kurs depolamayla bitti: arızanın en sessiz göründüğü katman. Dolan bir dosya
düğümü tablosu hiçbir uyarı üretmiyordu, dolan bir anlık görüntü ardında iz bırakmıyordu.
Ama o sessizliğin bir avantajı vardı — arıza **yereldi**. Bakılacak yer tek bir makineydi
ve o makinenin bütün katmanlarına aynı kabuktan erişilebiliyordu.

Ağda bu avantaj yok. Arıza hem sessiz hem de **başkasının makinesinde** olabilir; hatta
arada, hiç kimsenin makinesi olmayan bir yolda olabilir. Bu yüzden kursun ölçüsü değişiyor.
Sistem Yönetimi kursu bir aracın ne göremediğini saydı. Bu kurs, **bir sınamanın kaç aday
nedeni elediğini** sayar. Kuralı şudur: bir sınamanın sayısı verdiği yanıt değil, elediği
aday nedendir; **kaç adayı elediği yazılmayan sınama ölçülmemiş sayılır.** İlk ders en alttaki
sınamayla, arayüz ve adres listesiyle başlar.

#### Kurgu Sunucu ve Sekiz Aday Neden

Kurs boyunca tek bir kurgu sunucu izlenir. Üzerinde `veri-alma` adlı bir birim çalışır ve
bir bağlantı noktasını dinler; sunucu bir arayüz üzerinden ağa bağlıdır, bir varsayılan ağ
geçidi üzerinden dışarı çıkar ve adları bir çözücüye sorar. Bu sunucuya bağlanmaya
çalışan biri "bağlantı kurulmuyor" diyor. Tanının başladığı yer bu cümledir ve cümle hiçbir
şey söylemez: sekiz ayrı arıza tam olarak bu cümleyi üretir.

- **AY1** — Sekiz aday neden var ve her biri sağlam durumun **tek bir alanını** bozar: arayüz
  kapalı, adres yok, ağ geçidi yanlış, rota eksik, çözücü sessiz, servis dinlemiyor,
  güvenlik duvarı düşürüyor, büyük paket düşüyor. Aynı anda iki arıza bulunmadığı varsayılır.
- **AY2** — **Kâhin gerçek arızadır.** Kurguyu biz seçtiğimiz için hangi alanın bozuk olduğunu
  biliyoruz; sınamayı yapan kişi bilmiyor. Ölçüm bu asimetriyi kullanır.
- **AY3** — Sekiz **sınama** var; her biri bir araca karşılık gelir ve **bir yanıt** döndürür.
  Yanıt aday kümesini böler: aynı yanıtı veren adaylar birlikte kalır, farklı yanıt verenler
  elenir.
- **AY4** — Bütün sayılar tam sayımdır. Sekiz aday ve sekiz sınama üzerinden tüketici hesap
  yapılır; rastgelelik yoktur.

Bu kurs **tek makinenin yapılandırmasıdır**. Katman modelleri, adresleme aritmetiği, ad
çözümleme protokolü ve yönlendirme protokolleri Bilgisayar Ağları müfredatının konusudur;
burada kurulmaz, oradaki derslere bırakılır. Buradaki soru protokolün nasıl çalıştığı değil,
**bu makinenin yapılandırmasının ne söylediği** ve o söylemin kaç adayı elediğidir. Konteyner
ağı ve ad alanları da bu kursun dışındadır; onlar Çekirdek Arayüzleri ve İzolasyon kursuna
bırakılmıştır.

#### Arayüz Listesi Ne Gösterir

Arayüz, çekirdeğin ağ donanımına ya da sanal bir bağlantıya verdiği addır. Listeleme aracı
her arayüz için iki ayrı şey söyler: **yönetimsel durum** (arayüz açılmış mı) ve **taşıyıcı
durumu** (karşı uçtan sinyal geliyor mu). Bu ikisi ayrıdır ve ayrı olmaları ölçümün
temelidir.

```text
# örnek döküm — çalıştırılmamıştır
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP
3: eth1: <BROADCAST,MULTICAST> mtu 1500 state DOWN
```

Adres ayrı bir sorudur. Bir arayüz açık olabilir, taşıyıcısı da olabilir ve üzerinde hiçbir
adres bulunmayabilir; bu durumda paket üretilemez. Kısa biçimli adres dökümü iki soruyu
yan yana koyar.

```text
# örnek döküm — çalıştırılmamıştır
$ ip -brief addr show
lo     UNKNOWN  127.0.0.1/8
eth0   UP       203.0.113.24/24
eth1   DOWN
```

Bu iki blok **çalıştırılmamıştır** ve buradan hiçbir sayı iddiası çıkarılmaz. Dökümün
öğrettiği şey biçimdir: durum alanı, arayüz adı ve adres alanı. Bu dersteki bütün adresler
kurgudur; arayüz adları da dağıtımın adlandırma düzenine göre değişir ve bu bir kez söylenip
geçilir.

Adres atamanın iki yolu vardır ve aralarındaki fark tanıda sık karıştırılır. Komutla verilen
adres **çalışma zamanına aittir**: çekirdeğin tablosuna yazılır, yeniden başlatmada kaybolur.
Yapılandırma dosyasına ya da ağ yöneticisine yazılan adres **kalıcıdır**: önyüklemede yeniden
uygulanır. İkisi çakışabilir. Elle verilmiş bir adresle çalışan sunucu haftalarca sorunsuz
görünür ve ilk yeniden başlatmada adressiz açılır. Depolama kursundaki kalıcı takma girdisiyle
aynı kalıptır: **çalışan durum ile kalıcı yapılandırma iki ayrı gerçektir** ve yalnız biri
sınanmışsa iş bitmemiştir.

#### Listenin Göremediği

Arayüz listesi üç ayrı soruyu tek dökümde birleştirir ve birleştirdiği için bazı ayrımları
kaybeder. Yönetimsel durum, arayüzün açılmış olup olmadığını söyler ve bu bir **yapılandırma**
kararıdır. Taşıyıcı durumu, karşı uçtan sinyal gelip gelmediğini söyler ve bu bir **fiziksel**
gerçektir. Üçüncüsü adresin varlığıdır ve o da yapılandırmadır. Açılmış ama taşıyıcısı olmayan
bir arayüz, dökümde açık görünen bir satır üretir; kablo çıkmışken bile satır yerinde durur ve
yalnız taşıyıcı alanı değişir. Tanıya başlayan kişi bu alana bakmazsa arayüzü sağlıklı sayar.

Aynı birleştirme adres tarafında da var. Bir arayüzde birden çok adres bulunabilir ve dökümde
hepsi alt alta listelenir; hangisinin dışarı çıkan paketlerde kaynak olarak kullanılacağı
listeden okunmaz, seçimi yönlendirme yapar. İki arayüzün aynı alt ağda adres alması da liste
düzeyinde tamamen normal görünür ve trafiği beklenmedik bir arayüze taşıyabilir.

- **AY5** — Ortak tanım bu ayrımları **tek bir alana** indiriyor: `arayuz-kapali` adayı hem
  arayüzün kapalı hem de adresin yok olması demektir, çünkü kapalı arayüzde adres etkin
  değildir. Taşıyıcı durumu ile yönetimsel durum arasındaki fark modelde ayrı bir alan olarak
  tutulmuyor; bu, modelin bilinçli bir sınırıdır ve süpürmede tam bu sınır zorlanır.

#### Sınamanın Ölçüsü Elenen Adaydır

Aşağıdaki tanım kurs boyunca kullanılacak ortak tanımdır: kurgu sunucunun sağlam durumu,
sekiz arıza ve sekiz sınama. Her sınama bir aracın verdiği yanıtı döndürür.

- **AY6** — Sınamalar birbirinden bağımsız çağrılır; bir sınamanın yanıtı ötekinin yanıtını
  değiştirmez. Ölçülen şey her sınamanın **tek başına** kaç adayı elediğidir.
- **AY7** — "En kötü kalan", sınamanın verebileceği yanıtlar arasında **en büyük öbeğin**
  boyudur; kâhinden bağımsız bir ölçüdür ve sınamanın tavanını verir.

```python
"""Ortak tanim: kurgu sunucunun saglam durumu , sekiz aday ariza , sekiz sinama.
Olculen sey bir sinamanin kac aday nedeni ELEDIGIDIR."""
SAGLAM = {"arayuz_acik": True, "adres_var": True, "ag_gecidi_dogru": True,
          "rota_var": True, "cozumleyici_yanit": True, "servis_dinliyor": True,
          "guvenlik_duvari_gecirir": True, "yol_bozulmadan": True}
ARIZA = {
    "arayuz-kapali":      {"arayuz_acik": False, "adres_var": False},
    "adres-yok":          {"adres_var": False},
    "ag-gecidi-yanlis":   {"ag_gecidi_dogru": False},
    "rota-eksik":         {"rota_var": False},
    "cozumleyici-sessiz": {"cozumleyici_yanit": False},
    "servis-dinlemiyor":  {"servis_dinliyor": False},
    "guvenlik-duvari-dusuruyor": {"guvenlik_duvari_gecirir": False},
    "buyuk-paket-dusuyor": {"yol_bozulmadan": False},
}


def durum(ariza, tablo):
    d = dict(SAGLAM)
    d.update(tablo[ariza])
    return d


def s_arayuz(d):
    return ("acik-adresli" if d["arayuz_acik"] and d["adres_var"]
            else "acik-adressiz" if d["arayuz_acik"] else "kapali")


def s_rota(d):
    if not d["adres_var"]:
        return "tablo-bos"
    return "tam" if d["rota_var"] else "varsayilan-yok"


def s_gecit_yankisi(d):
    return "yanit" if d["arayuz_acik"] and d["adres_var"] else "yanit-yok"


def s_uzak_yanki(d):
    return "yanit" if (d["arayuz_acik"] and d["adres_var"]
                       and d["ag_gecidi_dogru"] and d["rota_var"]) else "yanit-yok"


def s_ad_cozumleme(d):
    return "cozuldu" if d["cozumleyici_yanit"] else "cozulemedi"


def s_dinleyen(d):
    return "dinliyor" if d["servis_dinliyor"] else "dinlemiyor"


def s_baglanti(d):
    if not (d["arayuz_acik"] and d["adres_var"] and d["ag_gecidi_dogru"]
            and d["rota_var"]):
        return "ulasilamaz"
    if not d["guvenlik_duvari_gecirir"]:
        return "zaman-asimi"
    return "reddedildi" if not d["servis_dinliyor"] else "kuruldu"


def s_buyuk_paket(d):
    return "geciyor" if (d["arayuz_acik"] and d["adres_var"]
                         and d["ag_gecidi_dogru"] and d["rota_var"]
                         and d["yol_bozulmadan"]) else "gecmiyor"


SINAMA = {"arayuz": s_arayuz, "rota": s_rota, "gecit-yankisi": s_gecit_yankisi,
          "uzak-yanki": s_uzak_yanki, "ad-cozumleme": s_ad_cozumleme,
          "dinleyen": s_dinleyen, "baglanti": s_baglanti,
          "buyuk-paket": s_buyuk_paket}


def obekler(sinama, tablo=ARIZA):
    o = {}
    for a in tablo:
        o.setdefault(SINAMA[sinama](durum(a, tablo)), []).append(a)
    return o


print("sinama          ayri yanit  en kotu kalan")
for s in SINAMA:
    o = obekler(s)
    print(f"  {s:14s} {len(o):9d}  {max(len(v) for v in o.values()):13d}")
print()
print("arayuz sinamasi: yanit basina aday")
for yanit, kume in obekler("arayuz").items():
    print(f"  {yanit:14s} kalan {len(kume):2d}  elenen {len(ARIZA) - len(kume):2d}"
          f"  {', '.join(kume)}")
print()
print("aday kumesi supurmesi")
EK = dict(ARIZA, **{"kablo-yok": {"arayuz_acik": False, "adres_var": False}})
EKSIK = {k: v for k, v in ARIZA.items() if k != "adres-yok"}
for ad, tablo in (("temel   8 aday", ARIZA), ("+kablo-yok  9", EK),
                  ("-adres-yok  7", EKSIK)):
    o = obekler("arayuz", tablo)
    en = max(len(v) for v in o.values())
    kapali = len(o.get("kapali", []))
    print(f"  {ad:14s} ayri yanit {len(o)}  en kotu kalan {en}"
          f"  'kapali' yanitinda kalan {kapali}"
          f"  elenen {len(tablo) - kapali}")
```

```
sinama          ayri yanit  en kotu kalan
  arayuz                 3              6
  rota                   3              5
  gecit-yankisi          2              6
  uzak-yanki             2              4
  ad-cozumleme           2              7
  dinleyen               2              7
  baglanti               4              4
  buyuk-paket            2              5

arayuz sinamasi: yanit basina aday
  kapali         kalan  1  elenen  7  arayuz-kapali
  acik-adressiz  kalan  1  elenen  7  adres-yok
  acik-adresli   kalan  6  elenen  2  ag-gecidi-yanlis, rota-eksik, cozumleyici-sessiz, servis-dinlemiyor, guvenlik-duvari-dusuruyor, buyuk-paket-dusuyor

aday kumesi supurmesi
  temel   8 aday ayri yanit 3  en kotu kalan 6  'kapali' yanitinda kalan 1  elenen 7
  +kablo-yok  9  ayri yanit 3  en kotu kalan 6  'kapali' yanitinda kalan 2  elenen 7
  -adres-yok  7  ayri yanit 2  en kotu kalan 6  'kapali' yanitinda kalan 1  elenen 6
```

Üç sayı yan yana duruyor. **Kâhin:** sekiz adaydan biri gerçek arızadır ve hangisi olduğunu
kurguyu kuran taraf bilir. **Sınama:** arayüz listesi bu sekiz duruma karşı **üç ayrı yanıt**
üretir — kapalı, açık-adressiz, açık-adresli. **Elenen aday:** yanıta göre yedi, yedi ve
**iki**; en kötü durumda geriye **altı aday** kalır.

#### Üç Yanıt Eşit Değildir

İlk tabloda arayüz sınamasının üç ayrı yanıt vermesi onu en ayrıntılı sınamalardan biri gibi
gösteriyor; yalnız bağlantı denemesi daha fazlasını, dört yanıt veriyor. Ama ayrı yanıt sayısı
eleme gücü değildir. İkinci tablo bunu açıyor: üç yanıttan ikisi tek bir adayı işaret ediyor,
üçüncüsü altı adayı bir arada bırakıyor.

Bunun pratik okuması şudur. Arayüz sınaması **arızayı bulduğunda kesin, bulamadığında neredeyse
sessizdir**. Liste "kapalı" derse iş bitmiştir: yedi aday elenir, tek aday kalır. Liste
"açık-adressiz" derse yine iş bitmiştir. Ama liste beklendiği gibi "açık ve adresli" derse —
ki tanıya başlayan kişinin karşılaştığı en sık yanıt budur — sekiz adaydan yalnız ikisi elenir
ve geriye altı aday kalır. Sınamanın **beklenen** sonucu, en az bilgi taşıyan sonuçtur.

Bu asimetri kursun ilk genel kuralını verir: **olumlu yanıt veren bir sınama tanı yapmaz,
yalnız bir kapıyı kapatır.** Arayüz listesine bakıp "burada bir sorun yok" demek doğrudur ve
adayların dörtte üçünü ayakta bırakır. Buna karşılık aynı listeye bakıp "arayüz açık, öyleyse
ağ çalışıyor" demek, iki adayın elenmesinden altı adayın masumiyetini çıkarmaktır.

Sınamanın yine de ilk sırada yapılmasının nedeni eleme gücü değil, **maliyetidir**. Arayüz
listesi yerelde okunur, yan etkisi yoktur, saniyenin altında döner ve yanlış olduğunda iki
adayı kesin biçimde işaret eder. İlk tabloda daha güçlü görünen sınamalar — bağlantı denemesi
ile uzak yankı, ikisi de en kötü durumda **dörder** aday bırakıyor — uzak uca erişim, açık bir
hedef ve bekleme süresi gerektirir; ikisi de arayüz kapalıyken "ulaşılamaz" ya da "yanıt yok"
der ve o yanıt **dört** ayrı adaya birden uyar. Sıralamanın mantığı
budur: **ucuz ve kesin olan önce, pahalı ve ayırt edici olan sonra.** Kaç adayın elendiği bir
sınamanın değerini verir; hangi sırada yapılacağını ise değerle maliyetin oranı belirler.

#### Aday Kümesi Süpürmesi

Bu kursta rastgelelik olmadığı için ikinci bir tohumla ölçüm tekrarlanamaz. Sonucun kurguya ne
kadar bağlı olduğunu görmenin yolu **aday kümesini süpürmektir**: listeye bir aday eklenir ve
bir aday çıkarılır, eleme sayılarının nasıl değiştiği okunur.

- **AY8** — Eklenen aday `kablo-yok`, fiziksel bağlantının kopması durumudur ve arayüz
  sınaması bakımından `arayuz-kapali` ile **aynı yanıtı** üretir.
- **AY9** — Çıkarılan aday `adres-yok`, arayüzün adressiz kalması durumudur ve sınamanın üçüncü
  yanıtını tek başına doldurur.
- **AY10** — Süpürme yalnız aday listesini değiştirir; sağlam durum, sınama tanımları ve ölçüm
  yöntemi aynı kalır.

Üçüncü tablo iki ayrı kırılganlık gösteriyor. Aday eklendiğinde "en kötü kalan" sayısı altıda
sabit kalıyor, yani sınamanın tavanı değişmiyor; ama **kesin sanılan yanıt kesinliğini
yitiriyor**. Dokuz adaylık listede "kapalı" yanıtı yine yedi aday eliyor, geriye kalan ise bir
değil **iki** adaydır: `arayuz-kapali` ile `kablo-yok` arayüz listesinden ayrılamaz. Ayrımı
yapan şey başka bir okumadır — taşıyıcı durumu. Sınamanın gücü sınamada değil, **aday
listesindedir**.

Aday çıkarıldığında ise yanıt sayısı üçten **ikiye** düşüyor ve "kapalı" yanıtının elediği aday
yediden **altıya** iniyor. Sayı küçüldü ama sınama zayıflamadı; küçülen şey problemdir. Bu, ölçünün
yorumlanmasında sürekli karşılaşılacak bir tuzağı gösteriyor: **eleme sayısı sınamanın değil,
sınama ile aday kümesinin ortak özelliğidir.** İki kurulumda ölçülen eleme sayıları ancak aday
listeleri aynıysa karşılaştırılabilir.

Süpürmenin uygulamadaki karşılığı, tanıya başlamadan önce aday listesini yazılı hâle getirmektir.
Liste yazılmadığında eleme sayısı hesaplanamaz ve sınamaların hangi sırayla yapılacağı sezgiye
kalır; liste yazıldığında her yanıt kaç satırın üstünü çizdiğini gösterir. Bu kursun geri kalanı
aynı sekiz satırı kullanır ve her derste bir ya da iki sınama ekleyerek listenin nasıl daraldığını
sayar. Listenin kendisi de bir yapılandırma kararıdır: hangi arızaların olası sayıldığı, hangi
sınamaların yapılmaya değer bulunacağını doğrudan belirler.

#### Özet

- Bu kurs tek makinenin ağ yapılandırmasını okur ve her sınamayı **elediği aday neden**
  sayısıyla ölçer; kaç adayı elediği yazılmayan sınama ölçülmemiş sayılır.
- Kurgu sunucuda sekiz aday neden ve sekiz sınama vardır; her arıza sağlam durumun tek bir
  alanını bozar ve kâhin, kurguyu kuran tarafın bildiği gerçek arızadır.
- Arayüz listesi **üç ayrı yanıt** verir ve yanıtlar eşit değildir: kapalı ve açık-adressiz
  yanıtları **yedişer** aday eler, beklenen açık-adresli yanıtı yalnız **iki** aday eler ve
  geriye **altı aday** bırakır.
- Çalışma zamanındaki adres ile kalıcı yapılandırmadaki adres iki ayrı gerçektir; yalnız biri
  sınanmışsa yapılandırma doğrulanmamıştır.
- Aday kümesi süpürmesi eleme sayısının kırılganlığını gösteriyor: dokuzuncu aday eklendiğinde
  "kapalı" yanıtı artık tek aday bırakmıyor, `adres-yok` çıkarıldığında yanıt sayısı üçten
  ikiye düşüyor. Eleme sayısı sınamanın değil, sınama ile aday kümesinin ortak özelliğidir.

#### Sonraki Adım

Arayüz açık ve adresli çıktığında geriye altı aday kalıyor ve bunların ikisi paketin nereye
gönderileceğiyle ilgili: varsayılan ağ geçidi yanlış olabilir ya da rota hiç bulunmayabilir.
Bir sonraki ders yönlendirme tablosunu okur ve aynı ölçüyü ona uygular. Orada görülecek olan
şey, tablonun üç ayrı yanıt verdiği ama iki adayı — ağ geçidinin yanlış olması ile rotanın
eksik olması — birbirinden ayırmakta beklenmedik biçimde zorlandığıdır: yankı temelli iki
sınama arka arkaya yapıldığında bu iki aday hâlâ aynı öbekte durur.

### Yönlendirme Tablosu

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/yonlendirme-tablosu

Yönlendirme tablosu sekiz aday nedene karşı üç yanıt veriyor ve en kötü durumda beş aday bırakıyor; ağ geçidinin yanlış olması ile rotanın eksik olması iki yankı sınamasından sonra hâlâ aynı öbekte duruyor.

Arayüz listesi beklenen yanıtı verdiğinde — açık ve adresli — sekiz adaydan yalnız ikisi
eleniyordu ve geriye altı aday kalıyordu. Bu altı adayın ikisi paketin **nereye
gönderileceğiyle** ilgilidir: varsayılan ağ geçidi yanlış olabilir ya da hedefe giden rota hiç
bulunmayabilir. İkisi de adresi olan, açık bir arayüzün arkasında durur ve arayüz listesinden
görünmez.

Bu ders yönlendirme tablosunu okur ve aynı ölçüyü ona uygular. Sonuç iki bakımdan öğreticidir.
Tablo okuması arayüz listesinden daha dar bir öbek bırakıyor, yani daha güçlü bir sınama. Buna
karşılık, bu ikisini birbirinden ayırmak için akla ilk gelen yol — yankı göndermek — iki ayrı
sınamaya rağmen ayrımı yapamıyor.

#### Tablo Neyi Söyler

Yönlendirme tablosu, bir hedef adres için paketin hangi arayüzden ve hangi bir sonraki
düğüme gönderileceğini belirleyen satırlardan oluşur. Satırlar sırayla denenmez; her satırın
bir hedef öneki vardır ve çekirdek **en uzun eşleşen öneki** seçer. Varsayılan ağ geçidi bu
kuralın en kısa öneke sahip satırıdır ve bu yüzden yalnız başka hiçbir satır eşleşmediğinde
kullanılır. Adres bir arayüze verildiğinde o alt ağın satırı tabloya kendiliğinden girer;
buna bağlı rota denir ve yerel ağa erişimi o satır sağlar.

```text
# örnek döküm — çalıştırılmamıştır
$ ip route show
default via 203.0.113.1 dev eth0
203.0.113.0/24 dev eth0 proto kernel scope link src 203.0.113.24
198.51.100.0/24 via 203.0.113.9 dev eth0
```

Tablonun tamamını okumak yerine tek bir hedef için kararı sormak da olanaklıdır. Karar sorgusu
üç şeyi birden söyler: seçilen satırı, çıkış arayüzünü ve paketin kaynak adresi olarak hangi
adresin yazılacağını. Kaynak adres seçimi tabloda görünmez ve yanlış seçildiğinde arıza
tek yönlü olur: paket gider, yanıt dönemez.

```text
# örnek döküm — çalıştırılmamıştır
$ ip route get 198.51.100.42
198.51.100.42 via 203.0.113.9 dev eth0 src 203.0.113.24
```

Bu iki blok çalıştırılmamıştır ve buradan hiçbir sayı iddiası çıkarılmaz; öğrettikleri şey
satırın biçimidir. Adresler kurgudur. Yönlendirme protokollerinin nasıl çalıştığı, tabloların
komşular arasında nasıl dağıtıldığı ve ölçütlerin nasıl hesaplandığı Bilgisayar Ağları
müfredatının konusudur; bu derste tablo **verili** kabul edilir ve yalnız okunur.

- **AY11** — Kurgu sunucunun tablosu üç satırdan oluşur: varsayılan ağ geçidi, yerel alt ağın
  bağlı rotası ve uzak alt ağa yazılmış tek bir statik rota. Aynı anda birden çok yönlendirme
  tablosu bulunmadığı varsayılır.
- **AY12** — `ag-gecidi-yanlis` adayı, varsayılan satırın var olduğu ama işaret ettiği bir
  sonraki düğümün paketi iletmediği durumdur. `rota-eksik` adayı, hedefe eşleşen hiçbir satırın
  bulunmadığı durumdur. Tabloda biri **dolu ve yanlış**, öteki **boş**tur.

#### Rota Sınamasının Ölçüsü

```python
"""Yonlendirme tablosu sinamasi: 8 aday nedene karsi kac aday eleniyor.
Ortak tanimin ayni sekiz arizasi; bu derste rota ve iki yanki sinamasi okunuyor."""
SAGLAM = {"arayuz_acik": True, "adres_var": True, "ag_gecidi_dogru": True,
          "rota_var": True, "cozumleyici_yanit": True, "servis_dinliyor": True,
          "guvenlik_duvari_gecirir": True, "yol_bozulmadan": True}
ARIZA = {
    "arayuz-kapali":      {"arayuz_acik": False, "adres_var": False},
    "adres-yok":          {"adres_var": False},
    "ag-gecidi-yanlis":   {"ag_gecidi_dogru": False},
    "rota-eksik":         {"rota_var": False},
    "cozumleyici-sessiz": {"cozumleyici_yanit": False},
    "servis-dinlemiyor":  {"servis_dinliyor": False},
    "guvenlik-duvari-dusuruyor": {"guvenlik_duvari_gecirir": False},
    "buyuk-paket-dusuyor": {"yol_bozulmadan": False},
}


def durum(ariza, tablo):
    d = dict(SAGLAM)
    d.update(tablo[ariza])
    return d


def s_rota(d):
    if not d["adres_var"]:
        return "tablo-bos"
    return "tam" if d["rota_var"] else "varsayilan-yok"


def s_gecit_yankisi(d):
    return "yanit" if d["arayuz_acik"] and d["adres_var"] else "yanit-yok"


def s_uzak_yanki(d):
    return "yanit" if (d["arayuz_acik"] and d["adres_var"]
                       and d["ag_gecidi_dogru"] and d["rota_var"]) else "yanit-yok"


SINAMA = {"rota": s_rota, "gecit-yankisi": s_gecit_yankisi,
          "uzak-yanki": s_uzak_yanki}


def obekle(sinamalar, tablo=ARIZA):
    o = {}
    for a in tablo:
        anahtar = tuple(SINAMA[s](durum(a, tablo)) for s in sinamalar)
        o.setdefault(anahtar, []).append(a)
    return o


print("rota sinamasi: yanit basina aday")
for yanit, kume in obekle(["rota"]).items():
    print(f"  {yanit[0]:14s} kalan {len(kume):2d}  elenen {len(ARIZA) - len(kume):2d}"
          f"  {', '.join(kume)}")
print()
print("arac kumesi buyudukce ayirt edilemeyen obekler")
for kume in (["gecit-yankisi"], ["gecit-yankisi", "uzak-yanki"],
             ["gecit-yankisi", "uzak-yanki", "rota"]):
    ayrilmayan = [sorted(v) for v in obekle(kume).values() if len(v) > 1]
    print(f"  {len(kume)} sinama {'+'.join(kume):38s} obek {len(ayrilmayan)}")
    for o in ayrilmayan:
        print(f"      {', '.join(o)}")
print()
print("aday kumesi supurmesi (rota sinamasi)")
EK = dict(ARIZA, **{"adres-yanlis-alt-ag": {"ag_gecidi_dogru": False,
                                            "rota_var": False}})
EKSIK = {k: v for k, v in ARIZA.items() if k != "ag-gecidi-yanlis"}
for ad, tablo in (("temel            8", ARIZA), ("+adres-yanlis    9", EK),
                  ("-ag-gecidi-yanlis 7", EKSIK)):
    o = obekle(["rota"], tablo)
    yok = len(o.get(("varsayilan-yok",), []))
    print(f"  {ad:18s} ayri yanit {len(o)}  en kotu kalan "
          f"{max(len(v) for v in o.values())}"
          f"  'varsayilan-yok' kalan {yok}  elenen {len(tablo) - yok}")
```

```
rota sinamasi: yanit basina aday
  tablo-bos      kalan  2  elenen  6  arayuz-kapali, adres-yok
  tam            kalan  5  elenen  3  ag-gecidi-yanlis, cozumleyici-sessiz, servis-dinlemiyor, guvenlik-duvari-dusuruyor, buyuk-paket-dusuyor
  varsayilan-yok kalan  1  elenen  7  rota-eksik

arac kumesi buyudukce ayirt edilemeyen obekler
  1 sinama gecit-yankisi                          obek 2
      adres-yok, arayuz-kapali
      ag-gecidi-yanlis, buyuk-paket-dusuyor, cozumleyici-sessiz, guvenlik-duvari-dusuruyor, rota-eksik, servis-dinlemiyor
  2 sinama gecit-yankisi+uzak-yanki               obek 3
      adres-yok, arayuz-kapali
      ag-gecidi-yanlis, rota-eksik
      buyuk-paket-dusuyor, cozumleyici-sessiz, guvenlik-duvari-dusuruyor, servis-dinlemiyor
  3 sinama gecit-yankisi+uzak-yanki+rota          obek 2
      adres-yok, arayuz-kapali
      buyuk-paket-dusuyor, cozumleyici-sessiz, guvenlik-duvari-dusuruyor, servis-dinlemiyor

aday kumesi supurmesi (rota sinamasi)
  temel            8 ayri yanit 3  en kotu kalan 5  'varsayilan-yok' kalan 1  elenen 7
  +adres-yanlis    9 ayri yanit 3  en kotu kalan 5  'varsayilan-yok' kalan 2  elenen 7
  -ag-gecidi-yanlis 7 ayri yanit 3  en kotu kalan 4  'varsayilan-yok' kalan 1  elenen 6
```

Üç sayı yan yana. **Kâhin:** bu turda gerçek arıza `ag-gecidi-yanlis`; varsayılan satır
yerinde duruyor ve işaret ettiği düğüm paketi iletmiyor. **Sınama:** yönlendirme tablosu
okunuyor ve yanıtı **tam** — üç ayrı yanıttan biri. **Elenen aday:** yalnız **üç**; geriye
**beş aday** kalıyor.

Aynı sınama başka bir kâhinle bambaşka bir sonuç veriyor. Gerçek arıza `rota-eksik` olsaydı
yanıt **varsayilan-yok** olacak, **yedi aday** elenecek ve tek aday kalacaktı. Yanıt
**tablo-bos** olsaydı altı aday elenecekti. Arayüz listesindeki asimetri burada da var ve
yönü aynı: sınama, tablodaki **boşluğu** görmekte kesin, tablodaki **yanlışı** görmekte
neredeyse kör. Bunun nedeni tablonun bir doğruluk kaydı değil, bir **niyet** kaydı olmasıdır.
Satır, paketin nereye gönderileceğini söyler; oraya varıp varmadığını söylemez.

Bu ayrım tabloyu okurken doğrudan işe yarar. Varsayılan satırın **varlığı** doğrulanabilir bir
olgudur ve tablodan bakılarak kesin biçimde yanıtlanır. Satırdaki adresin **doğruluğu**
doğrulanabilir bir olgu değildir; o adresin gerçekten bir yönlendirici olup olmadığı, paketi
iletip iletmediği ve iletirken hedefe giden bir yolu bulunup bulunmadığı tablonun bilgisi
dışındadır. Tablo bu bakımdan bir dosya sistemi girdisine benzer: girdinin var olması,
gösterdiği yerin doğru olduğunu göstermez. Depolama kursunda kalıcı takma girdisi kâğıt
üzerinde doğruyken yanlış aygıtı takıyordu; buradaki varsayılan satır da kâğıt üzerinde
doğruyken paketi hiçbir yere iletmeyen bir adresi gösterebilir.

#### İki Adayın Ayrılamaması

İkinci tablo, `ag-gecidi-yanlis` ile `rota-eksik` çiftinin neden zor bir çift olduğunu
gösteriyor. Yankı göndermek bu iki adayı ayırmanın en doğal yolu gibi görünür ve iki ayrı
yankı sınaması yapılabilir: biri yerel ağ geçidine, öteki uzak bir adrese.

- **AY13** — Ağ geçidi yankısı yalnız arayüzün açık ve adresli olmasına bağlıdır; yerel ağ
  bağlı rota üzerinden erişilir ve varsayılan satır bu sınamaya karışmaz.
- **AY14** — Uzak yankı, arayüzün, adresin, ağ geçidinin ve rotanın **dördünün birden** doğru
  olmasını gerektirir. Bu sınama ad çözümleme devrede olmadan, doğrudan adresle yapılır.
- **AY15** — Yankının kendisinin engellenmediği varsayılır; yankı yanıtının filtrelendiği
  durum bu konunun değil, güvenlik duvarı derslerinin sorunudur.

Tek yankı sınamasıyla bakıldığında sekiz aday **iki öbeğe** düşüyor ve büyük öbek altı aday
taşıyor. İkinci yankı eklendiğinde öbek sayısı **üçe** çıkıyor: sınama gerçekten iş görüyor,
altılı öbeği ikiye bölüyor. Ama böldüğü yer beklenen yer değil. `ag-gecidi-yanlis` ile
`rota-eksik` **yeni öbekte birlikte** kalıyor, çünkü ikisi de aynı deseni üretiyor: ağ geçidi
yankısı yanıt veriyor, uzak yankı vermiyor. İki sınama, iki bekleme süresi ve iki ayrı çıktı
harcandı; bu çift **hâlâ ayrılmadı**.

Bu sonucun nedeni sınamaların zayıflığı değil, **bağımlılık zincirinin biçimidir**. Uzak
yankının başarılı olması için dört alanın birden doğru olması gerekiyor; alanlardan herhangi
biri bozulduğunda yanıt aynı yanıttır. Bir sınama kaç alana bağlıysa, olumsuz yanıtı o kadar
çok adaya birden uyar. Bağlantı zincirinin ucuna yaklaştıkça sınamalar güçlenmez, tam tersine
**ayırt etme yetenekleri düşer**; kazandıkları şey kapsamdır. Uzak yankı bir adımda dört alanı
birden sınar ve bu yüzden "her şey yolunda" demek için iyi, "sorun şurada" demek için kötü
bir araçtır.

Ayrımı yapan şey üçüncü sınamadır ve o sınama hiç paket göndermez. Tablo okunduğunda
`rota-eksik` adayı **varsayilan-yok** yanıtını, `ag-gecidi-yanlis` adayı **tam** yanıtını
verir; öbek dağılır ve ayırt edilemeyen öbek sayısı üçten **ikiye** düşer. Kursun ikinci
iddiası burada ilk kez ödeniyor: **daha çok çıktı daha iyi tanı demek değildir.** Yerel bir
dosyayı okumak, iki uzak sınamanın yapamadığı ayrımı tek adımda yapıyor.

#### Kaynak Adres Seçimi ve Tek Yönlü Arıza

Tablonun görünmeyen bir çıktısı daha vardır. Paket üretilirken kaynak adresi de seçilir ve
seçimi yapan, uygulama değil yönlendirmedir: kullanılacak satır belirlendikten sonra o satırın
çıkış arayüzüne bağlı adreslerden biri kaynak olarak yazılır. Karar sorgusunun son alanı bu
seçimi gösterir; tablo dökümünde ise ancak bağlı rotanın kaynak alanından dolaylı olarak
okunur.

Bu seçim yanlış olduğunda ortaya çıkan arıza kalıbı özeldir. Paket hedefe ulaşır, hedef yanıtı
üretir ve yanıtı kaynak olarak yazılmış adrese gönderir; o adres dönüş yolunda bilinmiyorsa
yanıt kaybolur. Yerel makinede görülen şey "yanıt yok"tur ve bu, ağ geçidinin yanlış olmasıyla
üretilen görüntünün aynısıdır. İki arayüzlü bir sunucuda bu kalıp sık kurulur: giden trafik
bir arayüzden çıkar, dönüş trafiği ötekine yönlendirilir ve hiçbir tablo satırı yanlış
görünmez. Arızanın ayırt edici imzası, aynı hedefe iki farklı kaynak adresle yapılan iki
denemenin farklı sonuç vermesidir; tek bir denemeyle bu imza görülmez, çünkü yanıtsızlık her
iki durumda da aynı yanıtsızlıktır.

- **AY16** — Ortak tanımda kaynak adres seçimi ayrı bir alan olarak tutulmuyor; tek arayüzlü
  kurgu sunucuda bu seçim belirsizlik taşımaz. Çok arayüzlü durum modelin dışındadır ve
  yukarıdaki kalıp modelin değil, okumanın bir uyarısıdır.

#### Rota Eklemek ve Geri Almak

Rota eklemenin de iki biçimi vardır ve fark adres atamadakiyle aynıdır: çalışma zamanına
yazılan rota yeniden başlatmada kaybolur, yapılandırmaya yazılan rota önyüklemede geri gelir.
Tanı sırasında elle eklenen bir rota sorunu çözdüğünde iş bitmiş sayılmaz; aynı satır kalıcı
yapılandırmaya da geçmelidir.

Aynı hedefe iki satır yazıldığında hangisinin kullanılacağını önek uzunluğu belirler; önekler
de eşitse satırlara verilen ölçüt sayısı belirler ve küçük olan seçilir. Bu, tanıda sık
karşılaşılan bir belirsizlik kaynağıdır: iki ayrı kaynaktan — elle verilmiş bir satır ile
adres yapılandırmasının kendiliğinden eklediği bir satır — aynı hedefe iki varsayılan satır
girebilir ve tablo dökümü ikisini de gösterir. Döküme bakan kişi iki satırı da doğru sayar;
kullanılan yalnız biridir. Karar sorgusu bu belirsizliği ortadan kaldırır, çünkü tablonun
tamamını değil, **verilen kararı** yazdırır.

Varsayılan satırı değiştiren ya da silen işlemler ayrı bir sınıftır. Uzaktan yönetilen bir
makinede varsayılan ağ geçidini değiştirmek, komutu yazan oturumun kendisini kesebilir ve
komut geri dönmediği için düzeltme de yapılamaz. Bu ders o komut dizisini **çalıştırılabilir
tam biçimde vermez.** Önleyen yol üç adımdır ve üçü de bu kursta tekrar edilecektir:
değişikliği önce **kuru çalışma** ile yazdırmak, değişikliği bir **zamanlayıcıyla geri alma**
görevinin arkasına koymak ve yönetim erişimini değişiklikten **etkilenmeyen ayrı bir kanaldan**
sağlamak.

#### Aday Kümesi Süpürmesi

Üçüncü tablo aday listesini iki yönde sarsıyor.

- **AY17** — Eklenen aday `adres-yanlis-alt-ag`, adresin yanlış alt ağdan verildiği durumdur;
  bu durumda ağ geçidi erişilemez olur ve varsayılan satır kurulamaz, yani iki alan birden
  bozulur.
- **AY18** — Çıkarılan aday `ag-gecidi-yanlis`, tablo okumasının en zayıf kaldığı adaydır.

Aday eklendiğinde ayrı yanıt sayısı üçte, en kötü kalan beşte sabit kalıyor. Değişen şey yine
**kesin sanılan yanıttır**: `varsayilan-yok` yanıtı dokuz adaydan yedisini eliyor ama geriye
bir değil **iki** aday bırakıyor. Yani "varsayılan satır yok" okuması artık tanı değil, iki
adaya inmiş bir daraltmadır. Aday çıkarıldığında ise en kötü kalan beşten **dörde** iniyor ve
`varsayilan-yok` yanıtının elediği aday yediden **altıya**. Sınama aynı sınamadır; değişen
yalnız listedir.

Bu iki satır, eleme sayılarını mutlak bir ölçüt saymanın neden yanlış olduğunu gösteriyor.
Rota okumasının "en kötü durumda beş aday bırakan" bir sınama olması, sekiz adaylık listeye
bağlı bir sayıdır. Liste büyüdükçe sınamanın tavanı yükselir, liste daraldıkça düşer; sabit
kalan tek şey sınamanın **hangi alanı gördüğüdür**. Sınamaları bu değişmez özelliğe göre
sıralamak, eleme sayılarına göre sıralamaktan daha dayanıklı bir alışkanlıktır: rota okuması
her zaman rota alanını görür, aday listesi ne olursa olsun.

#### Özet

- Yönlendirme tablosu bir niyet kaydıdır: paketin nereye gönderileceğini söyler, oraya
  vardığını söylemez. Satır seçimi en uzun eşleşen önek kuralına göre yapılır ve varsayılan
  ağ geçidi en kısa öneke sahip satırdır.
- Rota sınaması **üç ayrı yanıt** verir ve en kötü durumda **beş aday** bırakır: `tam`
  yanıtında yalnız **üç** aday elenir, `varsayilan-yok` yanıtında **yedi**, `tablo-bos`
  yanıtında **altı**. Sınama tablodaki boşluğu görür, tablodaki yanlışı görmez.
- `ag-gecidi-yanlis` ile `rota-eksik` çifti **iki yankı sınamasına kadar ayrılamıyor**: her
  ikisi de yerel yankıya yanıt verip uzak yankıya vermiyor. Ayırt edilemeyen öbek sayısı iki
  sınamada üç, tablo okuması eklendiğinde ikidir.
- Ayrımı hiç paket göndermeyen yerel bir okuma yapıyor; daha çok çıktı üreten iki uzak sınama
  yapamıyor.
- Süpürme, eleme sayısının aday listesine bağlı olduğunu gösteriyor: dokuzuncu aday
  eklendiğinde `varsayilan-yok` yanıtı iki aday bırakıyor, `ag-gecidi-yanlis` çıkarıldığında
  en kötü kalan beşten dörde iniyor.

#### Sonraki Adım

Tablo okuması, `tam` yanıtı verdiğinde geriye kalan beş adayın dördü artık paketin yoluyla
değil, **ne istendiğiyle** ilgilidir: hedefin adı çözülemiyor olabilir, servis dinlemiyor
olabilir, güvenlik duvarı düşürüyor olabilir ya da büyük paket yolda kayboluyor olabilir. Bir
sonraki ders bu dörtlünün ilkine bakar ve çözücü yapılandırmasını okur. Orada ölçülecek
sayı kursun en küçük sayılarından biridir: ad çözümleme sınaması, beklenen yanıtı verdiğinde
sekiz adaydan **yalnız birini** eler. Bu kadar zayıf bir sınamanın neden yine de yapıldığı,
o dersin asıl sorusudur.

### Ad Çözümleme

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/ad-cozumleme

Ad çözümleme sınaması beklenen yanıtı verdiğinde sekiz adaydan yalnız birini eliyor; başarısız olduğunda yedisini eliyor ve bu asimetri, kursun en zayıf sınamasının neden yine de yapıldığını açıklıyor.

Yönlendirme tablosu beklenen yanıtı verdiğinde — `tam` — geriye beş aday kalıyordu. Bunların
dördü artık paketin yoluyla değil, **ne istendiğiyle** ilgili: hedefin adı çözülemiyor olabilir,
servis dinlemiyor olabilir, güvenlik duvarı düşürüyor olabilir ya da büyük paket yolda
kayboluyor olabilir. Bu ders dörtlünün ilkine bakar.

Ölçülecek sayı kursun en küçük sayılarından biridir ve dersin asıl sorusu bu küçüklüğün ne
anlama geldiğidir: bir sınama beklenen yanıtı verdiğinde sekiz adaydan **yalnız birini**
eliyorsa, o sınama neden yine de yapılır.

#### Çözücü Neyi Yapılandırır

Ad çözümleme, bir adın bir adrese dönüştürülmesidir ve bu iş tek bir yerde yapılmaz. Sorgu
önce **ad hizmeti sırasına** çarpar: sistem, hangi kaynağın hangi sırayla deneneceğini bir
yapılandırma dosyasından okur. Sıradaki ilk kaynak genellikle yerel bir konak dosyasıdır;
ondan sonra yerel bir önbellek ya da saplama çözücü gelir; en sonda ağdaki çözücüye
gönderilen sorgu vardır. Bir ad yerel dosyada bulunduğunda ağa hiç çıkılmaz ve ağdaki
çözücünün verdiği yanıt hiç görülmez.

```text
# örnek döküm — çalıştırılmamıştır
$ cat /etc/resolv.conf
nameserver 192.0.2.53
search ornek
options timeout:2 attempts:2
```

Yapılandırmanın üç alanı üç ayrı davranış belirler. **Çözücü adresi** sorgunun nereye
gideceğini söyler; birden çok yazıldığında ilki denenir ve yalnız yanıt gelmediğinde sıradaki
denenir. **Arama alanı**, nokta içermeyen bir ada eklenecek son eki verir; kısa adla yapılan
sorgu ile tam adla yapılan sorgu bu yüzden farklı sonuçlar üretebilir. **Zaman aşımı ve deneme
sayısı** ise arızanın ne kadar sürede görüneceğini belirler: iki saniyelik zaman aşımı ve iki
deneme, sessiz bir çözücüde her sorguyu dört saniye bekletir ve uygulama katmanında bu,
ad çözümleme arızası olarak değil **yavaşlık** olarak görünür.

```text
# örnek döküm — çalıştırılmamıştır
$ getent ahosts kayit-deposu.ornek
198.51.100.42  STREAM kayit-deposu.ornek
198.51.100.42  DGRAM
198.51.100.42  RAW
```

Sorgu aracı seçimi de sonucu değiştirir. Doğrudan çözücüye soru soran araçlar ad hizmeti
sırasını **atlar** ve yalnız ağdaki çözücüyü sınar; sistemin gerçekte kullandığı yolu
sınamak için sıranın tamamından geçen bir araç gerekir. Bu ayrım tanıda somut bir sonuç
üretir: bir sorgu aracıyla ad çözülüyor, uygulama çözemiyor olabilir ya da tersi.

Adların ağ üzerinde nasıl çözüldüğü, sorgu ile yanıtın hangi kayıt türlerini taşıdığı ve
yetkili sunucu hiyerarşisinin nasıl işlediği Bilgisayar Ağları müfredatının konusudur; burada
protokol kurulmaz, yalnız **bu makinenin çözücü yapılandırması** okunur.

- **AY19** — Kurgu sunucuda ad hizmeti sırası iki kaynaktan oluşur: yerel konak dosyası ve
  ağdaki tek bir çözücü. Konak dosyasında aranan ad bulunmadığı varsayılır.
- **AY20** — `cozumleyici-sessiz` adayı, çözücünün sorguya hiç yanıt vermemesidir. Yanlış
  yanıt veren çözücü ayrı bir adaydır ve temel listede yoktur; süpürmede eklenir.
  Çözücünün kendisine giden yolun sağlam olduğu, tek arıza varsayımının gereği olarak
  kabul edilir.

#### Sıranın Kendisi Bir Arıza Kaynağıdır

Ad hizmeti sırası tanıda iki ayrı tuzak üretir ve ikisi de sık görülür.

Birincisi **yerel girdinin üstünlüğüdür**. Konak dosyasına yazılmış bir satır, ağdaki
çözücünün ne söylediğinden bağımsız olarak kazanır. Bir taşıma sırasında geçici olarak
eklenen bir satır yerinde unutulduğunda, sistem aylarca eski adrese bağlanır ve ağdaki kayıt
düzeltilmiş olduğu için hiçbir sorgu aracı arızayı göstermez — sorgu aracı sırayı atlıyorsa
doğru adresi döndürür, uygulama ise yanlış adrese gider. Ayrımı yapan tek okuma, sıradan geçen
bir sorgudur.

İkincisi **arama alanının sessiz genişlemesidir**. Nokta içermeyen bir ad sorulduğunda sisteme
tanımlı son ek eklenir ve sorgu farklı bir ada dönüşür. Aynı kısa ad iki makinede iki farklı
tam ada açılabilir, çünkü arama alanları farklıdır. Bu yüzden bir sınama sonucunun başka bir
makineye taşınması güvenilir değildir: sınanan ad, yazılan ad değildir. Yapılandırma
dosyalarında tam adın yazılması bu belirsizliği kaynağında kapatır.

Üçüncü bir davranış arıza değildir ama arızayı gizler: sıradaki bir kaynak yanıt vermediğinde
sorgu bir sonrakine düşer. Düşme sessizdir ve yalnız **süre** olarak görünür. Zaman aşımı iki
saniye, deneme sayısı iki olan bir yapılandırmada sessiz bir çözücü her sorguya dört
saniye ekler; uygulama günlüğünde bunun karşılığı bir hata değil, gecikmedir. Sistem Yönetimi
kursundaki kalıp burada da geçerli: **görünen belirti ile gerçek arıza farklı katmanlarda
durur.**

#### Sınamanın Ölçüsü: Bir Aday

```python
"""Ad cozumleme sinamasi: ayni sekiz aday nedene karsi kac aday eleniyor
ve onceki derslerin sinama kumesine eklendiginde kac aday AYRILIYOR."""
SAGLAM = {"arayuz_acik": True, "adres_var": True, "ag_gecidi_dogru": True,
          "rota_var": True, "cozumleyici_yanit": True, "servis_dinliyor": True,
          "guvenlik_duvari_gecirir": True, "yol_bozulmadan": True}
ARIZA = {
    "arayuz-kapali":      {"arayuz_acik": False, "adres_var": False},
    "adres-yok":          {"adres_var": False},
    "ag-gecidi-yanlis":   {"ag_gecidi_dogru": False},
    "rota-eksik":         {"rota_var": False},
    "cozumleyici-sessiz": {"cozumleyici_yanit": False},
    "servis-dinlemiyor":  {"servis_dinliyor": False},
    "guvenlik-duvari-dusuruyor": {"guvenlik_duvari_gecirir": False},
    "buyuk-paket-dusuyor": {"yol_bozulmadan": False},
}


def durum(ariza, tablo):
    d = dict(SAGLAM)
    d.update(tablo[ariza])
    return d


def s_rota(d):
    if not d["adres_var"]:
        return "tablo-bos"
    return "tam" if d["rota_var"] else "varsayilan-yok"


def s_gecit_yankisi(d):
    return "yanit" if d["arayuz_acik"] and d["adres_var"] else "yanit-yok"


def s_uzak_yanki(d):
    return "yanit" if (d["arayuz_acik"] and d["adres_var"]
                       and d["ag_gecidi_dogru"] and d["rota_var"]) else "yanit-yok"


def s_ad_cozumleme(d):
    return "cozuldu" if d["cozumleyici_yanit"] else "cozulemedi"


SINAMA = {"rota": s_rota, "gecit-yankisi": s_gecit_yankisi,
          "uzak-yanki": s_uzak_yanki, "ad-cozumleme": s_ad_cozumleme}


def obekle(sinamalar, tablo=ARIZA):
    o = {}
    for a in tablo:
        anahtar = tuple(SINAMA[s](durum(a, tablo)) for s in sinamalar)
        o.setdefault(anahtar, []).append(a)
    return o


print("ad cozumleme sinamasi: yanit basina aday")
for yanit, kume in obekle(["ad-cozumleme"]).items():
    print(f"  {yanit[0]:11s} kalan {len(kume):2d}  elenen {len(ARIZA) - len(kume):2d}"
          f"  {', '.join(kume)}")
print()
ONCEKI = ["gecit-yankisi", "uzak-yanki", "rota"]
print("onceki derslerin kumesine eklenince")
for kume in (ONCEKI, ONCEKI + ["ad-cozumleme"]):
    ayrilmayan = [sorted(v) for v in obekle(kume).values() if len(v) > 1]
    kapsanan = sum(len(o) for o in ayrilmayan)
    print(f"  {len(kume)} sinama  obek {len(ayrilmayan)}  ayrilmayan aday {kapsanan}")
    for o in ayrilmayan:
        print(f"      {', '.join(o)}")
print()
print("aday kumesi supurmesi (ad cozumleme sinamasi)")
EK = dict(ARIZA, **{"cozumleyici-yanlis-kayit": {"cozumleyici_yanit": False}})
EKSIK = {k: v for k, v in ARIZA.items() if k != "cozumleyici-sessiz"}
for ad, tablo in (("temel               8", ARIZA),
                  ("+yanlis-kayit       9", EK),
                  ("-cozumleyici-sessiz 7", EKSIK)):
    o = obekle(["ad-cozumleme"], tablo)
    satir = "  ".join(f"{y[0]}: elenen {len(tablo) - len(k):2d} kalan {len(k):2d}"
                      for y, k in sorted(o.items()))
    print(f"  {ad:21s} ayri yanit {len(o)}   {satir}")
```

```
ad cozumleme sinamasi: yanit basina aday
  cozuldu     kalan  7  elenen  1  arayuz-kapali, adres-yok, ag-gecidi-yanlis, rota-eksik, servis-dinlemiyor, guvenlik-duvari-dusuruyor, buyuk-paket-dusuyor
  cozulemedi  kalan  1  elenen  7  cozumleyici-sessiz

onceki derslerin kumesine eklenince
  3 sinama  obek 2  ayrilmayan aday 6
      adres-yok, arayuz-kapali
      buyuk-paket-dusuyor, cozumleyici-sessiz, guvenlik-duvari-dusuruyor, servis-dinlemiyor
  4 sinama  obek 2  ayrilmayan aday 5
      adres-yok, arayuz-kapali
      buyuk-paket-dusuyor, guvenlik-duvari-dusuruyor, servis-dinlemiyor

aday kumesi supurmesi (ad cozumleme sinamasi)
  temel               8 ayri yanit 2   cozuldu: elenen  1 kalan  7  cozulemedi: elenen  7 kalan  1
  +yanlis-kayit       9 ayri yanit 2   cozuldu: elenen  2 kalan  7  cozulemedi: elenen  7 kalan  2
  -cozumleyici-sessiz 7 ayri yanit 1   cozuldu: elenen  0 kalan  7
```

Üç sayı yan yana. **Kâhin:** bu turda gerçek arıza `cozumleyici-sessiz` değil; kurgu sunucuda
başka bir alan bozuk ve çözücü çalışıyor. **Sınama:** ad sorgusu yapılıyor ve yanıtı
`cozuldu`. **Elenen aday:** **bir**; geriye **yedi aday** kalıyor. Bu, kursun ölçtüğü sekiz
sınama içindeki en düşük değerlerden biridir; yalnız dinleyen soket listesi aynı
sayıyı verir.

#### Zayıf Sınamanın Değeri

Ad çözümleme sınaması iki yanıt üretir ve iki yanıt arasındaki uçurum kursun en büyüğüdür:
`cozuldu` bir aday eler, `cozulemedi` yedi aday eler. Aynı komut, aynı süre, aynı çaba; taşıdığı
bilgi yedi katı fark ediyor. Sınamanın değeri sınamada değil, **hangi yanıtı verdiğindedir.**

Bu asimetrinin pratik okuması iki maddedir. Birincisi: ad çözümleme başarısız olduğunda tanı
biter. Yedi aday elenir, tek aday kalır ve düzeltilecek şey bellidir. İkincisi: ad çözümleme
başarılı olduğunda hiçbir şey öğrenilmemiş gibi durur, oysa öğrenilen bir şey vardır — bir
**karıştırıcı** ortadan kalkmıştır. Ad üzerinden yapılan her sınama iki soruyu birden sorar:
ad çözülüyor mu ve hedef erişilebilir mi. Çözümleme ayrı olarak doğrulanmadan yapılan bir
bağlantı denemesinin başarısızlığı bu iki sorunun hangisine ait olduğunu göstermez. Ad
çözümleme sınaması, sonraki bütün sınamaların **anlamını sabitler**.

İkinci tablo bu katkıyı sayıya çeviriyor. Önceki dersin sınama kümesi — yerel yankı, uzak
yankı ve tablo okuması — sekiz adayı iki öbekte ayrılamaz bırakıyordu ve bu öbeklerde toplam
**altı aday** vardı. Ad çözümleme eklendiğinde öbek sayısı ikide kalıyor, ayrılamayan aday
sayısı **beşe** iniyor. Yani sınamanın katkısı tam olarak **bir adaydır** ve o bir aday,
kendisinden başka hiçbir sınamanın ayıramadığı adaydır. Dört sınamanın hiçbiri
`cozumleyici-sessiz` adayını dokunmadan ayıramaz, çünkü çözücü sessizken paketler yolda
sorunsuz akmaya devam eder.

Bu, sınamaları eleme gücüne göre sıralamanın neden yeterli olmadığını gösteriyor. Bir sınamanın
tek başına kaç aday elediği ile bir kümeye eklendiğinde kaç aday **ayırdığı** ayrı ölçülerdir
ve ikisi aynı yönde hareket etmez. Güçlü bir sınama, kendisinden önce yapılan sınamaların
zaten ayırdığı adayları elediğinde hiçbir katkı üretmez; zayıf bir sınama, başka hiçbir aracın
göremediği tek alana baktığında yeri doldurulamaz olur. Ad çözümleme ikinci türdendir. Tanı
sırası kurulurken sorulacak soru "bu sınama kaç aday eler" değil, "bu sınama **başkasının
göremediği** kaç adayı ayırır" olmalıdır.

#### Adın Çözülmesi Erişilebilirlik Değildir

Çözümleme başarılı olduğunda dönen şey bir adrestir ve adresin doğru olduğu bilgisi değildir.
Kayıt eski olabilir, hedef başka bir adrese taşınmış olabilir, yanıt bir önbellekten geliyor
olabilir. Önbellek burada ikili bir rol oynar. Olumlu yanıt, kayda yazılmış yaşam süresi
boyunca saklanır ve o süre dolana kadar değişiklik görülmez; olumsuz yanıt da saklanabilir ve
düzeltilmiş bir kayıt beklenenden geç görünür. İki durumda da sınamanın gördüğü şey ağın
şimdiki durumu değil, **geçmişte bir anın** durumudur.

Bir ad birden çok adrese de çözülebilir ve dönen liste birden çok adres ailesi taşıyabilir.
Bu durumda hangi adrese bağlanılacağını seçen, çözücü değil bağlantıyı kuran taraftır ve
seçim sırası sistemin yapılandırmasına bağlıdır. Ortaya çıkan arıza kalıbı tanıda yanıltıcıdır:
ad doğru çözülür, listedeki ilk adrese giden yol bozuktur, ikinci adrese giden yol çalışır ve
sonuç denemeden denemeye değişir. Aynı komut arka arkaya iki kez çalıştırıldığında iki farklı
sonuç veriyorsa, ilk bakılacak yer çözümlemenin döndürdüğü **liste**dir; tek satırlık bir yanıt
gösteren araç bu listeyi gizler.

- **AY21** — Ortak tanımda önbellek yoktur; çözücü ya yanıt verir ya vermez. Yaşam süresi
  ve olumsuz önbellek modelin dışındadır ve buradaki uyarı ölçümün değil, okumanın parçasıdır.
- **AY22** — Ad çözümleme sınaması, sonucu adresle yapılan sınamalardan bağımsız kabul edilir;
  çözücüye giden yolun kendisinin bozulduğu birleşik durum tek arıza varsayımı gereği
  dışarıdadır.

Buradan çıkan çalışma alışkanlığı tek cümledir: **önce adresle, sonra adla sınanır.** Adresle
yapılan bir deneme başarılı, adla yapılan aynı deneme başarısızsa arıza çözümlemededir ve
başka hiçbir sınamaya gerek yoktur. İkisi de başarısızsa çözümleme aday olmaktan çıkar ve
sorun aşağıdaki katmanlardadır. Sıra tersine çevrildiğinde — önce adla denenip başarısızlık
görüldüğünde — elde edilen yanıt iki adayı birden kapsar ve ayrım için ikinci bir sınama
gerekir. Aynı iki komut, farklı sırayla, farklı sayıda aday eliyor.

#### Aday Kümesi Süpürmesi

Üçüncü tablo aday listesini yine iki yönde sarsıyor ve bu derste sonuçlardan biri kursun en
keskinidir.

- **AY23** — Eklenen aday `cozumleyici-yanlis-kayit`, çözücünün yanıt verdiği ama yanlış
  adres döndürdüğü durumdur. Modelde bu, çözümlemenin beklenen sonucu vermemesi olarak temsil
  edilir ve `cozumleyici-sessiz` ile aynı yanıtı üretir.
- **AY24** — Çıkarılan aday `cozumleyici-sessiz`, sınamanın olumsuz yanıtını tek başına dolduran
  adaydır.

Aday eklendiğinde `cozuldu` yanıtının elediği aday birden **ikiye** çıkıyor; sınama iki katı iş
görüyor ve bunu kendi tanımında hiçbir şey değişmeden yapıyor. `cozulemedi` yanıtı ise yine
yedi aday eliyor ama artık geriye bir değil **iki** aday bırakıyor: sessiz çözücü ile
yanlış yanıt veren çözücü bu sınamayla ayrılamaz. Ayrımı yapan şey yanıtın **içeriğine**
bakmaktır, varlığına değil.

Aday çıkarıldığında sonuç daha sert. Yedi adaylık listede sınamanın verebileceği yanıt
sayısı **bire** düşüyor ve elenen aday **sıfır** oluyor. Sınama hâlâ çalışıyor, hâlâ bir yanıt
üretiyor, hâlâ zaman harcıyor — ve hiçbir aday elemiyor. Bu, kursun kuralının en açık
gösterimidir: **bir sınamanın ürettiği çıktı ile taşıdığı bilgi ayrı şeylerdir.** Aday
listesinde karşılığı bulunmayan bir sınama, çıktısı ne kadar zengin olursa olsun ölçülmemiş
değil, **değersizdir**. Bunun tanıdaki karşılığı, alışkanlıkla yapılan sınamaların düzenli
olarak gözden geçirilmesidir: bir sınama listeye hangi adayı ayırmak için girdiyse, o aday
listeden düştüğünde sınama da düşmelidir.

#### Özet

- Ad çözümleme tek bir yerde yapılmaz: sorgu ad hizmeti sırasından geçer, yerel konak dosyası
  ve önbellek ağa çıkmadan yanıt üretebilir; doğrudan çözücüye soran araçlar bu sırayı
  atlar ve sistemin gerçekte kullandığı yolu sınamaz.
- Ad çözümleme sınaması **iki yanıt** verir ve aralarındaki fark kursun en büyüğüdür:
  `cozuldu` yalnız **bir** aday eler ve geriye **yedi aday** bırakır, `cozulemedi` **yedi**
  aday eler ve tanıyı bitirir.
- Sınamanın beklenen yanıttaki katkısı bir karıştırıcı değişkeni kaldırmaktır: önceki üç sınamanın
  ayıramadığı altı adaydan tam **birini** ayırır ve ayrılamayan aday sayısını altıdan beşe
  indirir. O adayı başka hiçbir sınama ayıramaz.
- Adın çözülmesi hedefin erişilebilir olması demek değildir; önbellek ve yaşam süresi
  nedeniyle dönen yanıt geçmişte bir anın durumu olabilir. Çalışma kuralı önce adresle, sonra
  adla sınamaktır.
- Süpürme iki sonuç veriyor: yanlış yanıt veren çözücü eklendiğinde `cozuldu` yanıtı iki
  aday elemeye başlıyor; `cozumleyici-sessiz` çıkarıldığında sınamanın yanıt sayısı bire ve
  elediği aday **sıfıra** düşüyor. Aday listesinde karşılığı olmayan sınama değersizdir.

#### Sonraki Adım

Ad çözümleme de doğrulandığında geriye üç aday kalıyor: servis dinlemiyor olabilir, güvenlik
duvarı paketi düşürüyor olabilir ya da büyük paket yolda kayboluyor olabilir. Üçü de sunucunun
kendi üzerinde bakılabilecek bir yer bırakıyor gibi görünür — dinleyen soketlerin
listesi. Bir sonraki ders bu listeyi çıkarır ve iki sayıyı yan yana koyar: yerel envanter
sekiz adaydan **bir** tanesini eler, dışarıdan yapılan tek bir bağlantı denemesi **yedi**
tanesini. Aynı arıza, aynı an, iki sınama arasında yedi katı fark. O dersin sorusu bu farkın
nereden geldiğidir: dinleyen listesi tek bir alanı görürken bağlantı denemesi dört ayrı sonucu
birbirinden ayırır.

### Bağlantı Noktaları ve Dinleyen Servisler

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/baglanti-noktalari-ve-dinleyen-servisler

Yerel dinleyen listesi sekiz aday nedenden yalnız birini eliyor; dışarıdan yapılan tek bir bağlantı denemesi aynı anda yedisini eliyor ve sekiz arıza üzerinden toplam 14'e karşı 42 aday eliyor.

Ad çözümleme de doğrulandığında geriye üç aday kalıyordu: servis dinlemiyor olabilir, güvenlik
duvarı paketi düşürüyor olabilir ya da büyük paket yolda kayboluyor olabilir. Üçü de sunucunun
kendi üzerinde bakılabilecek bir yer bırakıyor gibi görünür — dinleyen soketlerin
listesi. Liste yereldir, hızlıdır, ayrıntılıdır ve doğrudan sorunun geçtiği yere bakar.

Bu ders o listeyi çıkarır ve yanına ikinci bir sınama koyar: dışarıdan yapılan tek bir bağlantı
denemesi. İki sınama aynı anda, aynı arızaya karşı ölçülür ve aradaki fark kursun en büyük
farklarından biridir.

#### Dinleyen Bağlantı Noktası Nedir

Bir servis bir bağlantı noktasını dinlemeye başladığında çekirdekte bir kayıt oluşur: hangi
adres ve bağlantı noktası çiftinin gelen istekleri kabul edeceği. Yerel envanter bu kayıtları
listeler. Listenin en önemli sütunu bağlantı noktası numarası değil, **bağlanma adresidir**.

```text
# örnek döküm — çalıştırılmamıştır
$ ss -ltn
State   Recv-Q  Send-Q  Local Address:Port   Peer Address:Port
LISTEN  0       128     0.0.0.0:9443         0.0.0.0:*
LISTEN  0       128     127.0.0.1:7070       0.0.0.0:*
```

İki satır aynı biçimdedir ve iki farklı gerçeği anlatır. Birincisi bütün arayüzlerden gelen
istekleri kabul eder; ikincisi yalnız geri döngü arayüzünden, yani makinenin kendisinden gelen
istekleri kabul eder. Dışarıdan bakıldığında ikinci satırın karşılığı **hiç dinlemeyen** bir
bağlantı noktasıdır. Envanterde iki satır da "LISTEN" yazar.

Süreç sütunu ayrı bir okumadır ve yetki gerektirir: yetkisiz çalıştırılan listeleme aracı
bağlantı noktalarını gösterir, hangi sürecin dinlediğini göstermez. Bu, tanıda bir adım
kaybettirir — hangi bağlantı noktasının açık olduğu bilinir, hangi birimin açtığı bilinmez.

Bağlantı noktası numaralarının nasıl atandığı, hangi aralıkların geçici bağlantı noktalarına
ayrıldığı ve taşıma katmanının bağlantı kurma davranışı Bilgisayar Ağları müfredatının
konusudur; burada protokol kurulmaz, yalnız **bu makinenin envanteri** okunur.

- **AY25** — Kurgu sunucuda `veri-alma` birimi bütün arayüzlerden dinler; ikinci bir yerel
  yönetim ucu yalnız geri döngüden dinler ve dışarıya hiç açılmaz.
- **AY26** — Ortak tanımda dinleyen listesi ile bağlantı denemesi **aynı alana** bağlıdır:
  servis dinliyorsa liste de bunu gösterir, bağlantı da kurulur. Yalnız geri döngüye bağlanmış
  bir servis — listede dinliyor görünüp dışarıdan reddedilen durum — modelin **dışındadır**
  ve yukarıdaki uyarı ölçümün değil, okumanın parçasıdır.

#### Listeyi Okurken Karışan Üç Şey

Envanter üç ayrı kavramı tek tabloda toplar ve üçü de "dinliyor" sözcüğüyle anlatıldığı için
birbirine karışır.

Birincisi **bağlantı yönelimli olmayan bağlantı noktalarıdır**. Bağlantı kuran taşıma
biçiminde bir bağlantı noktası açıkça dinleme durumuna geçer ve listede öyle görünür; bağlantı
kurmayan biçimde böyle bir durum yoktur, yalnız bir bağlantı noktasının bağlanmış olduğu
görülür. İki tür aynı listede yan yana durur ve aynı sözcükle okunur; oysa ikincisinde
"dinliyor" ifadesinin karşılığı yalnız "bu bağlantı noktasına gelen paketler bir sürece
teslim edilir"dir.

İkincisi **soket durumu ile servis sağlığının ayrılmasıdır**. Dinleme kaydının varlığı,
arkasındaki sürecin istekleri gerçekten işlediğini göstermez. İsteği kabul etmeyen ama soketi
açık bırakan bir süreç listede sağlıklı görünür; bekleyen istek kuyruğu dolar ve yeni bağlantılar
bir noktadan sonra düşmeye başlar. Sistem Yönetimi kursundaki ölçüm burada tekrarlanmaz; oradaki
sonuç şuydu: birimin "çalışıyor" görünmesi ile işini yapması iki ayrı gerçektir. Ağ tarafındaki
karşılığı, dinleme kaydının varlığı ile isteğin yanıtlanması arasındaki farktır.

Üçüncüsü **kalıcı yapılandırma ile çalışan durumun farkıdır** ve bu konunun ilk dersinden beri
tekrarlanan kalıptır. Elle başlatılmış bir servis listede görünür; önyüklemede başlaması için
ayrıca etkinleştirilmiş olması gerekir. Envanter yalnız şimdiki anı gösterir.

#### İki Sınamanın Ölçüsü

```python
"""Yerel dinleyen listesi ile disaridan baglanti denemesinin ELEME gucu.
Ayni sekiz aday neden , ayni an , iki ayri sinama."""
SAGLAM = {"arayuz_acik": True, "adres_var": True, "ag_gecidi_dogru": True,
          "rota_var": True, "cozumleyici_yanit": True, "servis_dinliyor": True,
          "guvenlik_duvari_gecirir": True, "yol_bozulmadan": True}
ARIZA = {
    "arayuz-kapali":      {"arayuz_acik": False, "adres_var": False},
    "adres-yok":          {"adres_var": False},
    "ag-gecidi-yanlis":   {"ag_gecidi_dogru": False},
    "rota-eksik":         {"rota_var": False},
    "cozumleyici-sessiz": {"cozumleyici_yanit": False},
    "servis-dinlemiyor":  {"servis_dinliyor": False},
    "guvenlik-duvari-dusuruyor": {"guvenlik_duvari_gecirir": False},
    "buyuk-paket-dusuyor": {"yol_bozulmadan": False},
}


def durum(ariza, tablo):
    d = dict(SAGLAM)
    d.update(tablo[ariza])
    return d


def s_dinleyen(d):
    return "dinliyor" if d["servis_dinliyor"] else "dinlemiyor"


def s_baglanti(d):
    if not (d["arayuz_acik"] and d["adres_var"] and d["ag_gecidi_dogru"]
            and d["rota_var"]):
        return "ulasilamaz"
    if not d["guvenlik_duvari_gecirir"]:
        return "zaman-asimi"
    return "reddedildi" if not d["servis_dinliyor"] else "kuruldu"


SINAMA = {"dinleyen": s_dinleyen, "baglanti": s_baglanti}


def obekler(sinama, tablo=ARIZA):
    o = {}
    for a in tablo:
        o.setdefault(SINAMA[sinama](durum(a, tablo)), []).append(a)
    return o


for s in SINAMA:
    print(f"{s} sinamasi: yanit basina aday")
    for yanit, kume in obekler(s).items():
        print(f"  {yanit:12s} kalan {len(kume):2d}  elenen {len(ARIZA) - len(kume):2d}"
              f"  {', '.join(kume)}")
    print()
print("kahin basina elenen aday")
print(f"  {'gercek ariza':27s} {'dinleyen':>20s} {'baglanti':>20s}")
toplam = {"dinleyen": 0, "baglanti": 0}
for gercek in ARIZA:
    satir = ""
    for s in SINAMA:
        yanit = SINAMA[s](durum(gercek, ARIZA))
        elenen = len(ARIZA) - len(obekler(s)[yanit])
        toplam[s] += elenen
        satir += f"  {yanit:12s} {elenen:2d} "
    print(f"  {gercek:27s} {satir}")
print(f"  {'TOPLAM elenen':27s} {toplam['dinleyen']:18d} {toplam['baglanti']:19d}")
print()
print("aday kumesi supurmesi")
EK = dict(ARIZA, **{"servis-cokmus": {"servis_dinliyor": False}})
EKSIK = {k: v for k, v in ARIZA.items() if k != "guvenlik-duvari-dusuruyor"}
for ad, tablo in (("temel            8", ARIZA), ("+servis-cokmus   9", EK),
                  ("-guvenlik-duvari 7", EKSIK)):
    d = obekler("dinleyen", tablo)
    b = obekler("baglanti", tablo)
    dk = len(d.get("dinlemiyor", []))
    bk = len(b.get("reddedildi", []))
    print(f"  {ad:18s} dinleyen: yanit {len(d)}"
          f"  'dinlemiyor' elenen {len(tablo) - dk} kalan {dk}"
          f"  | baglanti: yanit {len(b)} en kotu kalan "
          f"{max(len(v) for v in b.values())}"
          f"  'reddedildi' kalan {bk}")
```

```
dinleyen sinamasi: yanit basina aday
  dinliyor     kalan  7  elenen  1  arayuz-kapali, adres-yok, ag-gecidi-yanlis, rota-eksik, cozumleyici-sessiz, guvenlik-duvari-dusuruyor, buyuk-paket-dusuyor
  dinlemiyor   kalan  1  elenen  7  servis-dinlemiyor

baglanti sinamasi: yanit basina aday
  ulasilamaz   kalan  4  elenen  4  arayuz-kapali, adres-yok, ag-gecidi-yanlis, rota-eksik
  kuruldu      kalan  2  elenen  6  cozumleyici-sessiz, buyuk-paket-dusuyor
  reddedildi   kalan  1  elenen  7  servis-dinlemiyor
  zaman-asimi  kalan  1  elenen  7  guvenlik-duvari-dusuruyor

kahin basina elenen aday
  gercek ariza                            dinleyen             baglanti
  arayuz-kapali                 dinliyor      1   ulasilamaz    4 
  adres-yok                     dinliyor      1   ulasilamaz    4 
  ag-gecidi-yanlis              dinliyor      1   ulasilamaz    4 
  rota-eksik                    dinliyor      1   ulasilamaz    4 
  cozumleyici-sessiz            dinliyor      1   kuruldu       6 
  servis-dinlemiyor             dinlemiyor    7   reddedildi    7 
  guvenlik-duvari-dusuruyor     dinliyor      1   zaman-asimi   7 
  buyuk-paket-dusuyor           dinliyor      1   kuruldu       6 
  TOPLAM elenen                               14                  42

aday kumesi supurmesi
  temel            8 dinleyen: yanit 2  'dinlemiyor' elenen 7 kalan 1  | baglanti: yanit 4 en kotu kalan 4  'reddedildi' kalan 1
  +servis-cokmus   9 dinleyen: yanit 2  'dinlemiyor' elenen 7 kalan 2  | baglanti: yanit 4 en kotu kalan 4  'reddedildi' kalan 2
  -guvenlik-duvari 7 dinleyen: yanit 2  'dinlemiyor' elenen 6 kalan 1  | baglanti: yanit 3 en kotu kalan 4  'reddedildi' kalan 1
```

Üç sayı yan yana. **Kâhin:** bu turda gerçek arıza `guvenlik-duvari-dusuruyor`; servis
dinliyor, paketler geliyor ve filtre onları sessizce düşürüyor. **Sınama:** yerel dinleyen
listesi çıkarılıyor ve yanıtı `dinliyor`; aynı anda dışarıdan bir bağlantı deneniyor ve yanıtı
`zaman-asimi`. **Elenen aday:** dinleyen listesi **bir**, bağlantı denemesi **yedi**. Liste
yedi aday bırakıyor, bağlantı denemesi tek aday bırakıyor ve tanıyı bitiriyor.

#### Dört Yanıtın Gücü

Üçüncü tablo bu farkın tek bir arızaya özgü olmadığını gösteriyor. Sekiz arızanın hepsi için
toplandığında dinleyen listesi **14 aday**, bağlantı denemesi **42 aday** eliyor. Oran üçtür ve
tek tek bakıldığında dağılım daha da keskin: dinleyen listesi sekiz durumun **yedisinde** yalnız
bir aday eliyor, tek bir durumda yedi eliyor. Bağlantı denemesi hiçbir durumda dörtten aşağı
düşmüyor.

Farkın kaynağı çıktı miktarı değil, **yanıt sayısıdır**. Dinleyen listesi onlarca satır
üretebilir; taşıdığı ayrım tek bir ikili sorudur — servis dinliyor mu, dinlemiyor mu. Bağlantı
denemesi tek satır üretir ve dört ayrı yanıt taşır: ulaşılamaz, zaman aşımı, reddedildi,
kuruldu. Her yanıt farklı bir aday kümesine karşılık gelir. **Bir sınamanın eleme gücünün üst
sınırını çıktı uzunluğu değil, ayırt ettiği durum sayısı belirler.**

Yanıtların hangi adaylara karşılık geldiği tanıda doğrudan kullanılır. **Ulaşılamaz** yanıtı yol
sorunlarını işaret eder ve dört adayı bir arada bırakır; bu sınamanın en zayıf yanıtıdır ve
ayrımı önceki üç dersin sınamaları yapar. **Reddedildi** yanıtı, paketin hedefe ulaştığını ve
hedefte dinleyen bulunmadığını söyler; yol boyunca her şey çalışıyor demektir ve tek adayı
bırakır. **Zaman aşımı** yanıtı, paketin gittiğini ve hiçbir yanıt dönmediğini söyler; sessizce
düşüren bir filtrenin imzası budur. **Kuruldu** yanıtı, bağlantının açıldığını söyler ve
şaşırtıcı biçimde iki adayı ayakta bırakır: sessiz çözücü ile yolda düşen büyük paket.
Bağlantının kurulması, bağlantının **kullanılabilir** olduğu anlamına gelmez.

Bu son satır kursun ikinci iddiasının bu dersteki karşılığıdır. Reddedildi ile zaman aşımı
arasındaki ayrım tek bir sözcüktür ve yedişer aday eler; oysa aynı bilgiyi elde etmek için
yapılabilecek en ayrıntılı işlem — trafiğin tamamını kaydetmek — binlerce satır üretir. **Daha
çok çıktı daha iyi tanı demek değildir**; ayıran şey, çıktının kaç ayrı duruma karşılık
geldiğidir.

Bu ölçünün bir de tersten okunuşu var. Bağlantı denemesinin dört yanıtı, dört ayrı **arıza
sınıfına** karşılık geldiği için değerlidir; yanıtların çokluğu kendi başına yeterli olsaydı,
her yanıtı ayrı bir hata koduna bölen bir araç sınırsız güçlü olurdu. Değerli olan şey,
yanıtların aday kümesini **dengeli** bölmesidir: dört yanıt sekiz adayı 4-1-1-2 biçiminde
ayırıyor. Yanıtlardan üçü tek ya da iki adaya iniyor, biri dört adayda takılıyor. Sınamayı
zayıflatan yanıt, en sık karşılaşılan yanıttır; buradaki `ulasilamaz` da öyledir ve önceki üç
dersin sınamaları tam bu yanıtın bıraktığı dört adayı ayırmak için vardır.

#### Envanterin Yeri

Dinleyen listesinin zayıf olması onu gereksiz yapmaz; yerini değiştirir. Liste, bağlantı
denemesi **reddedildi** dediğinde doğrulama aracıdır: reddedilme hedefte dinleyen bulunmadığını
söyler, envanter bunu yerelde teyit eder ve hangi bağlanma adresiyle dinlendiğini gösterir.
Liste ayrıca bağlantı denemesinin **yapılamadığı** durumlarda tek seçenektir — dışarıdan erişim
yoksa, sınamayı yapacak ikinci bir uç yoksa, yerel envanter elde kalan tek okumadır.

- **AY27** — Bağlantı denemesi, hedefe erişebilen ayrı bir uçtan yapılır; o ucun kendi
  yapılandırmasının sağlam olduğu varsayılır. Denemenin iki uçlu olması bu sınamanın maliyetini
  yükselten şeydir.
- **AY28** — Zaman aşımı ile reddedilme arasındaki ayrımın istemci tarafında görülebildiği
  varsayılır; ara katmanların yanıtı değiştirdiği durumlar modelin dışındadır.

Envanterin ikinci işlevi tanı değil, **yüzey sayımıdır**. Dışarıdan dinleyen her bağlantı
noktası, dışarıya açılmış bir kapıdır; yalnız geri döngüden dinleyen bir bağlantı noktası
değildir. Bu ayrım güvenlik duvarı derslerinin çıkış noktasıdır ve orada açık yüzey
sayılarak ele alınır. Bu derste yalnız şu söylenir: envanterin satır sayısı bir sağlık ölçüsü
değildir, bağlanma adresi sütunu okunmadan satır saymak yanıltıcıdır.

Üçüncü işlevi ise karşılaştırmadır. Envanterin bir yapılandırma değişikliğinden önce ve sonra
alınması, değişikliğin gerçekten ne yaptığını gösteren en ucuz kayıttır. Bir birim yeniden
başlatıldığında dinlenen bağlantı noktası değişmiş olabilir, bağlanma adresi daralmış ya da
genişlemiş olabilir; iki listenin farkı bunu tek bakışta verir. Bu, tanı sırasında değil,
değişiklik sırasında yapılan bir ölçümdür ve arıza doğduktan sonra elde bulunması, doğduktan
sonra aranmasından çok daha değerlidir.

#### Aday Kümesi Süpürmesi

- **AY29** — Eklenen aday `servis-cokmus`, birimin çökmesi durumudur ve modelde
  `servis-dinlemiyor` ile aynı alanı bozar.
- **AY30** — Çıkarılan aday `guvenlik-duvari-dusuruyor`, bağlantı denemesinin dördüncü yanıtını
  tek başına dolduran adaydır.

Dördüncü tablo iki sınamayı aynı sarsıntı altında karşılaştırıyor. Aday eklendiğinde dinleyen
listesinin `dinlemiyor` yanıtı yine yedi aday eliyor ama geriye **iki** aday bırakıyor; aynı
şey bağlantı denemesinin `reddedildi` yanıtı için de geçerli. İki sınama da aynı ölçüde
zayıflıyor, çünkü ikisi de aynı alanı görüyor. Beklenen bir sonuçtur ve modelin iç tutarlılığını
doğrular.

Aday çıkarıldığında ise sınamalar farklı davranıyor. Dinleyen listesi yalnız bir aday kaybediyor:
`dinlemiyor` yanıtının elediği aday yediden **altıya** iniyor, yapısı değişmiyor. Bağlantı
denemesinin yanıt sayısı ise dörtten **üçe** düşüyor; `zaman-asimi` yanıtı aday listesinde
karşılıksız kaldığı için sınamanın ayırt ettiği durum sayısı azalıyor. En kötü kalan dörtte
sabit kaldığı hâlde sınamanın taşıdığı ayrım azaldı. **Bir sınamanın gücü, aday listesinde
karşılığı bulunan yanıtlarının sayısıdır** ve bu sayı liste değiştikçe değişir.

Bu, konu boyunca dört kez yapılan süpürmenin ortak sonucudur. Arayüz sınamasında kesin sanılan
yanıt kesinliğini yitirdi, rota okumasında aynı şey oldu, ad çözümlemesinde sınama tümüyle
değersizleşti, burada ise bağlantı denemesi bir yanıtını kaybetti. Dört durumda da sınama
tanımına hiç dokunulmadı. Ölçülen sayı sınamanın değil, **sınama ile aday listesinin ortak
ürünüdür** ve bir tanı yönteminin taşınabilirliği bu yüzden aday listesinin taşınabilirliğine
bağlıdır.

#### Özet

- Yerel envanterin en önemli sütunu bağlantı noktası numarası değil bağlanma adresidir; yalnız
  geri döngüden dinleyen bir bağlantı noktası dışarıdan bakıldığında hiç dinlemiyordur ve
  listede aynı biçimde görünür.
- Dinleyen listesi **iki yanıt** verir ve beklenen yanıtta yalnız **bir** aday eler; dışarıdan
  yapılan bağlantı denemesi **dört yanıt** verir ve aynı arızada **yedi** aday eler.
- Sekiz arızanın tamamı üzerinden toplandığında dinleyen listesi **14**, bağlantı denemesi
  **42** aday eliyor. Farkın kaynağı çıktı uzunluğu değil, sınamanın ayırt ettiği durum sayısıdır.
- Bağlantı denemesinin dört yanıtı dört ayrı aday kümesine karşılık gelir: ulaşılamaz dört
  adayı bir arada bırakır, reddedildi ve zaman aşımı birer aday bırakır, kuruldu ise iki aday
  bırakır — bağlantının kurulması, kullanılabilir olduğu anlamına gelmez.
- Süpürme iki sınamayı ayırıyor: aday eklendiğinde ikisi de aynı ölçüde zayıflıyor, aday
  çıkarıldığında dinleyen listesinin yapısı korunurken bağlantı denemesinin yanıt sayısı
  dörtten üçe düşüyor.

#### Sonraki Adım

Bu konu dört sınamayı tek tek ölçtü ve her birinin kaç aday elediğini saydı. Ortaya çıkan
tablo tek bir sınamanın yeterli olmadığını gösteriyor: en güçlüsü bile bazı durumlarda dört
adayı bir arada bırakıyor, en zayıfı ise başka hiçbir sınamanın ayıramadığı bir adayı ayırıyor.
Öyleyse asıl soru tek sınamanın değeri değil, **sınamaların hangi sırayla yapılacağıdır**. Bir
sonraki konu bu soruyu sorar: katmanlı tanı yöntemi sekiz arızanın hepsini çözmek için kaç adım
harcıyor, ters sıra kaç adım harcıyor ve her adımda en çok eleyeni seçen bir sıra ne kadar
kısaltıyor. Orada görülecek olan şey, en kısa sıranın uygulanabilir bir yordam **olmadığıdır**:
en çok eleyeni seçmek, hangi arızanın gerçek olduğunu önceden bilmeyi gerektirir ve tanı yapan
kişinin bilmediği tek şey tam olarak budur.

## Sorun Giderme

Katmanlı tanı yönteminin adım maliyeti, erişilebilirlik sınamalarının doğru okunması, paket yakalamanın eleme gücü ve aralıklı arızaların bıraktığı iz.

### Katmanlı Tanı Yöntemi

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/katmanli-tani-yontemi

Sekiz aday neden ve sekiz sınama üzerinde tanı sırasının ölçülmesi: katmanlı sıra 33, ters sıra 38, her adımda kâhine bakan açgözlü sıra 10 adım harcıyor; açgözlü sıra cevabı bilmeyi gerektirdiği için uygulanabilir bir yordam değil, ulaşılamaz bir alt sınırdır.

Önceki ders yerel servis envanterini çıkardı ve iki sınamanın eleme gücünü yan yana koydu:
dinleyen soket listesi yalnız **bir** aday nedeni eliyordu, uzaktan yapılan bir
bağlantı denemesi **yedi**. Elde artık sekiz ayrı sınama var ve hepsi çalıştırılabilir
durumda. Bu dersin sorusu hangi sınamanın yapılacağı değil, **hangi sırayla** yapılacağıdır.

Soru boş bir soru değildir. Bir arıza karşısında akla ilk geleni denemek, en tanıdık aracı
açmak ya da geçen seferki nedeni varsaymak birer sıradır ve her birinin bir bedeli vardır.
Bedelin birimi de bellidir: **kaç sınama yapıldığı**. Bu ders üç sırayı aynı sekiz arıza
üzerinde koşturur ve aralarındaki farkı sayar. Sayılardan biri şaşırtıcı derecede küçük
çıkacak; o sayının neden bir yönteme dönüştürülemediği dersin asıl konusudur.

#### Aday Neden Kümesi

Tanı, bir kümeyi daraltma işidir. Başlangıçta elde bir belirti vardır — "sunucuya
bağlanılamıyor" — ve bu belirtiyi üretebilecek birden çok neden. Kursun ortak kurgusu bu
kümeyi **sekiz aday neden** olarak sabitler: arayüzün kapalı olması, adresin atanmamış
olması, varsayılan ağ geçidinin yanlış olması, rotanın eksik olması, çözücünün yanıt
vermemesi, servisin dinlememesi, güvenlik duvarının paketi düşürmesi ve büyük paketin yolda
kaybolması.

Sekiz sınama da bu kümenin üzerinde çalışır. Her sınama bir araca karşılık gelir, bir yanıt
döndürür ve o yanıt aday kümesini böler. **Kâhin**, gerçek arızadır: kurguyu biz seçtiğimiz
için hangi arızanın etkin olduğunu biliriz. Operatör bilmez; operatörün elinde yalnız
yanıtlar vardır.

Kurgunun varsayımları: bir istemci, bir sunucu ve tek bir hedef servis vardır ve aday neden
kümesi bu sekizle sınırlıdır (**SG1**); her arıza sağlam durumun tek bir alanını bozar, iki
arıza aynı anda bulunmaz (**SG2**); bir sınama kararlı tek bir yanıt döndürür ve aday sayısı
bire indiğinde durulur (**SG3**); açgözlü sıra her adımda gerçek arızayı bilerek en çok
eleyen sınamayı seçer (**SG4**); her sınamanın maliyeti eşittir ve bir adım sayılır (**SG5**).

Listenin nereden geldiği ayrı bir sorudur ve tanının en az konuşulan adımıdır. Aday neden
kümesi belirtiden türetilir: hangi bileşenler bu belirtiyi üretebilir, hangileri üretemez.
Kümeyi dar tutmak sınama sayısını düşürür ama gerçek nedeni dışarıda bırakma riskini
büyütür; geniş tutmak tersini yapar. Sekiz adaylı kurgu bir **kapalı dünya** varsayımıdır:
gerçek arızanın listede olduğu kabul edilir. Kapalı dünya bozulduğunda ölçünün kendisi
değil, ölçünün yorumu bozulur — bütün sınamalar biter, tek aday kalır ve o aday yanlıştır.
Bir tanı sırasının bitmesi, doğru bitirdiği anlamına gelmez.

Kümenin daralmasının bir başka kaynağı da sistem yönetimi kursunda ölçülen günlüklerdir.
Servis yeniden başlatıldıysa, bir birim arızalandıysa ya da bir yapılandırma değişikliği
kayda düştüyse bu, sınama yapılmadan önce bazı adayları öne çıkarır. Günlüklerin buradaki
rolü kanıt değil **öncüldür**: sıralamayı etkiler, adayı elemez. Eleme yalnız bir sınamanın
yanıtıyla olur.

Protokol katmanlarının kendisi, el sıkışma ve yönlendirme protokolleri Bilgisayar Ağları
müfredatının konusudur ve burada kurulmaz. Bu kurs tek bir makinenin yapılandırmasına ve
tanısına bakar. Ad alanı ile konteyner ağı da buraya girmez; onlar Çekirdek Arayüzleri ve
İzolasyon kursuna bırakılmıştır.

#### Katmanlı Sıra ve İki Rakibi

**Katmanlı tanı**, sınamaları bağımlılık sırasına göre dizer: önce arayüz, sonra adres ve
rota, sonra yerel ağa erişim, sonra uzak erişim, sonra ad çözümleme, en sonda servisin
kendisi. Gerekçe sezgiseldir — alttaki bozuksa üsttekinin sonucu zaten anlamsızdır.

**Ters sıra** aynı listeyi tersten okur: önce servise bağlanmayı dener, sonra aşağı iner. Bu
da savunulabilir bir sıradır; çoğu arıza servis tarafındadır diye düşünen bir operatör
doğrudan oradan başlar.

**Açgözlü sıra** ise her adımda geriye en az aday bırakacak sınamayı seçer. Üç sıranın
kullandığı sınamalar aynıdır; aşağıdaki döküm bunların hangi komutlara karşılık geldiğini
gösterir ve **çalıştırılmamıştır**. Ölçüm ardından gelen blokta yapılır ve üç sırayı da aynı
sekiz arıza üzerinde koşturur.

```text
# ornek dokum , calistirilmis degildir
$ ip -brief link show                    # arayuz acik mi
$ ip -brief addr show                    # adres atanmis mi
$ ip route show                          # varsayilan gecit ve rota
$ ping -c 3 <ag-gecidi>                  # yerel aga yanki
$ getent hosts <sunucu-adi>              # ad cozumleme
$ ss -ltn                                # dinleyen bag noktalari
$ nc -z -w 3 <hedef> <bag-noktasi>       # baglanti denemesi
```

```python
SAGLAM = {"arayuz_acik": True, "adres_var": True, "ag_gecidi_dogru": True,
          "rota_var": True, "cozumleyici_yanit": True, "servis_dinliyor": True,
          "guvenlik_duvari_gecirir": True, "yol_bozulmadan": True}

ARIZA = {                                    # SG2: her ariza TEK alani bozar
    "arayuz-kapali":      {"arayuz_acik": False, "adres_var": False},
    "adres-yok":          {"adres_var": False},
    "ag-gecidi-yanlis":   {"ag_gecidi_dogru": False},
    "rota-eksik":         {"rota_var": False},
    "cozumleyici-sessiz": {"cozumleyici_yanit": False},
    "servis-dinlemiyor":  {"servis_dinliyor": False},
    "guvenlik-duvari-dusuruyor": {"guvenlik_duvari_gecirir": False},
    "buyuk-paket-dusuyor": {"yol_bozulmadan": False},
}
ADAYLAR = tuple(ARIZA)


def durum(ariza=None):
    d = dict(SAGLAM)
    if ariza:
        d.update(ARIZA[ariza])
    return d


def yol(d):                        # arayuz + adres + gecit + rota birlikte
    return (d["arayuz_acik"] and d["adres_var"]
            and d["ag_gecidi_dogru"] and d["rota_var"])


SINAMA = {
    "arayuz": lambda d: ("acik-adresli" if d["arayuz_acik"] and d["adres_var"]
                         else "acik-adressiz" if d["arayuz_acik"] else "kapali"),
    "rota": lambda d: ("tablo-bos" if not d["adres_var"]
                       else "tam" if d["rota_var"] else "varsayilan-yok"),
    "gecit-yankisi": lambda d: ("yanit" if d["arayuz_acik"] and d["adres_var"]
                                else "yanit-yok"),
    "uzak-yanki": lambda d: "yanit" if yol(d) else "yanit-yok",
    "ad-cozumleme": lambda d: "cozuldu" if d["cozumleyici_yanit"] else "cozulemedi",
    "dinleyen": lambda d: "dinliyor" if d["servis_dinliyor"] else "dinlemiyor",
    "baglanti": lambda d: ("ulasilamaz" if not yol(d)
                           else "zaman-asimi" if not d["guvenlik_duvari_gecirir"]
                           else "reddedildi" if not d["servis_dinliyor"]
                           else "kuruldu"),
    "buyuk-paket": lambda d: ("geciyor" if yol(d) and d["yol_bozulmadan"]
                              else "gecmiyor"),
}


def ele(adaylar, s, yanit):
    return tuple(a for a in adaylar if SINAMA[s](durum(a)) == yanit)


def eledigi(adaylar, s, gercek):
    kalan = ele(adaylar, s, SINAMA[s](durum(gercek)))
    return len(adaylar) - len(kalan), len(kalan)


def maliyet(sira, gercek, adaylar=ADAYLAR):     # SG3: aday teke inince durulur
    kalan, adim = tuple(adaylar), 0
    for s in sira:
        if len(kalan) <= 1:
            break
        adim += 1
        kalan = ele(kalan, s, SINAMA[s](durum(gercek)))
    return adim


def acgozlu(gercek, adaylar=ADAYLAR):           # SG4: her adimda kahine bakar
    kalan, secilen = tuple(adaylar), []
    while len(kalan) > 1 and len(secilen) < len(SINAMA):
        en, en_s = None, None
        for s in SINAMA:
            if s not in secilen:
                k = len(ele(kalan, s, SINAMA[s](durum(gercek))))
                if en is None or k < en:
                    en, en_s = k, s
        secilen.append(en_s)
        kalan = ele(kalan, en_s, SINAMA[en_s](durum(gercek)))
    return secilen


KATMANLI = ["arayuz", "rota", "gecit-yankisi", "uzak-yanki",
            "ad-cozumleme", "dinleyen", "baglanti", "buyuk-paket"]
TERS = list(reversed(KATMANLI))
KAHIN = "guvenlik-duvari-dusuruyor"

print("aday ariza:", len(ADAYLAR), "| sinama:", len(SINAMA), "| kahin:", KAHIN)
print("sinama          yanit           elenen  kalan")
for s in KATMANLI:
    e, k = eledigi(ADAYLAR, s, KAHIN)
    print(f"  {s:14s}{SINAMA[s](durum(KAHIN)):16s}{e:6d} {k:6d}")
print()
print("ariza                       katmanli  ters  acgozlu  acgozlu sira")
for a in ADAYLAR:
    g = acgozlu(a)
    print(f"  {a:26s}{maliyet(KATMANLI, a):6d}{maliyet(TERS, a):6d}"
          f"{len(g):8d}  {', '.join(g)}")
print("toplam adim: katmanli", sum(maliyet(KATMANLI, a) for a in ADAYLAR),
      "| ters", sum(maliyet(TERS, a) for a in ADAYLAR),
      "| acgozlu", sum(len(acgozlu(a)) for a in ADAYLAR))
print()
print("aday kumesi supurmesi -- kume buyurken baglanti denemesinin eledigi")
kume = [KAHIN]
for a in ADAYLAR:
    if a not in kume:
        kume.append(a)
        e, k = eledigi(tuple(kume), "baglanti", KAHIN)
        print(f"  aday {len(kume)}  eklenen {a:26s} elenen {e}  kalan {k}")
print("bir aday cikarildiginda katmanli toplam (8 adayda 33)")
for cikan in ADAYLAR:
    alt = tuple(x for x in ADAYLAR if x != cikan)
    print(f"  cikan {cikan:26s} {sum(maliyet(KATMANLI, a, alt) for a in alt):3d}")
```

```
aday ariza: 8 | sinama: 8 | kahin: guvenlik-duvari-dusuruyor
sinama          yanit           elenen  kalan
  arayuz        acik-adresli         2      6
  rota          tam                  3      5
  gecit-yankisi yanit                2      6
  uzak-yanki    yanit                4      4
  ad-cozumleme  cozuldu              1      7
  dinleyen      dinliyor             1      7
  baglanti      zaman-asimi          7      1
  buyuk-paket   geciyor              5      3

ariza                       katmanli  ters  acgozlu  acgozlu sira
  arayuz-kapali                  1     8       1  arayuz
  adres-yok                      1     8       1  arayuz
  ag-gecidi-yanlis               4     7       2  uzak-yanki, rota
  rota-eksik                     2     7       1  rota
  cozumleyici-sessiz             5     2       1  ad-cozumleme
  servis-dinlemiyor              6     2       1  dinleyen
  guvenlik-duvari-dusuruyor      7     2       1  baglanti
  buyuk-paket-dusuyor            7     2       2  baglanti, ad-cozumleme
toplam adim: katmanli 33 | ters 38 | acgozlu 10

aday kumesi supurmesi -- kume buyurken baglanti denemesinin eledigi
  aday 2  eklenen arayuz-kapali              elenen 1  kalan 1
  aday 3  eklenen adres-yok                  elenen 2  kalan 1
  aday 4  eklenen ag-gecidi-yanlis           elenen 3  kalan 1
  aday 5  eklenen rota-eksik                 elenen 4  kalan 1
  aday 6  eklenen cozumleyici-sessiz         elenen 5  kalan 1
  aday 7  eklenen servis-dinlemiyor          elenen 6  kalan 1
  aday 8  eklenen buyuk-paket-dusuyor        elenen 7  kalan 1
bir aday cikarildiginda katmanli toplam (8 adayda 33)
  cikan arayuz-kapali               32
  cikan adres-yok                   32
  cikan ag-gecidi-yanlis            29
  cikan rota-eksik                  31
  cikan cozumleyici-sessiz          28
  cikan servis-dinlemiyor           27
  cikan guvenlik-duvari-dusuruyor   25
  cikan buyuk-paket-dusuyor         25
```

#### Kâhin, Sınama, Elenen Aday

Üç sayı yan yana durur. **Kâhin:** gerçek arıza `guvenlik-duvari-dusuruyor`, yani güvenlik
duvarı paketi sessizce düşürüyor. **Sınama:** bağlantı denemesi `zaman-asimi` yanıtını
veriyor. **Elenen aday:** bu tek yanıt sekiz adaydan **7'sini** eliyor ve geriye **1** aday
bırakıyor, yani arıza tek sınamayla çözülüyor.

Aynı kâhin altında ad çözümleme sınaması `cozuldu`, dinleyen listesi `dinliyor` yanıtını
verir; her ikisi de yalnız **1'er** aday eler ve geriye **7** aday bırakır. Ortaya çıkan
oran kursun ilk okumasıdır: aynı çabayla yapılan iki sınamadan biri ötekinin **yedi katı**
iş görüyor. Bir sınamanın değeri verdiği yanıtta değil, o yanıtın kaç adayı düşürdüğündedir.
Yanıtı doğru olan bir sınama, hiçbir adayı elemiyorsa **ölçülmemiş** sayılır.

Toplam adım tablosu ikinci okumadır. Sekiz arızanın hepsi tek tek gerçek arıza yapıldığında
katmanlı sıra toplam **33** adım, ters sıra **38** adım, açgözlü sıra **10** adım harcıyor.
Katmanlı sıra optimalin **3,3 katı** kadar sınama yapıyor. Ters sıranın kaybı ise dağılımda:
servis tarafındaki dört arızayı 2 adımda bitiriyor, ama arayüz tarafındaki iki arızada 8
adımın tamamını harcıyor.

#### Açgözlü Sıra Neden Bir Yordam Değil

On sayısı okuyucuyu yanlış bir sonuca çekebilir: "en çok eleyen sınamayı seç" kuralı
uygulanabilir bir yöntem gibi görünür. Değildir. Kuralın işleyebilmesi için her adımda,
**henüz bilinmeyen** gerçek arıza altında her sınamanın hangi yanıtı vereceğini hesaplamak
gerekir. Blokta bunu yapan satır `SINAMA[s](durum(gercek))` çağrısıdır ve `gercek`, tam da
tanının bulmaya çalıştığı şeydir.

Başka bir deyişle açgözlü sıra **kâhini girdi olarak alır**. Cevabı bilen biri en kısa yolu
seçebilir; cevabı bilmeyen biri o seçimi yapamaz. Bu yüzden 10 sayısı bir hedef değil,
**ulaşılamaz bir alt sınırdır**. Ölçüde bir işi vardır — katmanlı sıranın ne kadar fazla iş
yaptığını gösteren bir ölçek verir — ama uygulanabilir bir sıra olarak hiçbir yerde
sunulmaz.

Bu ayrım tanı yazınında sık karıştırılır. "Deneyimli operatör doğrudan doğru yere bakar"
cümlesi, açgözlü sıranın insan biçimidir ve aynı kusuru taşır: deneyim geçmiş arızaların
dağılımını bilmektir, o anki arızayı değil. Geçmiş dağılım bugünkü arızaya uyduğunda kısa
yol çalışır, uymadığında operatör ters sıranın en kötü durumunu yaşar — arayüz kapalıyken
sekiz sınamanın hepsini yapmak gibi.

#### Katmanlı Sıranın Savunması

Katmanlı yöntemin savunması hız değildir; 33 adım 10 adımdan üç kat pahalıdır ve bu fark
gerçektir. Savunma şudur: **katmanlı sıra kâhin olmadan çalışır.** Sıra, arızadan önce
sabitlenmiştir ve hangi arıza etkin olursa olsun aynı sırada yürür. Girdisi yalnız
sınamaların yanıtlarıdır.

İkinci savunma, sıranın verdiği ara bilginin **birikimli** olmasıdır. Arayüz sınaması
`acik-adresli` yanıtını verdiğinde yalnız iki aday elenmez; sonraki sınamaların yorumlanma
biçimi de sabitlenir. Ters sırada bu birikim yoktur: servise bağlanılamadığı görüldüğünde
elde kalan dört aday hâlâ ayrılmamıştır ve aşağı inen her sınama baştan yorumlanır.

Üçüncü savunma yanlış tanıya karşı korumadır. Ters sıra çalışırken servis tarafında bir
düzeltme yapma isteği doğar — servisi yeniden başlatmak, kuralı gevşetmek — ve alt katman
bozukken yapılan bu düzeltmeler sistemin durumunu değiştirir. Katmanlı sıra, düzeltmeye
geçmeden önce altın sağlam olduğunu kanıtlar.

Dördüncü nokta pratik bir uyarıdır: en pahalı arızalar tabloda en aşağıdadır.
`guvenlik-duvari-dusuruyor` ve `buyuk-paket-dusuyor` katmanlı sırada **7'şer** adım tutar.
Bir kısayol arayan operatör için doğru hamle sırayı bozmak değil, **bağlantı denemesini
sıraya erken sokmaktır**: dört ayrı yanıt döndürdüğü için tek başına en güçlü bölücüdür ve
sıranın mantığını bozmadan yukarı taşınabilir.

#### Aday Kümesi Süpürmesi

Kurguda rastgelelik yoktur; bütün sayılar tam sayımdır. Sonuçların kurguya ne kadar bağlı
olduğu bu yüzden ikinci bir tohumla değil, **aday kümesini değiştirerek** sınanır.

Küme büyürken bağlantı denemesinin elediği aday sayısı 1'den 7'ye çıkar, kalan hep 1'dir.
Buradan çıkan sonuç önemlidir: **eleme sayısı aracın tek başına bir özelliği değildir**,
aday kümesinin de ölçüsüdür. "Bu araç yedi adayı eler" cümlesi ancak sekiz adaylı bir küme
tanımlanmışsa anlamlıdır. Aday listesini yazmadan araç karşılaştırmak, paydası olmayan bir
kesir yazmaktır.

Bir aday çıkarıldığında katmanlı toplam 33'ten 25 ile 32 arasına iner. Düşüş nerede
olduğuna bağlıdır: sıranın başındaki `arayuz-kapali` çıkarıldığında toplam yalnız 1 adım
azalır (32), sonundaki `guvenlik-duvari-dusuruyor` ya da `buyuk-paket-dusuyor`
çıkarıldığında 8 adım azalır (25). Katmanlı sıranın maliyetini belirleyen şey aday sayısı
değil, adayların **sıranın neresinde** durduğudur. Aynı sonucun tersi de doğrudur: listeye
eklenen yeni bir derin aday, toplamı sekiz adıma kadar büyütebilir.

#### Özet

- Tanı bir kümeyi daraltma işidir; bir sınamanın sayısı verdiği yanıt değil, **elediği aday
  neden** sayısıdır ve kaç adayı elediği yazılmayan sınama ölçülmemiş sayılır.
- Güvenlik duvarının düşürdüğü senaryoda bağlantı denemesi **7** aday eler ve tek başına
  çözer; ad çözümleme ile dinleyen listesi yalnız **1'er** aday eler.
- Sekiz arızanın toplam adım maliyeti: katmanlı sıra **33**, ters sıra **38**, kâhin
  destekli açgözlü sıra **10**.
- Açgözlü sıra **bir yordam değildir**: her adımda en çok eleyen sınamayı seçmek gerçek
  arızayı bilmeyi gerektirir, bu yüzden 10 ulaşılamaz bir alt sınırdır.
- Katmanlı yöntemin savunması hızı değil, **kâhin olmadan da çalışmasıdır**; sırası arızadan
  önce sabitlenmiştir ve yalnız sınama yanıtlarını girdi alır.
- Eleme sayısı aday kümesine bağlıdır: küme 2'den 8'e büyürken bağlantı denemesinin elediği
  aday 1'den 7'ye çıkar.

#### Sonraki Adım

Katmanlı sıranın ilk dört adımı erişilebilirlik sınamalarıdır ve tabloda en zayıf
görünenler de oradadır: ağ geçidine yankı yalnız 2 aday eliyor, uzak adrese yankı 4. Bu
sınamaların gerçek sorunu zayıflıkları değil, **yanlış okunmalarıdır**: yanıt gelmemesi tek
bir nedene değil, birden çok nedene uyar ve yanıt gelmesi de erişimin sağlam olduğunu
söylemez. Sonraki ders yankı ve yol izleme araçlarının döndürdüğü sessizliği açar ve "yanıt
yok" durumunun kaç ayrı aday nedene karşılık geldiğini sayar.

### Erişilebilirlik Testleri

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/erisilebilirlik-testleri

Yankı ve yol izleme sınamalarının doğru okunması: uzak adresten yanıt gelmemesi dört ayrı aday nedene uyuyor, üç erişilebilirlik sınaması ve bir bağlantı denemesi birlikte iki aday çiftini hâlâ ayıramıyor ve ayıran şey yapılandırmanın okunması oluyor.

Önceki ders tanı sırasını ölçtü ve katmanlı sıranın ilk adımlarındaki iki sınamanın zayıf
göründüğünü gösterdi: ağ geçidine yankı yalnız 2 aday, uzak adrese yankı 4 aday eliyordu.
Bu sınamalar tanının en sık kullanılan araçlarıdır ve zayıflıkları asıl sorun değildir. Asıl
sorun **yanlış okunmalarıdır**.

Yanlış okuma iki yönde işler. Birinci yönde sessizlik fazla şey söyler sanılır: yanıt
gelmediğinde "makine kapalı" ya da "ağ yok" sonucuna varılır, oysa aynı sessizliği üreten
birden çok neden vardır. İkinci yönde ses fazla şey söyler sanılır: yanıt geldiğinde
"erişim tamam" denir, oysa yanıt veren katman ile erişilmek istenen katman aynı değildir.
Bu ders iki yanlış okumayı da sayıyla karşılar.

#### Yankı Sınamasının İkili Yanıtı

Yankı sınaması bir adrese küçük bir istek gönderir ve karşılığında bir yanıt bekler. Kurgu
bunu ikili bir yanıta indirger: `yanit` ya da `yanit-yok` (**SG6**). Gecikme, kayıp oranı ve
yanıt sırası bu derste ölçülmez; ölçülen şey sessizliğin **kaç aday nedene** uyduğudur.

İki ayrı yankı sınaması vardır ve ikisi farklı uzaklığa bakar. **Ağ geçidi yankısı** yerel
ağa çıkıp çıkamadığımızı sorar; yanıt için arayüzün açık ve adresin atanmış olması yeter.
**Uzak yankı** hedefe kadar giden yolu sorar; yanıt için ağ geçidinin doğru ve rotanın var
olması da gerekir. İkinci sınama birincisinin gerektirdiği her şeyi gerektirir, üstüne iki
koşul daha ekler. Bu iç içelik, sessizliğin neden birden çok nedene uyduğunu doğrudan
açıklar.

Ad çözümleme bu sınamaların dışında tutulmuştur: yankı adresle yapılır, adla değil. Adla
yapılan bir yankı iki mekanizmayı tek yanıtta karıştırır ve sessizliğin nedenini bir aday
daha bulanıklaştırır. Protokolün kendisi Bilgisayar Ağları müfredatının konusudur ve burada
kurulmaz.

#### Yol İzleme: Artan Uzaklıkta Yinelenen Sınama

**Yol izleme**, hedefe giden yolu ara duraklarıyla birlikte gösteren araçların ortak adıdır.
Yaptığı iş, aynı erişilebilirlik sorusunu artan uzaklıklarda yinelemektir: önce bir durak
ötesi, sonra iki durak ötesi. Kurguda bu, ağ geçidi yankısı ile uzak yankının ardarda
koşturulmasına karşılık gelir (**SG7**); ara durakların kendi davranışları ayrı ayrı
modellenmez.

Üçüncü bir erişilebilirlik sınaması, bölünmeye izin verilmeyen **büyük paket** denemesidir
(**SG8**). Küçük paketler geçerken büyüklerin kaybolduğu bir yol, yankı sınamasına sağlam
görünür. Bu ayrım, yankının küçük istek göndermesinden doğar: sınamanın kullandığı paket
boyutu, sınamanın göremediği arızayı belirler.

Dördüncü bir sınırı da baştan yazmak gerekir: yankı yanıtının bilerek verilmemesi aday neden
kümesinde yoktur (**SG9**). Bir hedef yankıya yanıt vermeyecek biçimde yapılandırılmış
olabilir ve o durumda sessizlik hiçbir arızaya karşılık gelmez. Kapalı dünya varsayımının
bedeli budur: liste dışındaki bir neden, listenin içindeki bir nedenle aynı yanıtı verir.

Yol izleme çıktısının en sık yanlış okunan yeri, **ara durakların sessizliğidir**. Bir
duraktan yanıt gelmemesi o durağın bozuk olduğunu göstermez; ara duraklar kendilerine
yönelmemiş isteklere yanıt vermek zorunda değildir ve çoğu bunu düşük öncelikli bir iş
sayar. Yol izlemede anlamlı olan tek satır **sonuncusudur**: yolun hangi uzaklıktan sonra
tamamen sessizleştiği. Ortada duran boş satırlar aday elemez, yalnız satır sayısını artırır.
Aynı yanılgının tersi de olur: bütün duraklar yanıt verirken hedefin sessiz kalması, yolun
sağlam olduğunu ve arızanın hedefte olduğunu düşündürür, oysa dönüş yönü ayrı bir yoldur ve
gidiş yönünün sağlamlığı dönüşü kanıtlamaz.

Kurgunun ikili yanıta indirgemesi bir kolaylık değil, bilinçli bir sınırdır. Gerçek bir
yankı sınaması üç istekten kaçının döndüğünü de söyler ve "3'te 3 kayıp" ile "3'te 1 kayıp"
tanı bakımından aynı şey değildir: birincisi kalıcı bir arızaya, ikincisi aralıklı bir
arızaya işaret eder. Kurgu bu ikinci durumu kapsamaz; aralıklı arıza dördüncü dersin
konusudur. Burada tutulacak nokta şudur: kayıp oranını atıp yanıtı ikiye indiren her okuma,
aralıklı arızayı ya tamamen sağlam ya tamamen bozuk gösterir.

```text
# ornek dokum , calistirilmis degildir
$ ping -c 3 <ag-gecidi>                  # bir durak otesi
$ ping -c 3 <hedef-adres>                # hedefe kadar
$ tracepath <hedef-adres>                # artan uzaklikta yineleme
$ ping -c 3 -M do -s 1400 <hedef-adres>  # bolunmeye izin vermeyen deneme
```

```python
SAGLAM = {"arayuz_acik": True, "adres_var": True, "ag_gecidi_dogru": True,
          "rota_var": True, "cozumleyici_yanit": True, "servis_dinliyor": True,
          "guvenlik_duvari_gecirir": True, "yol_bozulmadan": True}
ARIZA = {
    "arayuz-kapali":      {"arayuz_acik": False, "adres_var": False},
    "adres-yok":          {"adres_var": False},
    "ag-gecidi-yanlis":   {"ag_gecidi_dogru": False},
    "rota-eksik":         {"rota_var": False},
    "cozumleyici-sessiz": {"cozumleyici_yanit": False},
    "servis-dinlemiyor":  {"servis_dinliyor": False},
    "guvenlik-duvari-dusuruyor": {"guvenlik_duvari_gecirir": False},
    "buyuk-paket-dusuyor": {"yol_bozulmadan": False},
}
ADAYLAR = tuple(ARIZA)


def durum(a=None):
    d = dict(SAGLAM)
    if a:
        d.update(ARIZA[a])
    return d


def yol(d):
    return (d["arayuz_acik"] and d["adres_var"]
            and d["ag_gecidi_dogru"] and d["rota_var"])


SINAMA = {                    # ortak tanimin sekizinden bu derste kullanilan bes
    "gecit-yankisi": lambda d: ("yanit" if d["arayuz_acik"] and d["adres_var"]
                                else "yanit-yok"),
    "uzak-yanki": lambda d: "yanit" if yol(d) else "yanit-yok",
    "buyuk-paket": lambda d: ("geciyor" if yol(d) and d["yol_bozulmadan"]
                              else "gecmiyor"),
    "baglanti": lambda d: ("ulasilamaz" if not yol(d)
                           else "zaman-asimi" if not d["guvenlik_duvari_gecirir"]
                           else "reddedildi" if not d["servis_dinliyor"]
                           else "kuruldu"),
    "rota": lambda d: ("tablo-bos" if not d["adres_var"]
                       else "tam" if d["rota_var"] else "varsayilan-yok"),
}
YANKI = ["gecit-yankisi", "uzak-yanki", "buyuk-paket"]     # SG7: yol izleme


def obekler(kume, adaylar=ADAYLAR):
    o = {}
    for a in adaylar:
        o.setdefault(tuple(SINAMA[s](durum(a)) for s in kume), []).append(a)
    return o


print("bir yanit kac aday nedene uyuyor")
for s in YANKI + ["baglanti"]:
    for yanit, uyan in sorted(obekler([s]).items()):
        print(f"  {s:14s} {yanit[0]:12s} {len(uyan)}  {', '.join(sorted(uyan))}")
print()
KAHIN = "ag-gecidi-yanlis"
print("kahin:", KAHIN, "| sinamalar sirayla uygulaniyor")
kalan = ADAYLAR
for s in YANKI + ["baglanti", "rota"]:
    yanit = SINAMA[s](durum(KAHIN))
    yeni = tuple(a for a in kalan if SINAMA[s](durum(a)) == yanit)
    print(f"  {s:14s} {yanit:12s} elenen {len(kalan) - len(yeni)}  kalan {len(yeni)}"
          f"  {', '.join(sorted(yeni))}")
    kalan = yeni
print()
print("sinama kumesi                                  obek  ayrilamayan  en buyuk obek")
for kume in (["gecit-yankisi"], ["uzak-yanki"], ["gecit-yankisi", "uzak-yanki"],
             YANKI, ["baglanti"], YANKI + ["baglanti"]):
    o = obekler(kume)
    ayr = [v for v in o.values() if len(v) > 1]
    print(f"  {'+'.join(kume):45s} {len(o):4d} {len(ayr):12d}"
          f" {max(len(v) for v in o.values()):14d}")
print()
print("aday kumesi supurmesi: 'uzak-yanki = yanit-yok' kac adaya uyuyor")
kume = ["arayuz-kapali"]
for a in ADAYLAR:
    if a not in kume:
        kume.append(a)
        uyan = [x for x in kume if SINAMA["uzak-yanki"](durum(x)) == "yanit-yok"]
        print(f"  aday {len(kume)}  eklenen {a:26s} uyan {len(uyan)}")
```

```
bir yanit kac aday nedene uyuyor
  gecit-yankisi  yanit        6  ag-gecidi-yanlis, buyuk-paket-dusuyor, cozumleyici-sessiz, guvenlik-duvari-dusuruyor, rota-eksik, servis-dinlemiyor
  gecit-yankisi  yanit-yok    2  adres-yok, arayuz-kapali
  uzak-yanki     yanit        4  buyuk-paket-dusuyor, cozumleyici-sessiz, guvenlik-duvari-dusuruyor, servis-dinlemiyor
  uzak-yanki     yanit-yok    4  adres-yok, ag-gecidi-yanlis, arayuz-kapali, rota-eksik
  buyuk-paket    geciyor      3  cozumleyici-sessiz, guvenlik-duvari-dusuruyor, servis-dinlemiyor
  buyuk-paket    gecmiyor     5  adres-yok, ag-gecidi-yanlis, arayuz-kapali, buyuk-paket-dusuyor, rota-eksik
  baglanti       kuruldu      2  buyuk-paket-dusuyor, cozumleyici-sessiz
  baglanti       reddedildi   1  servis-dinlemiyor
  baglanti       ulasilamaz   4  adres-yok, ag-gecidi-yanlis, arayuz-kapali, rota-eksik
  baglanti       zaman-asimi  1  guvenlik-duvari-dusuruyor

kahin: ag-gecidi-yanlis | sinamalar sirayla uygulaniyor
  gecit-yankisi  yanit        elenen 2  kalan 6  ag-gecidi-yanlis, buyuk-paket-dusuyor, cozumleyici-sessiz, guvenlik-duvari-dusuruyor, rota-eksik, servis-dinlemiyor
  uzak-yanki     yanit-yok    elenen 4  kalan 2  ag-gecidi-yanlis, rota-eksik
  buyuk-paket    gecmiyor     elenen 0  kalan 2  ag-gecidi-yanlis, rota-eksik
  baglanti       ulasilamaz   elenen 0  kalan 2  ag-gecidi-yanlis, rota-eksik
  rota           tam          elenen 1  kalan 1  ag-gecidi-yanlis

sinama kumesi                                  obek  ayrilamayan  en buyuk obek
  gecit-yankisi                                    2            2              6
  uzak-yanki                                       2            2              4
  gecit-yankisi+uzak-yanki                         3            3              4
  gecit-yankisi+uzak-yanki+buyuk-paket             4            3              3
  baglanti                                         4            2              4
  gecit-yankisi+uzak-yanki+buyuk-paket+baglanti    6            2              2

aday kumesi supurmesi: 'uzak-yanki = yanit-yok' kac adaya uyuyor
  aday 2  eklenen adres-yok                  uyan 2
  aday 3  eklenen ag-gecidi-yanlis           uyan 3
  aday 4  eklenen rota-eksik                 uyan 4
  aday 5  eklenen cozumleyici-sessiz         uyan 4
  aday 6  eklenen servis-dinlemiyor          uyan 4
  aday 7  eklenen guvenlik-duvari-dusuruyor  uyan 4
  aday 8  eklenen buyuk-paket-dusuyor        uyan 4
```

#### Kâhin, Sınama, Elenen Aday

Üç sayı yan yana durur. **Kâhin:** gerçek arıza `ag-gecidi-yanlis`, yani varsayılan ağ
geçidi yanlış yazılmış. **Sınama:** uzak yankı `yanit-yok` döndürüyor. **Elenen aday:** bu
yanıt sekiz adaydan **4'ünü** eliyor ve geriye **4** aday bırakıyor.

Sessizliğin dört adaya uyması, bu dersin birinci sayısıdır. "Uzak adresten yanıt gelmiyor"
cümlesi tek başına `arayuz-kapali`, `adres-yok`, `ag-gecidi-yanlis` ve `rota-eksik`
adaylarının **hepsiyle** uyumludur. Sessizliği "ağ kopuk" diye okumak bu dördünü tek bir
nedenmiş gibi toplamaktır; dördünün düzeltmesi ayrıdır ve yanlış seçilen düzeltme çalışmaz.

Ağ geçidi yankısı sessiz kaldığında durum daha dardır: yalnız **2** aday uyar
(`arayuz-kapali`, `adres-yok`). Buradan pratik bir okuma çıkar. **Yakın sessizlik uzak
sessizlikten daha bilgilendiricidir**, çünkü daha az koşula bağlıdır. Yol izlemenin gerçek
işlevi de budur: sessizliğin hangi uzaklıkta başladığını bularak, uyan aday sayısını
daraltmak.

#### Yanıt Gelmesi Neyi Söylemez

İkinci yanlış okuma daha sinsidir. Yankının yanıt vermesi, dört adayı eler ama geriye
**4** aday bırakır: `cozumleyici-sessiz`, `servis-dinlemiyor`, `guvenlik-duvari-dusuruyor`
ve `buyuk-paket-dusuyor`. Yani "makine yanıt veriyor" cümlesi, servise erişilebildiği
anlamına gelmez ve dört ayrı arıza bu cümleyle tamamen uyumludur.

Aradaki farkı yaratan şey, sessizlik ile **reddin** aynı şey olmamasıdır. Bağlantı
denemesinin dört yanıtından ikisi tek bir adayı belirler: `reddedildi` yalnız
`servis-dinlemiyor` adayına, `zaman-asimi` yalnız `guvenlik-duvari-dusuruyor` adayına uyar.
Reddedilmek bir yanıttır ve yanıt veren taraf, yolun sağlam olduğunu da kanıtlar; sessizlik
ise hem yolun hem hedefin durumu hakkında belirsizdir. Tanıda bu yüzden aranan şey sessizliği
**bir yanıta çevirebilecek** sınamadır.

Büyük paket denemesi bu dördünün içinden birini ayırır: `buyuk-paket-dusuyor` senaryosunda
küçük yankı geçer, büyük paket geçmez. Bu, tanıda en çok gözden kaçan imzadır, çünkü iki
sınamanın çeliştiği tek yerdir — biri sağlam, öteki bozuk der ve ikisi de doğrudur.

Ardışık tablo bu sıranın nasıl yürüdüğünü gösterir. Kâhin `ag-gecidi-yanlis` iken ağ geçidi
yankısı 2, uzak yankı 4 aday eliyor; ondan sonra büyük paket denemesi **0**, bağlantı
denemesi de **0** aday eliyor. Bir sınamanın güçlü olması yetmez; **daha önce elenmiş
adayları yeniden elemek eleme değildir.** Bağlantı denemesi önceki derste yedi aday elemişti;
burada sıfır eliyor, çünkü kendisinden önce gelen sınamalar aynı ayrımı zaten yapmıştı.

#### Erişilebilirlik Sınamalarının Duvarı

Son tablo dersin en sert sonucudur. Ağ geçidi yankısı tek başına 8 adayı 2 öbeğe ayırır ve
en büyük öbekte 6 aday kalır. Uzak yankı tek başına 2 öbek, en büyük öbek 4. İkisi birlikte
3 öbek üretir ve **üç öbeğin üçünde de birden çok aday** vardır: bu iki sınama, tek bir
adayı bile tek başına belirleyemez.

Büyük paket denemesi eklendiğinde öbek sayısı 4'e çıkar, en büyük öbek 3'e iner; ayrılamayan
öbek sayısı hâlâ **3**'tür. Bağlantı denemesi de eklendiğinde 6 öbek oluşur ve geriye
**2** ayrılamayan çift kalır: `arayuz-kapali` ile `adres-yok` ve `ag-gecidi-yanlis` ile
`rota-eksik`.

Bu iki çift, kaç erişilebilirlik sınaması yapılırsa yapılsın ayrılmaz. Nedeni yapısaldır:
çiftin iki üyesi de **aynı yolu aynı yerde** kesiyor, dolayısıyla yola bakan her sınama aynı
yanıtı veriyor. Ayıran şey yola bakmak değil, **yapılandırmayı okumaktır**. Tabloda bunu
yapan satır sonuncusudur: yönlendirme tablosu sınaması `tam` yanıtını verip
`ag-gecidi-yanlis` ile `rota-eksik` arasındaki son adayı eler ve tanı 1 adaya iner.

Buradan kursun ikinci iddiasının ilk yüzü çıkar: **sınama sayısını artırmak eleme gücünü
artırmaz.** Üç erişilebilirlik sınaması, tek bir yapılandırma okumasının yaptığı işi
yapmıyor. Sınamaları çoğaltmak yerine **türünü değiştirmek** gerekiyor.

Bu araçların bu kadar çok kullanılmasının nedeni de aynı tabloda gizlidir: ucuzdurlar. Bir
yankı sınaması saniyeler sürer, tek satır komuttur, hedefte değişiklik yapmaz ve
başarısızlığı zararsızdır. Ucuzluk, bir aracı ilk seçenek yapar; **eleme gücü** ise onu
tanıyı bitiren araç yapar ve ikisi aynı ölçü değildir. Ölçüde her sınama bir adım sayıldı
(**SG5**), yani saniyeler değil kararlar sayıldı. Saniye cinsinden ölçülseydi yankı
sınamaları daha da avantajlı görünürdü ve tam da bu görüntü, tanının tıkandığı yerde onlarca
kez yankı yinelemeye yol açar. Aynı sınamanın yinelenmesi hiçbir yeni aday elemez; ilk
koşumdan sonra elde edilen bilgi sabittir.

#### Aday Kümesi Süpürmesi

Süpürme, sessizliğin uyduğu aday sayısının kümeye ne kadar bağlı olduğunu gösterir. Küme
`arayuz-kapali` ile başlayıp sekize kadar büyütüldüğünde `uzak-yanki = yanit-yok` yanıtına
uyan aday sayısı 1, 2, 3, 4 diye artar ve **dörtte durur**: sonradan eklenen dört aday
üst katmandadır ve uzak yankıya yanıt üretirler.

Tablo tersten de okunur. Listeden bir aday çıkarmak, satırları yukarı doğru izlemekle aynı
şeydir: `rota-eksik` listeden çıkarıldığında sessizliğe uyan aday 4'ten 3'e, `ag-gecidi-yanlis`
de çıkarıldığında 2'ye iner. Çıkarma her zaman kazanç gibi görünür, çünkü sessizlik
daralır; oysa çıkarılan aday gerçek arızaysa tanı sıfır adayla biter ve bu, tablonun hiçbir
yerinde görünmez.

Sonuç iki yönlüdür. Aday listesi kısaysa sessizlik daha bilgilendirici görünür — üç adaylı
bir listede "yanıt yok" iki adaya uyar — ama bu bilgi, listenin dışında kalan nedenler
pahasına elde edilmiştir. Aday listesi uzadıkça sessizliğin ayırt etme gücü belli bir
noktadan sonra **artmaz da azalmaz da**: eklenen adaylar farklı bir yanıt verdiği sürece
sessizliğin karşılığı sabit kalır. Bir sınamanın gücünü belirleyen şey aday sayısı değil,
adayların **hangi yanıta düştüğüdür**.

#### Özet

- Uzak adresten yanıt gelmemesi **4** ayrı aday nedene uyar; ağ geçidinden yanıt gelmemesi
  **2** adaya uyar. Yakın sessizlik daha az koşula bağlı olduğu için daha bilgilendiricidir.
- Yankının yanıt vermesi de **4** adayı ayakta bırakır; "makine yanıt veriyor" cümlesi
  servise erişilebildiğini söylemez.
- Yol izleme, aynı erişilebilirlik sorusunun artan uzaklıkta yinelenmesidir; büyük paket
  denemesi, küçük yankının göremediği tek arızayı ayırır.
- Üç erişilebilirlik sınaması birlikte tek bir adayı bile belirleyemez; bağlantı denemesi de
  eklendiğinde geriye **2** ayrılamayan çift kalır ve onları ancak yapılandırmayı okumak
  ayırır.
- Daha önce elenmiş adayı yeniden elemek eleme değildir: bağlantı denemesi bu sırada **0**
  aday eler; aynı sınamanın yinelenmesi de yeni aday elemez.
- Reddedilmek bir yanıttır ve tek adayı belirler; sessizlik hem yol hem hedef hakkında
  belirsizdir.

#### Sonraki Adım

Erişilebilirlik sınamaları duvara toslayınca akla gelen sonraki adım genellikle aynıdır:
trafiğin kendisine bakmak. Paket yakalama, yanıtların özetini değil, hattan geçen her
çerçeveyi gösterir ve bu yüzden "en ayrıntılı" araç sayılır. Sonraki ders bu beklentiyi
ölçer: yakalamanın ürettiği satır sayısını ve elediği aday neden sayısını yan yana koyar,
satır başına düşen eleme gücünü bağlantı denemesininkiyle karşılaştırır. Yakalamanın bir
tanı aracı olduğu, başkasının trafiğini ele geçirme yordamı olmadığı da orada sınırıyla
birlikte yazılır.

### Paket Yakalama

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/paket-yakalama

Yakalamanın eleme gücünün ölçülmesi: süzgeçsiz yakalama 14400 satır üretip 6 aday eliyor ve tanıyı bitirmiyor, tek satırlık bir bağlantı denemesi 7 aday eliyor ve bitiriyor; satır başına eleme 0,0004'e karşı 7,0000 çıkıyor.

Önceki ders erişilebilirlik sınamalarının bir duvara tosladığını gösterdi: üç yankı ve bir
bağlantı denemesi birlikte bile iki aday çiftini ayıramıyordu. Böyle bir tıkanmada akla
gelen sonraki adım genellikle aynıdır — özetlere değil, **hattan geçen trafiğin kendisine**
bakmak. Paket yakalama bunu yapar ve bu yüzden araç kutusunun en ayrıntılı aracı sayılır.

Bu ders o beklentiyi ölçer. Yakalamanın ürettiği satır sayısı ile elediği aday neden sayısı
yan yana konur ve ikisinin oranı hesaplanır. Sonuç kursun ikinci iddiasının en sert
biçimidir: **daha çok çıktı daha iyi tanı demek değildir.** Dersin ikinci yarısı da aynı
ölçüden çıkan bir sınırı yazar: yakalama bir **tanı** aracıdır ve bu kursta tanının dışına
çıkan hiçbir kullanımı anlatılmaz.

#### Yakalamanın Gördüğü ile Söylediği

Yakalama, bir arayüzden geçen çerçeveleri kaydeder. Gördüğü şey gerçekten çoktur: her
çerçevenin zamanı, boyutu, yönü ve başlık alanları. Söylediği şey ise tanının kullanabildiği
kadarıdır ve operatör bu binlerce satırı **tek bir yargıya** indirger: trafik hangi yönlerde
akıyor.

Ortak tanımın sekiz sınamasına dokunulmaz; yakalama bu derste **dokuzuncu** bir sınama olarak
eklenir (**SG10**). Yakalama yerel arayüzde ve yalnız tanı konusu akış üzerinde yapılır;
yanıtı üç değere indirgenir (**SG11**): `paket-yok`, `giden-var-donen-yok`, `iki-yonlu`.
Yakalanan her çerçeve bir satır üretir (**SG12**). Altı yüz saniyelik pencerede arayüzden
geçen çerçevelerin dağılımı kurgudur ve toplamı 14400'dür (**SG13**). Süzgeç yakalanan satır
sayısını azaltır ama yanıtı değiştirmez (**SG14**); en dar okuma akışın ilk altı çerçevesidir
(**SG15**). Yakalama, arıza başlamadan önce çalışır durumdadır (**SG16**).

Üç yanıtın karşılıkları doğrudan sağlam durumdan türer. Arayüz kapalıysa, adres yoksa ya da
rota eksikse yerel yığın çerçeve üretemez ve kayıt boştur. Ağ geçidi yanlışsa ya da güvenlik
duvarı düşürüyorsa çerçeveler çıkar, karşılık gelmez. Kalan durumlarda iki yönlü trafik
görünür. Protokol başlıklarının anlamı ve el sıkışma Bilgisayar Ağları müfredatının
konusudur ve burada açılmaz.

```text
# ornek dokum , calistirilmis degildir
$ tcpdump -i <arayuz> -n -c 200 host <hedef> and port <bag-noktasi>
$ tcpdump -i <arayuz> -n -w /tmp/tani.pcap host <hedef> and port <bag-noktasi>
$ tcpdump -r /tmp/tani.pcap -n | wc -l
```

```python
SAGLAM = {"arayuz_acik": True, "adres_var": True, "ag_gecidi_dogru": True,
          "rota_var": True, "cozumleyici_yanit": True, "servis_dinliyor": True,
          "guvenlik_duvari_gecirir": True, "yol_bozulmadan": True}
ARIZA = {
    "arayuz-kapali":      {"arayuz_acik": False, "adres_var": False},
    "adres-yok":          {"adres_var": False},
    "ag-gecidi-yanlis":   {"ag_gecidi_dogru": False},
    "rota-eksik":         {"rota_var": False},
    "cozumleyici-sessiz": {"cozumleyici_yanit": False},
    "servis-dinlemiyor":  {"servis_dinliyor": False},
    "guvenlik-duvari-dusuruyor": {"guvenlik_duvari_gecirir": False},
    "buyuk-paket-dusuyor": {"yol_bozulmadan": False},
}
ADAYLAR = tuple(ARIZA)


def durum(a=None):
    d = dict(SAGLAM)
    if a:
        d.update(ARIZA[a])
    return d


def yol(d):
    return (d["arayuz_acik"] and d["adres_var"]
            and d["ag_gecidi_dogru"] and d["rota_var"])


SINAMA = {
    "arayuz": lambda d: ("acik-adresli" if d["arayuz_acik"] and d["adres_var"]
                         else "acik-adressiz" if d["arayuz_acik"] else "kapali"),
    "baglanti": lambda d: ("ulasilamaz" if not yol(d)
                           else "zaman-asimi" if not d["guvenlik_duvari_gecirir"]
                           else "reddedildi" if not d["servis_dinliyor"]
                           else "kuruldu"),
    # SG10: ortak tanimin sekiz sinamasina dokunulmaz , yakalama DOKUZUNCU sinama
    "yakalama": lambda d: (
        "paket-yok" if not (d["arayuz_acik"] and d["adres_var"] and d["rota_var"])
        else "giden-var-donen-yok" if not (d["ag_gecidi_dogru"]
                                           and d["guvenlik_duvari_gecirir"])
        else "iki-yonlu"),
}

TRAFIK = {                       # SG13: 600 saniyelik pencerede kurgu cerceve sayilari
    "ilgisiz-komsu": 9000, "ad-sorgusu": 1800, "yonetim": 2400,
    "hedef-diger-bag-noktasi": 1080, "hedef-akis": 120,
}
SUZGEC = {                       # SG14: suzgec satiri azaltir , YANITI degistirmez
    "suzgec yok": list(TRAFIK),
    "hedef adres": ["hedef-diger-bag-noktasi", "hedef-akis"],
    "hedef adres + bag noktasi": ["hedef-akis"],
}


def satir(ad):
    return sum(TRAFIK[k] for k in SUZGEC[ad])


def obekler(kume, adaylar=ADAYLAR):
    o = {}
    for a in adaylar:
        o.setdefault(tuple(SINAMA[s](durum(a)) for s in kume), []).append(a)
    return o


def eledigi(kume, gercek, adaylar=ADAYLAR):
    desen = tuple(SINAMA[s](durum(gercek)) for s in kume)
    kalan = obekler(kume, adaylar)[desen]
    return len(adaylar) - len(kalan), len(kalan)


KAHIN = "guvenlik-duvari-dusuruyor"
print("ariza                       yakalama             baglanti")
for a in ADAYLAR:
    print(f"  {a:26s}{SINAMA['yakalama'](durum(a)):21s}{SINAMA['baglanti'](durum(a))}")
print()
print("kahin:", KAHIN)
for s in ("yakalama", "baglanti", "arayuz"):
    e, k = eledigi([s], KAHIN)
    print(f"  {s:9s} yanit {SINAMA[s](durum(KAHIN)):20s} elenen {e}  kalan {k}")
print()
print("satir sayisi ve satir basina elenen aday (kahin sabit)")
for ad in SUZGEC:
    n = satir(ad)
    e, _ = eledigi(["yakalama"], KAHIN)
    print(f"  yakalama / {ad:26s} satir {n:6d}  elenen {e}  satir basina {e / n:.4f}")
ILK = 6                          # SG15: akisin ilk 6 cercevesi
e, _ = eledigi(["yakalama"], KAHIN)
print(f"  yakalama / {'akisin ilk cerceveleri':26s} satir {ILK:6d}  elenen {e}"
      f"  satir basina {e / ILK:.4f}")
eb, _ = eledigi(["baglanti"], KAHIN)
print(f"  baglanti denemesi{'':20s} satir {1:6d}  elenen {eb}  satir basina {eb / 1:.4f}")
print()
print("sinama kumesi              obek  ayrilamayan  tekil  en buyuk obek")
for kume in (["yakalama"], ["baglanti"], ["arayuz"],
             ["baglanti", "yakalama"], ["baglanti", "arayuz"]):
    o = obekler(kume)
    print(f"  {'+'.join(kume):25s} {len(o):4d} {len([v for v in o.values() if len(v) > 1]):12d}"
          f" {len([v for v in o.values() if len(v) == 1]):6d} {max(len(v) for v in o.values()):14d}")
print()
print("aday kumesi supurmesi: yakalama ile baglantinin eledigi (kume buyurken)")
kume = [KAHIN]
for a in ADAYLAR:
    if a not in kume:
        kume.append(a)
        ey, ky = eledigi(["yakalama"], KAHIN, tuple(kume))
        eb, kb = eledigi(["baglanti"], KAHIN, tuple(kume))
        print(f"  aday {len(kume)}  yakalama elenen {ey} kalan {ky}"
              f"   baglanti elenen {eb} kalan {kb}")
```

```
ariza                       yakalama             baglanti
  arayuz-kapali             paket-yok            ulasilamaz
  adres-yok                 paket-yok            ulasilamaz
  ag-gecidi-yanlis          giden-var-donen-yok  ulasilamaz
  rota-eksik                paket-yok            ulasilamaz
  cozumleyici-sessiz        iki-yonlu            kuruldu
  servis-dinlemiyor         iki-yonlu            reddedildi
  guvenlik-duvari-dusuruyor giden-var-donen-yok  zaman-asimi
  buyuk-paket-dusuyor       iki-yonlu            kuruldu

kahin: guvenlik-duvari-dusuruyor
  yakalama  yanit giden-var-donen-yok  elenen 6  kalan 2
  baglanti  yanit zaman-asimi          elenen 7  kalan 1
  arayuz    yanit acik-adresli         elenen 2  kalan 6

satir sayisi ve satir basina elenen aday (kahin sabit)
  yakalama / suzgec yok                 satir  14400  elenen 6  satir basina 0.0004
  yakalama / hedef adres                satir   1200  elenen 6  satir basina 0.0050
  yakalama / hedef adres + bag noktasi  satir    120  elenen 6  satir basina 0.0500
  yakalama / akisin ilk cerceveleri     satir      6  elenen 6  satir basina 1.0000
  baglanti denemesi                     satir      1  elenen 7  satir basina 7.0000

sinama kumesi              obek  ayrilamayan  tekil  en buyuk obek
  yakalama                     3            3      0              3
  baglanti                     4            2      2              4
  arayuz                       3            1      2              6
  baglanti+yakalama            5            2      3              3
  baglanti+arayuz              6            2      4              2

aday kumesi supurmesi: yakalama ile baglantinin eledigi (kume buyurken)
  aday 2  yakalama elenen 1 kalan 1   baglanti elenen 1 kalan 1
  aday 3  yakalama elenen 2 kalan 1   baglanti elenen 2 kalan 1
  aday 4  yakalama elenen 2 kalan 2   baglanti elenen 3 kalan 1
  aday 5  yakalama elenen 3 kalan 2   baglanti elenen 4 kalan 1
  aday 6  yakalama elenen 4 kalan 2   baglanti elenen 5 kalan 1
  aday 7  yakalama elenen 5 kalan 2   baglanti elenen 6 kalan 1
  aday 8  yakalama elenen 6 kalan 2   baglanti elenen 7 kalan 1
```

#### Kâhin, Sınama, Elenen Aday

Üç sayı yan yana durur. **Kâhin:** gerçek arıza `guvenlik-duvari-dusuruyor`. **Sınama:**
süzgeçsiz yakalama `giden-var-donen-yok` yanıtını veriyor. **Elenen aday:** bu yanıt
**6** adayı eliyor ve geriye **2** aday bırakıyor; tanı bitmiyor.

Aynı kâhin altında tek satırlık bir bağlantı denemesi `zaman-asimi` yanıtını verir, **7**
aday eler ve geriye **1** aday bırakır; tanı biter. Fark tek bir adaydır ama o adayın adı
`ag-gecidi-yanlis`tır ve yakalama onu son ana kadar taşır. Sebep basittir: yakalamanın
gördüğü şey "çıktı, dönmedi" olgusudur; **dönmemenin nedenini** göremez. Ağ geçidinin yanlış
olmasıyla güvenlik duvarının düşürmesi, arayüzden bakan bir gözlemci için aynı görünür.

Tablonun öteki ucunda da aynı körlük vardır. `iki-yonlu` yanıtı üç adaya birden uyar:
çözücü sessizken de, servis dinlemiyorken de, büyük paket düşerken de arayüzde iki
yönlü trafik görünür. Kayda bakan operatör "trafik akıyor" der ve bu doğrudur; yine de
kullanıcı hizmete erişemez. Yakalamanın söyleyebildiği şey **çerçevelerin varlığıdır**,
alışverişin başarısı değildir. Aynı üç aday, dört değerli bağlantı denemesinde iki ayrı
yanıta dağılır.

Öbek tablosu bunu tek başına özetler. Yakalama sekiz adayı 3 öbeğe ayırır ve **hiçbir
öbekte tek aday kalmaz**: yakalama tek başına hiçbir arızayı belirleyemez. Bağlantı
denemesi 4 öbek üretir ve bunların **2'si tek adaylıdır**. Tek satırlık bir yanıt, on dört
bin satırlık bir kaydın yapamadığını yapar.

#### Satır Başına Eleme

Satır sayısı sütunu asıl karşılaştırmayı verir. Süzgeçsiz yakalama **14400** satır üretir ve
6 aday eler: satır başına **0,0004** aday. Hedef adrese göre süzülünce satır 1200'e, hedef
adres ve bağlantı noktasına göre süzülünce 120'ye iner; elenen aday **değişmez** ve satır
başına oran 0,0050 ile 0,0500 olur. Akışın yalnız ilk altı çerçevesi okunduğunda oran
1,0000'a çıkar. Bağlantı denemesinin satır başına oranı ise **7,0000**'dir.

İki okuma çıkar. Birincisi doğrudan iddianın kendisidir: satır sayısını altıdan 14400'e,
yani **2400 kat** büyütmek eleme gücünü **hiç** artırmaz. Yakalamanın 14400 satırından
çıkarılan bilgi, aynı yakalamanın ilk altı satırından çıkarılan bilgiyle aynıdır. Fazla
satırlar yeni aday elemez; yalnız okuma süresini, dosya boyutunu ve yanlış bir kalıba
takılma olasılığını artırır.

Fazla satırın bir bedeli daha vardır ve ölçünün dışında kalır. Yakalama, kaydettiği her
çerçeveyi işlemek zorundadır; hız yükseldiğinde kaydın kendisi çerçeve **düşürmeye**
başlar. En çok çıktı üreten araç, tam da yükün en yüksek olduğu anda kanıt kaybedebilen
araçtır ve düşen çerçeve kayıtta bir boşluk olarak değil, hiç olmamış bir olay olarak
görünür. Dar süzgeç bu riski de azaltır: kaydedilecek çerçeve az olduğunda düşme olasılığı
düşer. Yani süzgeç yalnız okumayı kolaylaştırmaz, kaydın **eksiksizliğini** de korur.

İkincisi süzgecin ne yaptığıdır. Süzgeç eleme gücünü yükseltmez, **çabayı** düşürür
(**SG14**). Bu ayrım tanıda sık karışır: dar süzgeçle bakan operatör daha çabuk sonuca
varır, ama vardığı sonuç geniş süzgeçle varacağı sonuçtan daha kesin değildir. Süzgeç bir
tanı kararı değil, bir okuma kolaylığıdır. Süzgecin gerçek riski ters yöndedir: yanlış
kurulmuş bir süzgeç, arızanın tek kanıtı olan çerçeveleri dışarıda bırakabilir ve kayıt
"hiç paket yok" der. Bu, `paket-yok` yanıtını üreten dördüncü bir nedendir ve aday
kümesinde yoktur.

#### Yakalamanın Gerçekten İşe Yaradığı Yer

Ölçü yakalamayı gereksiz göstermez; **yerini** gösterir. Bağlantı denemesiyle birlikte
kullanıldığında öbek sayısı 4'ten 5'e, tek adaylı öbek sayısı 2'den 3'e çıkar. Yakalama,
bağlantı denemesinin ayıramadığı bir yeri ayırır: `ulasilamaz` yanıtı altındaki dört adaydan
`ag-gecidi-yanlis` olanını, çerçevelerin gerçekten çıktığını göstererek işaretler.

Ne var ki aynı işi çok daha ucuz yapan bir sınama vardır. Bağlantı denemesine tek satırlık
bir arayüz okuması eklendiğinde öbek sayısı **6**, tek adaylı öbek sayısı **4** olur ve en
büyük öbek 3'ten **2**'ye iner. Yani 14400 satırlık yakalama yerine iki satırlık bir
yapılandırma okuması, aynı noktada daha çok aday eler. Yakalamanın hakkı, kalan belirsizlik
**çerçevelerin varlığına** dairse ortaya çıkar; belirsizlik yapılandırmaya dairse
yapılandırmayı okumak gerekir.

Yakalamanın ikinci gerçek işlevi ölçüde görünmez: **zamanlama**. Çerçevelerin arasındaki
süre, yeniden deneme aralıkları ve dönüşün ne kadar geciktiği başka hiçbir sınamada yoktur.
Bu bilgi aday elemez ama süreyi anlatır; aralıklı arızada tek kanıt odur ve bu, sonraki
dersin konusudur.

#### Yakalamanın Sınırı

Yakalama bu kursta bir **tanı** aracıdır ve tanının dışına çıkan hiçbir kullanımı
anlatılmaz. Başkasının trafiğini ele geçirme, kimlik taklidi ve denetim atlatma yordamları
**hiçbir derste** yazılmaz; bunlar Siber Güvenlik müfredatının konusudur ve orada da yordam
olarak değil, savunulacak yüzey olarak ele alınır.

Sınırın kendisi de ölçüden çıkar. Tanı için gereken satır sayısı **altıdır**; kayıt bundan
fazlasını topluyorsa fazlası tanıya bir şey katmaz. Bu yüzden yakalamanın doğru kurulumu
dardır: tek arayüz, tek hedef, tek bağlantı noktası, sayılı çerçeve. Geniş kurulum yalnız
verimsiz değildir; ilgisiz akışların içeriğini de kaydeder ve o içerik kimsenin tanısına ait
değildir.

Üç işletim kuralı buradan doğrudan çıkar. Kayıt **kapsamla** sınırlanır: süzgeç, tanı konusu
akıştır. Kayıt **süreyle** sınırlanır: çerçeve sayısı ya da süre önceden belirlenir. Kayıt
dosyası **saklama politikasına** bağlanır; sistem yönetimi kursunda günlükler için ölçülen
saklama sorusu, yakalama dosyası için de aynen geçerlidir ve dosya bir kanıt olduğu kadar
bir yüktür.

#### Aday Kümesi Süpürmesi

Süpürme iki sınamayı aday kümesi büyürken yan yana koyar. İki adaylı kümede ikisi de 1 aday
eler ve ikisi de tanıyı bitirir; farkları görünmez. Dördüncü aday eklendiğinde yollar
ayrılır: bağlantı denemesi 3 eler ve kalan 1'de kalır, yakalama 2 eler ve kalan **2**'ye
çıkar. Sekizinci adaya kadar bu fark korunur; yakalama her adımda tam olarak **bir** aday
geride kalır.

Buradan çıkan sonuç, ölçünün kurguya bağlılığını da sınırlar. Yakalamanın zayıflığı satır
sayısından ya da seçilen çerçeve dağılımından gelmiyor; **yanıt uzayının darlığından**
geliyor. Üç değerli bir yanıt, sekiz adayı en iyi durumda 3 öbeğe ayırır ve öbeklerin en
küçüğü bile birden büyük kalabilir. Aday sayısı arttıkça bu darlık büyür: dört değerli
bağlantı denemesi ile üç değerli yakalama arasındaki bir adaylık fark, daha geniş bir
listede daha da açılır. Listeye eklenen her yeni aday, yanıt uzayı dar olan sınamanın
elediği oranı düşürür.

#### Özet

- Yakalama süzgeçsiz **14400** satır üretir, **6** aday eler ve geriye **2** aday bırakarak
  tanıyı bitirmez; tek satırlık bağlantı denemesi **7** aday eler ve bitirir.
- Satır başına elenen aday: süzgeçsiz yakalamada **0,0004**, bağlantı denemesinde
  **7,0000**. Satır sayısını büyütmek eleme gücünü artırmaz.
- Yakalama tek başına **hiçbir** arızayı tek adaya indirmez; bağlantı denemesi **2**, arayüz
  okuması **2** arızayı tek adaya indirir.
- Süzgeç eleme gücünü değil çabayı düşürür; yanlış kurulmuş bir süzgeç arızanın tek kanıtını
  dışarıda bırakabilir.
- Yakalamanın hakkı çerçevelerin varlığına ve zamanlamasına dair belirsizliktedir;
  yapılandırmaya dair belirsizlikte iki satırlık bir okuma daha çok aday eler.
- Yakalama bir tanı aracıdır: kapsam, süre ve saklama ile sınırlanır; tanı dışı kullanımı
  bu kursta anlatılmaz.

#### Sonraki Adım

Bu dersin bütün ölçüsü tek bir varsayıma yaslandı: yakalama arıza başlamadan önce çalışır
durumdaydı (**SG16**). Varsayım kaldırıldığında sayılar çöker, çünkü kaydı olmayan bir olay
hiç olmamış gibi görünür. Sonraki ders yaygın arıza kalıplarını imzalarıyla ele alır ve
üçüncü iddiayı öder: aralıklı bir arıza altı yüz saniyelik pencerede 84 saniye sürerken
kayıt 300. saniyede başlarsa olayların yarısı, 500. saniyede başlarsa altıda birinden azı
görülür; düşürülen paketin izi ise kayıt kapalıyken sıfır satırdır.

### Yaygın Arıza Kalıpları

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/yaygin-ariza-kaliplari

Ad çözümleme, güvenlik duvarı ve yol arızalarının imzaları ile kanıtın kendiliğinden kaybolması: aralıklı arıza 600 saniyelik pencerede 84 saniye sürerken 300. saniyede başlayan kayıt 42/84, 500. saniyede başlayan 13/84 yakalıyor ve düşürülen paketin izi kayıt kapalıyken 0 satır kalıyor.

Önceki dersin bütün ölçüsü tek bir varsayıma yaslanıyordu: yakalama, arıza başlamadan önce
çalışır durumdaydı. Bu ders o varsayımı kaldırır ve kursun üçüncü iddiasını öder: **kanıt
beklemez.** Bir arıza sürerken toplanmayan kayıt sonradan toplanamaz; kaydı olmayan bir olay
tanı için hiç olmamıştır.

Dersin ilk yarısı ise geriye kalan pratik soruyu bitirir. Önceki üç ders sınamaları ve
sıralarını ölçtü; elde bir yanıt demeti var. Şimdi ters yönden bakılır: belirli bir arıza
hangi yanıt demetini üretir, yani **imzası** nedir. Üç kalıp ayrı ayrı ele alınır — ad
çözümleme, güvenlik duvarı ve yol — çünkü üçü de sık görülür ve üçü de birbirine benzeyen
belirtiler üretir.

#### Üç Kalıp ve İmzaları

Bir arızanın **imzası**, sınamaların ona verdiği yanıtların demetidir (**SG17**). İmza,
tanının aradığı şeydir: aday kümesini adım adım daraltmak yerine, gözlenen demeti bilinen
demetlerle karşılaştırmak.

**Ad çözümleme kalıbı** en belirgin imzaya sahiptir. Ad sorgusu yanıtsız kalır, ama adresle
yapılan her şey çalışır: yankı döner, bağlantı kurulur, büyük paket geçer. Kullanıcı
tarafında görüntü tuhaftır — hizmet "bazen" çalışır, çünkü önbellekte duran bir kayıt
kullanıldığında sorgu hiç yapılmaz. Ad çözümleme protokolünün kendisi Bilgisayar Ağları
müfredatının konusudur ve burada açılmaz; buradaki konu yalnız imzadır.

**Güvenlik duvarı kalıbının** imzası sessizliktir. Paket düşürüldüğünde karşı taraftan
hiçbir yanıt gelmez ve bağlantı denemesi zaman aşımına uğrar. Reddedilmekten ayrıldığı yer
tam da budur: reddetmek bir yanıt üretir, düşürmek üretmez. Sessizliğin kaynağı bu kez yolda
değil, hedefin önündeki bir kuraldır ve yol sınamaları sağlam der.

**Yol kalıbı** üçünün en sinsisidir. Küçük paketler geçer, büyükler kaybolur. Yankı sağlam
der, bağlantı kurulur, ilk alışveriş çalışır; iş büyük veri aktarımına gelince durur.
Kullanıcı bunu "yavaş" ya da "bazen kopuyor" diye bildirir ve tanı, hızla ilgili bir yerde
aranmaya başlanır.

```text
# ornek dokum , calistirilmis degildir
$ getent hosts <sunucu-adi>              # ad cozumleme imzasi
$ nc -z -w 3 <hedef> <bag-noktasi>       # reddedildi mi , zaman asimi mi
$ ping -c 3 -M do -s 1400 <hedef>        # yol imzasi
$ nft list ruleset                       # kurallar ve sayaclar okunur
```

```python
SAGLAM = {"arayuz_acik": True, "adres_var": True, "ag_gecidi_dogru": True,
          "rota_var": True, "cozumleyici_yanit": True, "servis_dinliyor": True,
          "guvenlik_duvari_gecirir": True, "yol_bozulmadan": True}
ARIZA = {
    "arayuz-kapali":      {"arayuz_acik": False, "adres_var": False},
    "adres-yok":          {"adres_var": False},
    "ag-gecidi-yanlis":   {"ag_gecidi_dogru": False},
    "rota-eksik":         {"rota_var": False},
    "cozumleyici-sessiz": {"cozumleyici_yanit": False},
    "servis-dinlemiyor":  {"servis_dinliyor": False},
    "guvenlik-duvari-dusuruyor": {"guvenlik_duvari_gecirir": False},
    "buyuk-paket-dusuyor": {"yol_bozulmadan": False},
}
ADAYLAR = tuple(ARIZA)


def durum(a=None):
    d = dict(SAGLAM)
    if a:
        d.update(ARIZA[a])
    return d


def yol(d):
    return (d["arayuz_acik"] and d["adres_var"]
            and d["ag_gecidi_dogru"] and d["rota_var"])


SINAMA = {
    "ad-cozumleme": lambda d: "cozuldu" if d["cozumleyici_yanit"] else "cozulemedi",
    "dinleyen": lambda d: "dinliyor" if d["servis_dinliyor"] else "dinlemiyor",
    "baglanti": lambda d: ("ulasilamaz" if not yol(d)
                           else "zaman-asimi" if not d["guvenlik_duvari_gecirir"]
                           else "reddedildi" if not d["servis_dinliyor"]
                           else "kuruldu"),
    "buyuk-paket": lambda d: ("geciyor" if yol(d) and d["yol_bozulmadan"]
                              else "gecmiyor"),
}
UST = list(SINAMA)                       # SG17: imza = sinama yanitlari demeti


def imza(a, kume=UST):
    return tuple(SINAMA[s](durum(a)) for s in kume)


def obekler(kume, adaylar=ADAYLAR):
    o = {}
    for a in adaylar:
        o.setdefault(imza(a, kume), []).append(a)
    return o


print("ariza                       ad-cozumleme  dinleyen    baglanti     buyuk-paket")
for a in ADAYLAR:
    i = imza(a)
    print(f"  {a:26s}{i[0]:14s}{i[1]:12s}{i[2]:13s}{i[3]}")
o = obekler(UST)
print("ayri imza:", len(o), "| ayrilamayan obek:",
      len([v for v in o.values() if len(v) > 1]),
      "| en buyuk obek:", max(len(v) for v in o.values()))
print()
print("bir sinamanin eleme gucu yanitina gore degisiyor")
for s in SINAMA:
    for yanit, uyan in sorted(obekler([s]).items()):
        print(f"  {s:13s} {yanit[0]:12s} elenen {len(ADAYLAR) - len(uyan)}  kalan {len(uyan)}")
print()


def aralikli(pencere=600, donem=45, sure=6):    # SG18
    return [t for t in range(pencere) if t % donem < sure]


def kayit_yakalar(olaylar, baslangic):          # SG19
    y = [t for t in olaylar if t >= baslangic]
    return len(y), round(len(y) / len(olaylar), 4)


def dusen_paket_izi(kayit_acik):                # SG20
    return 128 if kayit_acik else 0


OLAY = aralikli()
print("aralikli ariza: pencere 600 sn , olay", len(OLAY), "saniye ,",
      len(OLAY) // 6, "atak x 6 saniye")
for bas in (0, 100, 300, 500):
    y, oran = kayit_yakalar(OLAY, bas)
    print(f"  kayit {bas:3d}. saniyede basliyor -> yakalanan {y:3d} / {len(OLAY)} = {oran}")
print("dusen paketin izi: kayit kapali ->", dusen_paket_izi(False),
      "satir , kayit acik ->", dusen_paket_izi(True), "satir")
print()
print("aday kumesi supurmesi: ad-cozumleme sinamasinin iki yaniti")
kume = ["cozumleyici-sessiz"]
for a in ADAYLAR:
    if a not in kume:
        kume.append(a)
        o = obekler(["ad-cozumleme"], tuple(kume))
        olumsuz = len(o[("cozulemedi",)])
        olumlu = len(o.get(("cozuldu",), []))
        print(f"  aday {len(kume)}  'cozulemedi' elenen {len(kume) - olumsuz} kalan {olumsuz}"
              f"   'cozuldu' elenen {len(kume) - olumlu} kalan {olumlu}")
```

```
ariza                       ad-cozumleme  dinleyen    baglanti     buyuk-paket
  arayuz-kapali             cozuldu       dinliyor    ulasilamaz   gecmiyor
  adres-yok                 cozuldu       dinliyor    ulasilamaz   gecmiyor
  ag-gecidi-yanlis          cozuldu       dinliyor    ulasilamaz   gecmiyor
  rota-eksik                cozuldu       dinliyor    ulasilamaz   gecmiyor
  cozumleyici-sessiz        cozulemedi    dinliyor    kuruldu      geciyor
  servis-dinlemiyor         cozuldu       dinlemiyor  reddedildi   geciyor
  guvenlik-duvari-dusuruyor cozuldu       dinliyor    zaman-asimi  geciyor
  buyuk-paket-dusuyor       cozuldu       dinliyor    kuruldu      gecmiyor
ayri imza: 5 | ayrilamayan obek: 1 | en buyuk obek: 4

bir sinamanin eleme gucu yanitina gore degisiyor
  ad-cozumleme  cozuldu      elenen 1  kalan 7
  ad-cozumleme  cozulemedi   elenen 7  kalan 1
  dinleyen      dinlemiyor   elenen 7  kalan 1
  dinleyen      dinliyor     elenen 1  kalan 7
  baglanti      kuruldu      elenen 6  kalan 2
  baglanti      reddedildi   elenen 7  kalan 1
  baglanti      ulasilamaz   elenen 4  kalan 4
  baglanti      zaman-asimi  elenen 7  kalan 1
  buyuk-paket   geciyor      elenen 5  kalan 3
  buyuk-paket   gecmiyor     elenen 3  kalan 5

aralikli ariza: pencere 600 sn , olay 84 saniye , 14 atak x 6 saniye
  kayit   0. saniyede basliyor -> yakalanan  84 / 84 = 1.0
  kayit 100. saniyede basliyor -> yakalanan  66 / 84 = 0.7857
  kayit 300. saniyede basliyor -> yakalanan  42 / 84 = 0.5
  kayit 500. saniyede basliyor -> yakalanan  13 / 84 = 0.1548
dusen paketin izi: kayit kapali -> 0 satir , kayit acik -> 128 satir

aday kumesi supurmesi: ad-cozumleme sinamasinin iki yaniti
  aday 2  'cozulemedi' elenen 1 kalan 1   'cozuldu' elenen 1 kalan 1
  aday 3  'cozulemedi' elenen 2 kalan 1   'cozuldu' elenen 1 kalan 2
  aday 4  'cozulemedi' elenen 3 kalan 1   'cozuldu' elenen 1 kalan 3
  aday 5  'cozulemedi' elenen 4 kalan 1   'cozuldu' elenen 1 kalan 4
  aday 6  'cozulemedi' elenen 5 kalan 1   'cozuldu' elenen 1 kalan 5
  aday 7  'cozulemedi' elenen 6 kalan 1   'cozuldu' elenen 1 kalan 6
  aday 8  'cozulemedi' elenen 7 kalan 1   'cozuldu' elenen 1 kalan 7
```

#### Kâhin, Sınama, Elenen Aday

Üç sayı yan yana durur. **Kâhin:** gerçek arıza `cozumleyici-sessiz`. **Sınama:** ad
çözümleme sorgusu `cozulemedi` yanıtını veriyor. **Elenen aday:** bu yanıt **7** adayı
eliyor ve geriye **1** aday bırakıyor; imza tektir ve tanı biter.

Aynı sınama, kâhin `guvenlik-duvari-dusuruyor` olduğunda `cozuldu` der ve yalnız **1** aday
eler. Yani ad çözümleme sınaması bir derste en zayıf araçtı, burada en güçlüsü. Değişen şey
araç değil, **yanıt**.

İmza tablosu dört üst katman sınamasıyla sekiz arızayı **5** ayrı imzaya ayırır. Ayrılamayan
tek öbek alt katmandaki dörttür: arayüz, adres, ağ geçidi ve rota arızalarının dördü de bu
dört sınamada **aynı** demeti üretir. Bu, ikinci derste ölçülen sonucun tersidir; orada
erişilebilirlik sınamaları üst dörtlüyü tek öbekte bırakıyordu. Sonuç simetriktir:
**her sınama kümesi kendi katmanının dışını körleştirir** ve ayrım ancak iki katmandan da
sınama alındığında tamamlanır.

#### Olumsuz Yanıt Eler, Olumlu Yanıt Elemez

İkinci tablo dersin en genellenebilir bulgusudur. Bir sınamanın eleme gücü sabit bir sayı
değildir; yanıtına göre değişir ve fark büyüktür. Ad çözümleme `cozulemedi` derse **7**,
`cozuldu` derse **1** aday eler. Dinleyen listesi `dinlemiyor` derse **7**, `dinliyor` derse
**1**. Bağlantı denemesinin dört yanıtı sırasıyla 6, 7, 4 ve 7 aday eler.

Kalıbın nedeni kurgunun yapısındadır: her arıza sağlam durumun tek bir alanını bozduğu için,
bir alanın bozuk çıkması o tek arızayı işaret eder; sağlam çıkması ise geri kalan yedisiyle
uyumludur. Pratik karşılığı doğrudan bir öğüttür: **iyi haber az bilgidir.** "Ad çözümleme
çalışıyor" satırı tanıyı neredeyse hiç ilerletmez; "ad çözümleme çalışmıyor" satırı tanıyı
bitirir.

Bu, sınama seçimini de değiştirir. Bir sınamanın beklenen eleme gücü, yanıtlarının aday
kümesi üzerindeki dağılımına bağlıdır. Yanıtları dengeli dağılan bir sınama her durumda
benzer iş görür; yanıtları çok dengesiz dağılan bir sınama nadiren çok, çoğunlukla az iş
görür. Bağlantı denemesinin dört yanıtı bu bakımdan en dengelisidir ve en kötü durumda bile
4 aday eler.

#### Aralıklı Arıza: Kanıt Beklemez

Buraya kadar bütün sınamalar arıza sürerken yapıldı. Aralıklı arızada bu garanti yoktur.
Kurguda arıza her 45 saniyede bir 6 saniye sürüyor; altı yüz saniyelik pencerede **14 atak**
ve toplam **84 saniye** arıza var (**SG18**). Kayıt bir anda başlar ve pencerenin sonuna
kadar sürer (**SG19**).

Sayılar açıktır. Kayıt sıfırıncı saniyede başlarsa 84 olayın **84'ü** görülür. Yüzüncü
saniyede başlarsa **66** (0,7857). Üç yüzüncü saniyede başlarsa **42** (0,5000). Beş
yüzüncü saniyede başlarsa **13** (0,1548). Kayıt penceresinin yarısında başlamak olayların
tam yarısını götürür; altıda beşinde başlamak ise altıda beşten fazlasını — yüzde
seksen dördünü.

Buradan iki sonuç çıkar. Birincisi, **geç başlayan kayıt yanlış bir sıklık ölçer.** Beş
yüzüncü saniyede başlayan bir kayda bakan operatör on üç saniyelik arıza görür ve olayı
"ara sıra" diye niteler; gerçek süre seksen dört saniyedir. Yanlış olan gözlem değil,
gözlemin ne kadarlık bir pencereyi temsil ettiği varsayımıdır.

Aralıklı arızanın imza yöntemine verdiği zarar daha da ağırdır. İmza, ancak arıza sürerken
alındığında doğrudur. Kurguda arıza pencerenin 84 saniyesini kaplar, yani 600 saniyenin
**0,1400'ünü**; rastgele bir anda yapılan tek bir sınamanın arızaya denk gelme payı budur.
Geri kalan yüzde seksen altıda sınama **sağlam** yanıtını verir ve o yanıt, önceki bölümde
ölçülen kurala göre gerçek nedeni **eler**. Aday kümesinden elenen aday doğru adaydır ve bu,
tanı boyunca hiçbir yerde belirti vermez: bütün sınamalar tutarlıdır, imza sağlıklı bir
sistemin imzasıdır, yine de hizmet çalışmamaktadır.

Bu yüzden aralıklı arıza karşısında yapılacak şey sınamayı **yinelemektir**, ama önceki
derste yazılan uyarı burada geçerliliğini yitirir: orada aynı sınamanın yinelenmesi yeni
aday elemiyordu, çünkü sistemin durumu sabitti. Durum zamanla değişiyorsa yineleme yeni
bilgi üretir ve üretilen bilgi artık bir yanıt değil, bir **yanıt dağılımıdır**. Üç
denemenin ikisinde sağlam, birinde bozuk çıkan bir sınama, hiçbir tek yanıtın söyleyemeyeceği
şeyi söyler.

İkincisi, kaydın **başlama anı bir tanı kararıdır** ve arıza bildirilmeden önce verilmiş
olmalıdır. Bir arıza duyulduğunda kayıt açmak, o andan sonrasını görmeyi sağlar; o ana
kadarki on dört atağın hiçbiri geri gelmez. Sistem yönetimi kursunda günlük döndürmesi
kanıtı **silerken** ölçülmüştü; burada kanıt silinmiyor, hiç **yazılmıyor**. İkisinin
ortak sonucu aynıdır ve ikisinin de çaresi aynı yerdedir: karar arızadan önce verilmiş
olmalıdır.

#### Düşürülen Paketin İzi

Son sayı en kısa olanıdır. Güvenlik duvarı bir paketi düşürdüğünde varsayılan davranış iz
bırakmamaktır: kayıt kapalıyken düşen paketin izi **0 satır**, açıkken **128 satırdır**
(**SG20**). Arıza her iki durumda da aynı arızadır; değişen tek şey bir ayardır.

Bu, üçüncü iddianın en sert biçimidir. Sessiz düşürme, tanının en pahalı arızasıdır çünkü
hiçbir sınama onu doğrudan görmez; yalnız zaman aşımı imzasından **çıkarsanır**. İz açıkken
aynı arıza tek satırda okunur. Yani 128 satırlık fark, altı sınamalık bir çıkarımın yerine
geçer.

İzin bedeli de yazılmalıdır. Her düşen paket satır üretiyorsa, yoğun bir düşürme kaydı
kendisi bir yük hâline gelir ve günlük döndürmesini hızlandırarak başka kanıtı siler. Doğru
kurulum sürekli iz değil, **sınırlı iz**: belirli bir kural için, belirli bir süre boyunca
ve sayısı sınırlanmış biçimde. Bu, arıza öncesinde alınmış bir karardır; arıza sırasında
alındığında geç kalmıştır.

Aynı hesap aralıklı arızayla birleştiğinde en kötü durum ortaya çıkar: sessizce düşürülen bir
paket, arıza da aralıklıysa ne izde ne de imzada görünür. Böyle bir arıza yalnız yinelenen
sınamanın yanıt dağılımından okunur ve o dağılım, kimse yinelemediği sürece hiç oluşmaz.

#### Aday Kümesi Süpürmesi

Süpürme, olumsuz ve olumlu yanıt arasındaki açığın kümeyle nasıl büyüdüğünü gösterir. İki
adaylı kümede iki yanıt da 1 aday eler; fark yoktur. Küme sekize çıktığında `cozulemedi`
**7** aday eler, `cozuldu` hâlâ **1** aday eler. Olumsuz yanıtın gücü küme büyüdükçe
doğrusal artar, olumlu yanıtınki **sabit kalır**.

Bu, kurguya bağlı olmayan bir sonuçtur ve nedeni yapısaldır: bir alanı yalnız tek bir arıza
bozduğu için, o alanın bozuk çıkması aday sayısından bağımsız olarak tek adayı gösterir.
Aday listesine yeni bir arıza eklemek olumlu yanıtın değerini düşürür, olumsuz yanıtınkini
yükseltir. Listeyi genişletmek bu yüzden "daha dikkatli olmak" değildir; ölçünün kendisini
değiştirir ve hangi sınamanın işe yarayacağını da değiştirir.

#### Özet

- Bir arızanın imzası, sınamaların ona verdiği yanıtların demetidir; dört üst katman
  sınaması sekiz arızayı **5** imzaya ayırır ve alt katmandaki dört arıza tek öbekte kalır.
- Bir sınamanın eleme gücü yanıtına göre değişir: ad çözümleme `cozulemedi` derse **7**,
  `cozuldu` derse **1** aday eler. İyi haber az bilgidir.
- Aralıklı arıza 600 saniyelik pencerede **84 saniye** sürer; kayıt 300. saniyede başlarsa
  **42/84** (0,5000), 500. saniyede başlarsa **13/84** (0,1548) yakalanır.
- Geç başlayan kayıt yalnız az görmez, **yanlış sıklık** ölçer; on üç saniyelik gözlemden
  "ara sıra" sonucu çıkar.
- Düşürülen paketin izi kayıt kapalıyken **0 satır**, açıkken **128 satırdır**; arıza aynı
  arızadır, görünürlük bir ayardır ve o ayar arızadan önce açılmış olmalıdır.
- Olumsuz yanıtın eleme gücü aday kümesiyle birlikte büyür, olumlu yanıtınki **1'de** sabit
  kalır.

#### Sonraki Adım

Bu konu tanının ne kadarının **önceden** verilmiş kararlara bağlı olduğunu gösterdi: kaydın
açık olması, izin sınırlı tutulması, aday listesinin yazılmış olması. Aynı soru erişim
tarafında daha sert biçimde geri gelir. Bir sunucuya uzaktan bağlanmanın kendisi bir
yapılandırma kararıdır ve o karar yanlışsa tanı yapacak kanal da kapanır. Sonraki konu
güvenli kabuğu, anahtar tabanlı kimlik doğrulamayı ve yerel sertleştirmeyi ele alır; ardından
paket filtreleme çerçevesine geçer ve dışarıya açık yüzeyin büyümesini sayarak ölçer.

## Erişim ve Filtreleme

Anahtar tabanlı uzak erişim, tünelleme ve sıçrama sunucusu, paket filtreleme çerçevesi, varsayılan reddet politikası ve adres dönüştürmenin açtığı yüzeyin sayılması.

### Güvenli Kabuk

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/guvenli-kabuk

Anahtar tabanlı kimlik doğrulama ve sunucu sertleştirmesi kurulur; oturumun açılmamasının dokuz aday nedeni yedi sınamayla elenir ve kırk altı satırlık ayrıntılı istemci çıktısının beş, üç satırlık sunucu günlüğünün yedi aday elediği sayılır.

Önceki konu bir arızanın izini aradı ve izin çoğu zaman geç bakana kalmadığını gösterdi:
aralıklı arıza kayıt başlamadan önce başlar, düşürülen paket varsayılan olarak hiçbir satır
yazmaz. Bu konu aynı soruyu erişimin kendisine sorar. Bir sunucuya bağlanmanın yolu kapandığında
ortada tek bir satır vardır ve o satır genellikle "izin reddedildi" der.

Sorulacak soru şudur: o satır kaç aday nedeni eliyor. Kursun kuralı değişmez — bir sınamanın
sayısı verdiği yanıt değil, **elediği aday nedendir**. Bu derste sınamalar bir araya geldiğinde
bile eleyemedikleri bir çift kalacak ve o çifti ayıran şey bir araç değil, arızadan önce yapılmış
bir ayar olacak.

#### Anahtar Çiftinin İki Ucu

Güvenli kabuk (secure shell) bağlantısında iki ayrı doğrulama üst üste durur ve karıştırılmaları
tanıyı bozar. Birincisinde **istemci sunucuyu** doğrular: sunucunun **konak anahtarı** (host key)
ilk bağlantıda kaydedilir, sonraki bağlantılarda kayıtla karşılaştırılır. İkincisinde **sunucu
kullanıcıyı** doğrular: kullanıcının **özel anahtarı** (private key) istemcide durur, karşılığı
olan **açık anahtar** (public key) sunucudaki yetkili anahtarlar dosyasında bulunur.

Anahtar çifti istemcide üretilir ve özel anahtar oradan hiç çıkmaz; sunucuya yalnız açık anahtar
kopyalanır. Bu asimetri sertleştirmenin temelidir: sunucu ele geçse bile orada oturan şey
kullanıcının kimliğini üretmeye yetmez. **Bu derste gerçek bir anahtar, parmak izi ya da parola
yazılmaz;** anahtar dizgilerinin bulunduğu yerlerde köşeli ayraç içinde yer tutucu kullanılır.

Sunucu tarafındaki sertleştirme birkaç ayardan oluşur. Aşağıdaki döküm çalıştırılmamıştır;
ayarların adlarını ve aldıkları değerleri göstermek için yazılmış bir örnektir:

```text
# ornek dokum , calistirilmamistir
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
LogLevel VERBOSE
```

Bu satırların her biri aday neden kümesini değiştirir ve ölçümün asıl konusu budur. Parola
doğrulamasını kapatmak, parolayla ilgili bütün aday nedenleri listeden çıkarır ve yerine bir
tane koyar: anahtarı olmayan kullanıcının geri düşeceği bir yöntem kalmaz. Yetkili anahtarlar
dosyasının yerini sabitlemek, dosyanın yanlış yerde aranması adayını çıkarır. Günlük ayrıntı
düzeyini yükseltmek hiçbir adayı çıkarmaz, **ama ayırt edilebilirliği artırır** ve bu dersin
son ölçüsü tam olarak onu sayar.

Bir ayar daha vardır ve sık gözden kaçar: yetkili anahtarlar dosyasının ve onu içeren dizinin
izinleri fazla genişse sunucu dosyayı **okumaz**. Dosya yerindedir, içeriği doğrudur, anahtar
eşleşecektir; sunucu yine de reddeder. Bu davranış listeye ayrı bir aday neden ekler ve ölçümde
en can sıkıcı sonucu üreten aday odur.

#### Açık Anahtarın Karşı Tarafa Geçmesi

Anahtar çifti üretildikten sonra geriye tek bir iş kalır: açık anahtarın sunucudaki doğru
kullanıcının yetkili anahtarlar dosyasına **eklenmesi**. Bu iş göründüğünden fazla aday neden
üretir, çünkü dört ayrı yerde yanlış yapılabilir. Anahtar yanlış kullanıcının dosyasına
eklenebilir; dosya doğru olup içindeki satır satır sonu eksikliğiyle bir öncekiyle birleşebilir;
dizin sunucuda hiç yoksa ekleme sessizce başka bir yola düşebilir; kopyalama sırasında satır
başına bir boşluk girip anahtarı geçersiz kılabilir. Dördünün ortak yanı, işlem çıktısının
**başarılı** dönmesidir.

Bu yüzden anahtarın yerleştirildiği tek başına doğrulanmaz. Doğrulama, işlemin çıktısıyla değil,
**yeni bir oturum denemesiyle** yapılır ve deneme mevcut oturum kapatılmadan yapılır. Bu ayrıntı
sonraki derslerde kural yazımında aynen tekrarlanacak: değişikliği doğrulayan şey değişikliği
yapan komutun döndürdüğü değer değil, ayrı bir kanaldan yapılan bir denemedir.

Anahtarın ömrü, düzenli olarak değiştirilmesi, merkezi bir kasada saklanması ve sertifikayla
imzalanması bu kursun konusu değildir; bunlar **Siber Güvenlik** müfredatının anahtar yönetimi
derslerinde ölçülmüştür. Burada ölçülen tek şey, tek bir makinenin yerel yapılandırmasının bir
arıza karşısında ne kadarını ayırt edilebilir kıldığıdır.

#### Dokuz Aday Neden

Kurgu şudur: kullanıcı bağlanmayı deniyor ve oturum açılmıyor. Sağlam durumun tek bir alanını
bozan dokuz aday neden var. Ortak tanımın sekiz ağ arızası bu listede tek bir adaya, ağın
erişilemez oluşuna toplanmıştır; bu konu ağın üstündeki katmanı ölçer.

- **EF1** — Aday neden listesi **dokuz** maddedir ve tüketicidir; kurgu bu dokuz durumun
  dışına çıkmaz.
- **EF2** — Kâhin `acik-anahtar-yetkisiz` seçilmiştir: kullanıcının anahtarı vardır, sunucudaki
  yetkili anahtarlar dosyasında karşılığı yoktur.
- **EF3** — Yedi sınama tanımlıdır. Dördü **dışarıdan**, oturum açmadan yapılabilir; ikisi
  **sunucuda** çalışmayı gerektirir, biri ise sunucu günlüğünün temel düzeyidir.
- **EF4** — Her sınamaya bir **satır sayısı** verilmiştir. Bu sayı kurgunun parçasıdır, ölçülmüş
  bir değer değildir; amacı çıktı hacmi ile eleme gücünü yan yana koymaktır.
- **EF5** — Ayrıntılı istemci çıktısı **46**, ayrıntılı sunucu günlüğü **3**, temel sunucu
  günlüğü **1**, dinleyen listesi **12**, yerel anahtar denetimi **4**, yöntem listesi **9**,
  varsayılan istemci iletisi **1** satır sayılır.
- **EF6** — Ayrıntılı günlük düzeyi arızadan **önce** açılmış varsayılır; sonradan açmak geçmiş
  denemeyi geri getirmez.
- **EF7** — Anahtar izinlerinin genişliği ile açık anahtarın yetkisiz oluşu sunucuda **aynı
  başarısızlık dalına** düşer; bu, kurgunun değil gerçek davranışın yansımasıdır.
- **EF8** — Aday kümesi süpürmesi üç listeyle yapılır: sekiz, dokuz ve on aday.
- **EF9** — On adaylı listeye eklenen `yontem-kapatildi`, sunucunun anahtar yöntemini reddetmesi
  durumudur ve `acik-anahtar-yetkisiz` ile **aynı yanıt desenini** verir.
- **EF10** — Bütün sayılar tam sayımdır; rastgelelik ve tohum yoktur.

```python
"""Guvenli kabuk oturumu acilmiyor: dokuz aday neden , yedi sinama.

Kahin = gercek neden (kurguyu biz sectik). Olculen sey , her sinamanin
kac aday nedeni eledigi ve geriye kac aday biraktigidir.
"""
ADAY = ("ag-erisilemez", "servis-dinlemiyor", "konak-anahtari-degisti",
        "ozel-anahtar-yok", "acik-anahtar-yetkisiz", "anahtar-izni-genis",
        "kullanici-yok", "hesap-kilitli", "parola-yontemi-kapali")
SAGLAM = {"tasima_kuruldu": True, "servis_dinliyor": True,
          "konak_anahtari_uyusuyor": True, "istemci_anahtar_sunar": True,
          "sunucu_kabul": True, "hesap_gecerli": True, "parola_acik": True}
BOZUK = {
    "ag-erisilemez": {"tasima_kuruldu": False},
    "servis-dinlemiyor": {"tasima_kuruldu": False, "servis_dinliyor": False},
    "konak-anahtari-degisti": {"konak_anahtari_uyusuyor": False},
    "ozel-anahtar-yok": {"istemci_anahtar_sunar": False, "sunucu_kabul": False},
    "acik-anahtar-yetkisiz": {"sunucu_kabul": False},
    "anahtar-izni-genis": {"sunucu_kabul": False},
    "kullanici-yok": {"sunucu_kabul": False, "hesap_gecerli": False},
    "hesap-kilitli": {"sunucu_kabul": False, "hesap_gecerli": False},
    "parola-yontemi-kapali": {"parola_acik": False},
}
SATIR = {"istemci-iletisi": 1, "ayrintili-istemci": 46, "yerel-anahtar": 4,
         "yontem-listesi": 9, "dinleyen": 12, "gunluk-temel": 1,
         "gunluk-ayrintili": 3}


def durum(a=None):
    d = dict(SAGLAM)
    if a:
        d.update(BOZUK[a])
    return d


def t_istemci(d):
    if not d["tasima_kuruldu"]:
        return "baglanti-yok"
    if not d["konak_anahtari_uyusuyor"]:
        return "konak-anahtari-uyarisi"
    return "oturum-acildi" if d["sunucu_kabul"] else "izin-reddedildi"


def t_ayrintili(d):
    if not d["tasima_kuruldu"]:
        return "tasima-kurulamadi"
    if not d["konak_anahtari_uyusuyor"]:
        return "konak-anahtari-uyusmuyor"
    if not d["istemci_anahtar_sunar"]:
        return "anahtar-sunulmadi"
    return "oturum-acildi" if d["sunucu_kabul"] else "anahtar-reddedildi"


def t_gunluk_temel(d):
    if not d["tasima_kuruldu"]:
        return "satir-yok"
    return "kabul-edildi" if d["sunucu_kabul"] else "basarisiz"


def t_gunluk_ayrintili(d):
    if not d["tasima_kuruldu"]:
        return "satir-yok"
    if not d["hesap_gecerli"]:
        return "gecersiz-hesap"
    if not d["istemci_anahtar_sunar"]:
        return "yontem-sunulmadi"
    return "kabul-edildi" if d["sunucu_kabul"] else "anahtar-eslesmedi"


SINAMA = {
    "istemci-iletisi": t_istemci, "ayrintili-istemci": t_ayrintili,
    "yerel-anahtar": lambda d: ("anahtar-var" if d["istemci_anahtar_sunar"]
                                else "anahtar-yok"),
    "yontem-listesi": lambda d: ("parola-acik" if d["parola_acik"]
                                 else "parola-kapali"),
    "dinleyen": lambda d: "dinliyor" if d["servis_dinliyor"] else "dinlemiyor",
    "gunluk-temel": t_gunluk_temel, "gunluk-ayrintili": t_gunluk_ayrintili,
}
DISARIDAN = ["istemci-iletisi", "ayrintili-istemci", "yerel-anahtar",
             "yontem-listesi"]
SUNUCUDA = ["dinleyen", "gunluk-ayrintili"]
KAHIN = "acik-anahtar-yetkisiz"


def ele(adaylar, s, yanit):
    return tuple(a for a in adaylar if SINAMA[s](durum(a)) == yanit)


def obek(sinamalar, adaylar=ADAY):
    o = {}
    for a in adaylar:
        o.setdefault(tuple(SINAMA[s](durum(a)) for s in sinamalar), []).append(a)
    return [sorted(v) for v in o.values() if len(v) > 1]


print("aday neden:", len(ADAY), "| sinama:", len(SINAMA), "| kahin:", KAHIN)
print()
print("sinama              satir  ayri yanit  elenen  kalan  satir basina")
for s in SINAMA:
    kalan = len(ele(ADAY, s, SINAMA[s](durum(KAHIN))))
    el = len(ADAY) - kalan
    print(f"  {s:18s} {SATIR[s]:5d} {len({SINAMA[s](durum(a)) for a in ADAY}):11d}"
          f" {el:7d} {kalan:6d} {el / SATIR[s]:13.4f}")
print()
print("arac kumesi                   satir  ayrilamayan obek  en buyuk obek")
for ad, k in (("yalniz istemci iletisi", ["istemci-iletisi"]),
              ("yalniz ayrintili istemci", ["ayrintili-istemci"]),
              ("disaridan erisilebilen 4", DISARIDAN),
              ("disaridan 4 + temel gunluk", DISARIDAN + ["gunluk-temel"]),
              ("sunucuda calisan 2", SUNUCUDA),
              ("yedi sinama", list(SINAMA))):
    o = obek(k)
    print(f"  {ad:28s} {sum(SATIR[s] for s in k):5d} {len(o):17d}"
          f" {max((len(x) for x in o), default=0):14d}")
print()
print("aday kumesi supurmesi (kahin ayni)")
BOZUK["yontem-kapatildi"] = {"sunucu_kabul": False}
for ad, k in (("8 aday: hesap-kilitli cikarildi",
               tuple(a for a in ADAY if a != "hesap-kilitli")),
              ("9 aday: temel liste", ADAY),
              ("10 aday: yontem-kapatildi eklendi",
               ADAY + ("yontem-kapatildi",))):
    kalan = len(ele(k, "gunluk-ayrintili",
                    SINAMA["gunluk-ayrintili"](durum(KAHIN))))
    o = obek(list(SINAMA), k)
    print(f"  {ad:35s} ayrintili gunluk elenen {len(k) - kalan:2d}"
          f" kalan {kalan:2d} | ayrilamayan obek {len(o)}"
          f" en buyuk {max((len(x) for x in o), default=0)}")
print()
print("ayrilamayan obekler (yedi sinama):", obek(list(SINAMA)))
```

```
aday neden: 9 | sinama: 7 | kahin: acik-anahtar-yetkisiz

sinama              satir  ayri yanit  elenen  kalan  satir basina
  istemci-iletisi        1           4       4      5        4.0000
  ayrintili-istemci     46           5       5      4        0.1087
  yerel-anahtar          4           2       1      8        0.2500
  yontem-listesi         9           2       1      8        0.1111
  dinleyen              12           2       1      8        0.0833
  gunluk-temel           1           3       4      5        4.0000
  gunluk-ayrintili       3           5       7      2        2.3333

arac kumesi                   satir  ayrilamayan obek  en buyuk obek
  yalniz istemci iletisi           1                 2              5
  yalniz ayrintili istemci        46                 2              4
  disaridan erisilebilen 4        60                 2              4
  disaridan 4 + temel gunluk      61                 2              4
  sunucuda calisan 2              15                 3              2
  yedi sinama                     76                 2              2

aday kumesi supurmesi (kahin ayni)
  8 aday: hesap-kilitli cikarildi     ayrintili gunluk elenen  6 kalan  2 | ayrilamayan obek 1 en buyuk 2
  9 aday: temel liste                 ayrintili gunluk elenen  7 kalan  2 | ayrilamayan obek 2 en buyuk 2
  10 aday: yontem-kapatildi eklendi   ayrintili gunluk elenen  7 kalan  3 | ayrilamayan obek 2 en buyuk 3

ayrilamayan obekler (yedi sinama): [['acik-anahtar-yetkisiz', 'anahtar-izni-genis'], ['hesap-kilitli', 'kullanici-yok']]
```

#### Üç Sayı

**Kâhin:** gerçek neden `acik-anahtar-yetkisiz` — anahtar sunuluyor, sunucu tanımıyor.
**Sınama:** varsayılan istemci iletisi tek satırda "izin reddedildi" diyor; ayrıntılı istemci
çıktısı kırk altı satır basıyor ve "anahtar reddedildi" diyor; ayrıntılı sunucu günlüğü üç
satırda "anahtar eşleşmedi" diyor. **Elenen aday:** varsayılan ileti **4**, ayrıntılı istemci
**5**, ayrıntılı sunucu günlüğü **7**.

Ortadaki karşılaştırma kursun ikinci iddiasının bu dersteki biçimidir. Ayrıntılı istemci çıktısı
sunucu günlüğünün **on beş katı** satır üretiyor ve **iki aday az** eliyor. Satır başına eleme
oranı 0,1087'ye karşı 2,3333; aradaki fark yirmi bir kat. Nedeni yapısaldır: ayrıntılı istemci
çıktısı **el sıkışmanın istemci tarafını** ayrıntılandırır, oysa ayrılmayan adayların hepsi
sunucu tarafındadır. Ayrıntı düzeyini yükseltmek görülen tarafı büyütür, görülmeyen tarafı
açmaz.

Aynı tablonun en zayıf satırı `dinleyen`. On iki satır basıyor ve yalnız **bir** aday eliyor.
Ortak tanımda dinleyen listesinin eleme gücü de birdi; erişim katmanında da bir. Servisin
dinlediğini görmek, bağlanabildiğinizi göstermez ve bu iki cümle arasındaki mesafe bu kursun
tamamıdır.

#### Ayrılamayan İkili

Alt tablo daha sert bir şey söylüyor. Yedi sınamanın hepsi birlikte kullanıldığında bile
ayrılamayan **iki öbek** kalıyor ve ikisi de iki üyeli: `acik-anahtar-yetkisiz` ile
`anahtar-izni-genis`, `hesap-kilitli` ile `kullanici-yok`. Yetmiş altı satır çıktı üretiliyor
ve bu dört durum dörde ikiye bölünemiyor.

Birinci çift dersin sertleştirme bölümüne bağlanır. Yetkili anahtarlar dosyasının izinleri
genişse sunucu dosyayı okumaz ve reddeder; açık anahtar dosyada yoksa da reddeder. İkisi de
sunucunun bakış açısından "sunulan anahtar kabul edilebilir değil" dalıdır. Aradaki farkı
gösterecek olan şey bir sınama değil, **sunucunun o dalda ne yazdığıdır** — ve ne yazacağı
günlük ayrıntı düzeyine bağlıdır.

Bu, kursun üçüncü iddiasının erişim katmanındaki biçimidir. Temel düzeyde tutulan günlük üç
ayrı yanıt veriyor ve dört aday eliyor; ayrıntılı düzeyde beş yanıt veriyor ve yedi eliyor.
Fark üç satırlık bir çıktıda saklı. Ancak düzey **arızadan önce** yükseltilmiş olmalıdır:
sonradan açılan ayrıntı, geçmişte olan denemeyi geri getirmez. **Kanıt beklemez.**

Tablodaki bir satır daha bunu pekiştiriyor. Dışarıdan erişilebilen dört sınama altmış satır
üretiyor ve en büyük ayrılamayan öbeği **dört üyeli** bırakıyor. Sunucuda çalışan iki sınama
on beş satır üretiyor ve en büyük öbeği **iki üyeli**. Eleme gücünün tamamı sunucudadır; sorun
ise sunucuya girmenin kapalı olmasıdır. Bunun cevabı, güvenli kabuğun yanında ikinci bir yol
bırakmaktır: kaydedilebilen bir konsol ya da ayrı bir yönetim kanalı. O yol yoksa tanı dışarıdan
erişilebilen dört sınamayla sınırlı kalır ve dört üyeli öbek olduğu gibi durur.

#### Aday Kümesi Süpürmesi

Bu kursta ikinci tohum yoktur, çünkü rastgelelik yoktur. Yerine aday listesi değiştirilir. Alt
tablo üç listeyi yan yana koyuyor ve okunması gereken şey elenen sütunu değil, **kalan** sütunu.

Listeden `hesap-kilitli` çıkarıldığında ayrıntılı günlüğün elediği aday sayısı yediden altıya
iniyor; kalan iki, ayrılamayan öbek sayısı ikiden bire düşüyor. Listeye `yontem-kapatildi`
eklendiğinde elenen sayısı **değişmiyor** — yine yedi — ama kalan ikiden **üçe** çıkıyor ve
ayrılamayan öbeğin en büyüğü iki üyeden üçe genişliyor. Aynı sınama, aynı yanıt, aynı eleme
sayısı; tanı ise kötüleşti.

Buradan çıkan kural şudur: **eleme sayısı tek başına bir ölçü değildir.** Aday listesi
büyüdükçe aynı sınama aynı sayıda adayı eler ve geriye daha fazlasını bırakır. Ölçülmesi gereken
şey eleme değil, **kalan belirsizliktir**. Bu, kursun kuralının ikinci yarısıdır ve sonraki
derslerde sıçrama sunucusu, zincirler ve adres dönüştürme aday listesini büyüttükçe tekrar
tekrar karşımıza çıkacaktır.

#### Özet

- Güvenli kabuk bağlantısında iki doğrulama üst üste durur: istemci konak anahtarıyla sunucuyu,
  sunucu açık anahtarla kullanıcıyı doğrular. Özel anahtar istemciden çıkmaz.
- Sertleştirme ayarları aday neden listesini değiştirir: parola doğrulamasını kapatmak parolayla
  ilgili adayları çıkarır, yetkili anahtarlar dosyasının izinleri yeni bir aday ekler.
- Dokuz aday neden ve yedi sınamada elenen sayıları eşit değil: ayrıntılı sunucu günlüğü üç
  satırda **7**, ayrıntılı istemci çıktısı kırk altı satırda **5**, dinleyen listesi on iki
  satırda **1** aday eliyor.
- Yedi sınama birlikte kullanıldığında **iki öbek** ayrılamıyor; ayrımı yapan şey bir araç değil,
  arızadan önce yükseltilmiş günlük ayrıntı düzeyidir. Temel düzey **4**, ayrıntılı düzey **7**
  aday eliyor.
- Aday listesine bir madde eklendiğinde elenen sayısı sabit kalıp kalan **2'den 3'e** çıkıyor;
  ölçülmesi gereken eleme değil, kalan belirsizliktir.

#### Sonraki Adım

Bu dersin en keskin sonucu, eleme gücünün sunucuda olması ve sunucuya girmenin kapalı olmasıydı.
Dışarıdan erişilebilen dört sınama dört üyeli bir öbeği olduğu gibi bırakıyor. Sonraki ders bu
tıkanmanın olağan çözümünü ele alır: doğrudan erişilemeyen bir makineye, erişilebilen bir başka
makinenin üzerinden gitmek. Sıçrama sunucusu ve tünel, yolu ikiye böler ve tanıyı da ikiye
böler — arıza artık iki makineden birinde olabilir. Ölçülecek soru, uçtan uca tek bir denemenin
bu genişlemiş aday kümesinden kaçını elediğidir.

### Tünelleme ve Sıçrama Sunucusu

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/tunelleme-ve-sicrama-sunucusu

Yolun ikiye bölünmesiyle aday neden kümesi ona çıkar; uçtan uca tek deneme sekiz aday eler ve iki durak arasında üç ayrılamayan öbek bırakır, duraktan yapılan sınama dokuz eler, tünel ağzının bağ adresi dolaylı erişimi sıfırdan yetmiş ikiye çıkarır.

Önceki dersin en keskin sonucu şuydu: eleme gücünün tamamı sunucudadır ve sunucuya girmenin yolu
kapalıdır. Dışarıdan yapılabilen dört sınama dört üyeli bir öbeği ayıramadan bırakıyordu. Bu
tıkanmanın olağan çözümü, doğrudan erişilemeyen makineye erişilebilen bir başka makinenin
üzerinden gitmektir.

Çözüm bir bedelle gelir ve bu ders o bedeli sayar. Yol ikiye bölününce aday neden kümesi de
ikiye bölünür: arıza artık iki makineden birinde, aradaki iki bacaktan birinde ya da istemcinin
kendisinde olabilir. Uçtan uca yapılan tek bir deneme, bu genişlemiş kümenin kaçını eliyor.

#### Yolun İki Durağı

**Sıçrama sunucusu** (jump host), iki ağ arasında tek geçit olarak duran makinedir. İstemci ona
bağlanır, o da hedefe bağlanır. İki yerleşim biçimi vardır ve ikisi farklı aday neden üretir.

Birincisinde istemci makinesinde bir **yerel bağlantı noktası** açılır ve o noktaya gelen trafik
şifreli oturumun içinden geçirilip hedefe iletilir. Buna **tünel** (tunnel) denir. İkincisinde
sıçrama sunucusu yalnız taşıyıcıdır: oturum doğrudan hedefte açılır, sıçrama sunucusunda kabuk
çalışmaz. Aşağıdaki döküm çalıştırılmamıştır; iki biçimin yazımını göstermek içindir:

```text
# ornek dokum , calistirilmamistir
# yerel yonlendirme: agiz istemcide acilir , trafik sicrama uzerinden hedefe gider
ssh -L 127.0.0.1:<yerel-nokta>:<hedef-konak>:<hedef-nokta> <kullanici>@<sicrama>

# durak olarak kullanma: oturum hedefte acilir , sicrama yalnizca tasir
ssh -J <kullanici>@<sicrama> <kullanici>@<hedef-konak>
```

İki biçimin ortak ayrıntısı, tanının yarısını belirler: `<hedef-konak>` adı **sıçrama sunucusunda
çözülür**, istemcide değil. Hedefin adı yalnız uzak ağın çözücüsünde tanımlıysa bu iki yazım
çalışır. Aynı ad istemcinin kendi yapılandırmasında bir takma ad olarak yazılmışsa istemci onu
çözmeye çalışır ve çözemez. Ortaya çıkan hata iletisi ad çözümlemeyi işaret eder, oysa ad
sunucuda gayet iyi çözülmektedir. Adın **hangi tarafta** çözüldüğü, bu konunun kendine özgü aday
nedenidir.

Sıçrama sunucusunun doğrudan erişilebilir makine sayısını nasıl daralttığı **DevOps ve Platform
Mühendisliği** müfredatının uzak erişim sertleştirme dersinde, güven bölgeleri arasındaki
yerleşimi ise **Siber Güvenlik** müfredatının çevre savunması konusunda sayıldı. Burada ölçülen
şey başkadır: aynı yerleşimin **tanıya** ne yaptığı.

#### Tünelin Ağzı Nereye Bağlanır

Tünel istemci makinesinde bir bağlantı noktası açar ve o noktanın **bağ adresi** bir seçimdir.
Geri döngü adresine bağlandığında yalnız o makinenin üzerindeki süreçler tüneli kullanabilir.
Bütün arayüzlere bağlandığında istemcinin bulunduğu ağ bölütündeki her konak da kullanabilir —
ve tünelin öteki ucunda, o konakların doğrudan erişemediği bir hedef vardır.

Bu, açık yüzeyin sayılabilir bir büyümesidir. Kurguda istemcinin bölütünde başka **24** konak
bulunur ve **3** tünel açıktır. Geri döngüye bağlı tünellerde tünel ağzına ulaşabilen başka konak
**0**, dolaylı olarak erişilebilir hâle gelen (konak, hedef servis) çifti **0**. Bütün arayüzlere
bağlandığında bu iki sayı **24** ve **72** olur. Aradaki fark bir yapılandırma alanıdır ve
varsayılanı bilmeden yazılan bir tünel, kapalı sanılan bir yolu yirmi dört konağa açar.

#### On Aday Neden

Kurgu şudur: istemci, sıçrama sunucusu üzerinden hedefteki bir servise ulaşmayı deniyor ve
ulaşamıyor. Sağlam durumun tek bir alanını bozan on aday neden var.

- **EF11** — Aday neden listesi **on** maddedir ve tüketicidir. İki maddesi istemcide, ikisi ilk
  bacakta, biri sıçrama sunucusunun yapılandırmasında, dördü hedefte, biri ad çözümlemenin
  yerindedir.
- **EF12** — Kâhin `hedef-duvar-dusuruyor` seçilmiştir: hedefin süzgeci paketi sessizce düşürür.
- **EF13** — Altı sınama tanımlıdır. Üçü istemcide yapılabilir, ikisi sıçrama sunucusunda oturum
  açmayı gerektirir, biri iki tarafı karşılaştırır.
- **EF14** — Sıçrama sunucusunda çalışan sınamalar ilk bacak bozuksa **yapılamaz** ve bunu ayrı
  bir yanıtla bildirirler; bu bir bağımlılıktır, ölçünün parçasıdır.
- **EF15** — Uçtan uca deneme, tüneli açıp içinden bir oturum denemesini birlikte kapsar; bu
  yüzden hedefteki kimlik doğrulama sonucunu da görebilir.
- **EF16** — Katmanlı sıra istemciden hedefe doğru ilerler; ikinci sıra uçtan uca denemeyi başa
  alır. İkisi de kâhin bilinmeden uygulanabilir.
- **EF17** — Tünel ağzı ölçümünde bölütte **24** başka konak ve **3** açık tünel varsayılır.
- **EF18** — Aday kümesi süpürmesi dokuz, on ve on bir adaylı listelerle yapılır.
- **EF19** — On bir adaylı listeye eklenen `sicrama-oturum-sinirinda`, sıçrama sunucusunun
  yönlendirmeyi oturum düzeyinde engellemesidir ve `yonlendirme-kapali` ile aynı yanıtı verir.
- **EF20** — Bütün sayılar tam sayımdır; rastgelelik ve tohum yoktur.

```python
"""Iki durakli yol: istemci -> sicrama sunucusu -> hedef. On aday , alti sinama."""
ADAY = ("yerel-bag-noktasi-dolu", "yerel-adres-yanlis", "sicrama-erisilemez",
        "sicrama-kimlik-reddetti", "yonlendirme-kapali", "hedef-erisilemez",
        "hedef-duvar-dusuruyor", "hedef-dinlemiyor", "hedef-kimlik-reddetti",
        "ad-yalniz-uzakta-cozuluyor")
SAGLAM = {"yerel_bagli": True, "yerel_adres_dogru": True, "sicrama_erisilir": True,
          "sicrama_kimlik": True, "yonlendirme_izinli": True, "hedef_erisilir": True,
          "hedef_duvar_gecirir": True, "hedef_dinliyor": True,
          "hedef_kimlik": True, "ad_yerelde_cozulur": True}
BOZUK = {
    "yerel-bag-noktasi-dolu": {"yerel_bagli": False},
    "yerel-adres-yanlis": {"yerel_adres_dogru": False},
    "sicrama-erisilemez": {"sicrama_erisilir": False},
    "sicrama-kimlik-reddetti": {"sicrama_kimlik": False},
    "yonlendirme-kapali": {"yonlendirme_izinli": False},
    "hedef-erisilemez": {"hedef_erisilir": False},
    "hedef-duvar-dusuruyor": {"hedef_duvar_gecirir": False},
    "hedef-dinlemiyor": {"hedef_dinliyor": False},
    "hedef-kimlik-reddetti": {"hedef_kimlik": False},
    "ad-yalniz-uzakta-cozuluyor": {"ad_yerelde_cozulur": False},
}


def durum(a=None):
    d = dict(SAGLAM)
    if a:
        d.update(BOZUK[a])
    return d


def t_uctan_uca(d):
    if not d["yerel_bagli"] or not d["yerel_adres_dogru"]:
        return "yerel-baglanti-reddedildi"
    if not d["ad_yerelde_cozulur"]:
        return "ad-cozulemedi"
    if not d["sicrama_erisilir"] or not d["sicrama_kimlik"]:
        return "durak-acilmadi"
    if not d["yonlendirme_izinli"]:
        return "kanal-yasak"
    if not d["hedef_erisilir"] or not d["hedef_duvar_gecirir"]:
        return "kanal-zaman-asimi"
    if not d["hedef_dinliyor"]:
        return "kanal-reddedildi"
    return "kuruldu" if d["hedef_kimlik"] else "hedefte-izin-reddedildi"


def t_sicrama_oturumu(d):
    if not d["sicrama_erisilir"]:
        return "erisilemez"
    return "acildi" if d["sicrama_kimlik"] else "izin-reddedildi"


def t_yerel_dinleyen(d):
    if not d["yerel_bagli"]:
        return "bagli-degil"
    return "beklenen-adres" if d["yerel_adres_dogru"] else "baska-adres"


def t_sicramadan_hedefe(d):
    if not d["sicrama_erisilir"] or not d["sicrama_kimlik"]:
        return "yapilamadi"
    if not d["hedef_erisilir"]:
        return "ulasilamaz"
    if not d["hedef_duvar_gecirir"]:
        return "zaman-asimi"
    return "kuruldu" if d["hedef_dinliyor"] else "reddedildi"


def t_yonlendirme_ayari(d):
    if not d["sicrama_erisilir"] or not d["sicrama_kimlik"]:
        return "okunamadi"
    return "izinli" if d["yonlendirme_izinli"] else "kapali"


SINAMA = {"uctan-uca": t_uctan_uca, "yerel-dinleyen": t_yerel_dinleyen,
          "sicrama-oturumu": t_sicrama_oturumu,
          "yonlendirme-ayari": t_yonlendirme_ayari,
          "sicramadan-hedefe": t_sicramadan_hedefe,
          "ad-yeri": lambda d: ("iki-tarafta" if d["ad_yerelde_cozulur"]
                                else "yalniz-uzakta")}
KATMANLI = ["yerel-dinleyen", "ad-yeri", "sicrama-oturumu", "yonlendirme-ayari",
            "sicramadan-hedefe", "uctan-uca"]
UCTAN_ONCE = ["uctan-uca"] + KATMANLI[:-1]


def ele(adaylar, s, yanit):
    return tuple(a for a in adaylar if SINAMA[s](durum(a)) == yanit)


def obek(sinamalar, adaylar=ADAY):
    o = {}
    for a in adaylar:
        o.setdefault(tuple(SINAMA[s](durum(a)) for s in sinamalar), []).append(a)
    return [sorted(v) for v in o.values() if len(v) > 1]


def sira_adimi(sira, gercek, adaylar=ADAY):
    kalan, adim = tuple(adaylar), 0
    for s in sira:
        if len(kalan) <= 1:
            break
        adim += 1
        kalan = ele(kalan, s, SINAMA[s](durum(gercek)))
    return adim, len(kalan)


KAHIN = "hedef-duvar-dusuruyor"
print("aday neden:", len(ADAY), "| sinama:", len(SINAMA), "| kahin:", KAHIN)
print()
print("sinama              ayri yanit  en kotu kalan  elenen  kalan")
for s in SINAMA:
    o = {}
    for a in ADAY:
        o.setdefault(SINAMA[s](durum(a)), []).append(a)
    kalan = len(ele(ADAY, s, SINAMA[s](durum(KAHIN))))
    print(f"  {s:18s} {len(o):11d} {max(len(v) for v in o.values()):14d}"
          f" {len(ADAY) - kalan:7d} {kalan:6d}")
print()
print("ariza                        katmanli  uctan-once  yalniz uctan uca kalan")
tk = tu = 0
for a in ADAY:
    k, _ = sira_adimi(KATMANLI, a)
    u, _ = sira_adimi(UCTAN_ONCE, a)
    _, y = sira_adimi(["uctan-uca"], a)
    tk += k
    tu += u
    print(f"  {a:26s} {k:8d} {u:11d} {y:22d}")
print(f"  {'toplam':26s} {tk:8d} {tu:11d}")
print()
print("arac kumesi                          ayrilamayan obek")
for ad, k in (("yalniz uctan uca", ["uctan-uca"]),
              ("uctan uca + sicrama oturumu", ["uctan-uca", "sicrama-oturumu"]),
              ("uctan uca + sicramadan hedefe",
               ["uctan-uca", "sicramadan-hedefe"]),
              ("yerelde calisan uc sinama",
               ["uctan-uca", "yerel-dinleyen", "ad-yeri"]),
              ("alti sinama", list(SINAMA))):
    o = obek(k)
    print(f"  {ad:35s} {len(o):8d}", o if o else "")
print()
KOMSU, TUNEL = 24, 3
print(f"tunel agzinin bag adresi (bolutte {KOMSU} baska konak , {TUNEL} tunel acik)")
for ad, ulasan in (("geri-dongu", 0), ("tum arayuzler", KOMSU)):
    print(f"  {ad:14s} tunel agzina ulasabilen baska konak {ulasan:3d}"
          f" | dolayli (konak , hedef servis) cifti {ulasan * TUNEL:3d}")
print()
print("aday kumesi supurmesi")
BOZUK["sicrama-oturum-sinirinda"] = {"yonlendirme_izinli": False}
for ad, k in (("9 aday: hedef-kimlik-reddetti yok",
               tuple(a for a in ADAY if a != "hedef-kimlik-reddetti")),
              ("10 aday: temel liste", ADAY),
              ("11 aday: sicrama-oturum-sinirinda eklendi",
               ADAY + ("sicrama-oturum-sinirinda",))):
    kalan = len(ele(k, "uctan-uca", SINAMA["uctan-uca"](durum(KAHIN))))
    o = obek(list(SINAMA), k)
    print(f"  {ad:42s} uctan uca elenen {len(k) - kalan:2d} kalan {kalan:2d}"
          f" | ayrilamayan obek {len(o)}"
          f" en buyuk {max((len(x) for x in o), default=0)}")
```

```
aday neden: 10 | sinama: 6 | kahin: hedef-duvar-dusuruyor

sinama              ayri yanit  en kotu kalan  elenen  kalan
  uctan-uca                    7              2       8      2
  yerel-dinleyen               3              8       2      8
  sicrama-oturumu              3              8       2      8
  yonlendirme-ayari            3              7       3      7
  sicramadan-hedefe            5              5       9      1
  ad-yeri                      2              9       1      9

ariza                        katmanli  uctan-once  yalniz uctan uca kalan
  yerel-bag-noktasi-dolu            1           2                      2
  yerel-adres-yanlis                1           2                      2
  sicrama-erisilemez                3           4                      2
  sicrama-kimlik-reddetti           3           4                      2
  yonlendirme-kapali                4           1                      1
  hedef-erisilemez                  5           6                      2
  hedef-duvar-dusuruyor             5           6                      2
  hedef-dinlemiyor                  5           1                      1
  hedef-kimlik-reddetti             5           1                      1
  ad-yalniz-uzakta-cozuluyor        2           1                      1
  toplam                           34          28

arac kumesi                          ayrilamayan obek
  yalniz uctan uca                           3 [['yerel-adres-yanlis', 'yerel-bag-noktasi-dolu'], ['sicrama-erisilemez', 'sicrama-kimlik-reddetti'], ['hedef-duvar-dusuruyor', 'hedef-erisilemez']]
  uctan uca + sicrama oturumu                2 [['yerel-adres-yanlis', 'yerel-bag-noktasi-dolu'], ['hedef-duvar-dusuruyor', 'hedef-erisilemez']]
  uctan uca + sicramadan hedefe              2 [['yerel-adres-yanlis', 'yerel-bag-noktasi-dolu'], ['sicrama-erisilemez', 'sicrama-kimlik-reddetti']]
  yerelde calisan uc sinama                  2 [['sicrama-erisilemez', 'sicrama-kimlik-reddetti'], ['hedef-duvar-dusuruyor', 'hedef-erisilemez']]
  alti sinama                                0 

tunel agzinin bag adresi (bolutte 24 baska konak , 3 tunel acik)
  geri-dongu     tunel agzina ulasabilen baska konak   0 | dolayli (konak , hedef servis) cifti   0
  tum arayuzler  tunel agzina ulasabilen baska konak  24 | dolayli (konak , hedef servis) cifti  72

aday kumesi supurmesi
  9 aday: hedef-kimlik-reddetti yok          uctan uca elenen  7 kalan  2 | ayrilamayan obek 0 en buyuk 0
  10 aday: temel liste                       uctan uca elenen  8 kalan  2 | ayrilamayan obek 0 en buyuk 0
  11 aday: sicrama-oturum-sinirinda eklendi  uctan uca elenen  9 kalan  2 | ayrilamayan obek 1 en buyuk 2
```

#### Üç Sayı

**Kâhin:** gerçek neden `hedef-duvar-dusuruyor` — hedefin süzgeci paketi sessizce düşürüyor.
**Sınama:** uçtan uca deneme "kanal zaman aşımına uğradı" diyor; sıçrama sunucusundan hedefe
yapılan deneme "zaman aşımı" diyor; yerel dinleyen listesi tünelin beklenen adrese bağlı olduğunu
söylüyor. **Elenen aday:** uçtan uca **8**, duraktan hedefe **9**, yerel dinleyen **2**, ad yeri
**1**.

Uçtan uca deneme bu kurgunun en güçlü tek sınamasıdır: yedi ayrı yanıt üretiyor ve en kötü
durumda geriye yalnız iki aday bırakıyor. Yine de kâhini tek başına bulamıyor, çünkü hedefe
ulaşamamak ile hedefin süzgecinin düşürmesi tünelin içinden **aynı** görünüyor. İkisini ayıran
şey, sıçrama sunucusundan yapılan denemedir: orada "ulaşılamaz" ile "zaman aşımı" farklı
yanıtlardır ve o sınama tek başına dokuz aday eliyor.

Buradan çıkan yerleşim kuralı şudur: sıçrama sunucusu bir geçit olduğu kadar bir **gözlem
noktasıdır**. Hedefe en yakın yerde durur ve orada yapılan deneme, aradaki bütün bacakları
denklemden çıkarır. Bir sıçrama sunucusuna oturum açabilmek, tanıda dokuz adaylık bir eleme
demektir.

#### Sıra ve Ayrılamayan Öbekler

İkinci tablo iki sabit sırayı karşılaştırıyor. Katmanlı sıra istemciden hedefe doğru ilerliyor ve
on arıza için toplam **34** adım harcıyor. Uçtan uca denemeyi başa alan sıra **28** adımda
bitiriyor. İkisi de kâhin bilinmeden uygulanabilir; aradaki altı adımlık fark, uçtan uca
denemenin yedi ayrı yanıt üretmesinden geliyor.

Bu sonuç, tek makinede ölçülen katmanlı yöntemle çelişmez. Orada bağlantı denemesi dört ayrı
yanıt veriyordu; burada tünelin içinden yapılan deneme yediye çıkıyor, çünkü tünel yolun her
durağındaki başarısızlığı **ayrı bir ileti** olarak geri taşıyor. Sınamanın gücü aracın adında
değil, kaç ayrı yanıt ürettiğindedir.

Üçüncü tablo eleme gücünün nerede tükendiğini gösteriyor. Yalnız uçtan uca bakıldığında üç öbek
ayrılamıyor: iki yerel arıza, iki ilk bacak arızası ve hedefin iki sessiz arızası. Sıçrama
oturumu eklendiğinde ikinci öbek çözülüyor, duraktan hedefe denemesi eklendiğinde üçüncüsü. Yerel
üç sınama ise **iki** öbek bırakıyor; içlerinden hiçbiri istemcinin dışına çıkamıyor. Altı sınama
birlikte kullanıldığında ayrılamayan öbek **0**.

#### Aday Kümesi Süpürmesi

Alt tablo aday listesini üç boyda deniyor. `hedef-kimlik-reddetti` çıkarıldığında uçtan uca
denemenin elediği aday sekizden yediye iniyor ve kalan yine iki. Listeye
`sicrama-oturum-sinirinda` eklendiğinde elenen dokuza **çıkıyor** ve kalan yine iki; buna karşılık
altı sınamanın hepsiyle bile ayrılamayan bir öbek **doğuyor**, çünkü yeni aday
`yonlendirme-kapali` ile bütün sınamalarda aynı yanıtı veriyor.

Bir ayrıntı bu ölçümün dışında kalır ve yazılması gerekir. Tünelin kanal hatası **istemcinin
uçbiriminde bir kez** görünür ve hiçbir yere yazılmaz. Tünel arka planda açılmışsa o tek satır
da görünmez; geriye yalnız çalışmayan bir bağlantı kalır. Duraktaki oturumun kaydı sıçrama
sunucusunun günlüğündedir, kanalın açılıp kapandığı ise oradaki ayrıntı düzeyine bağlıdır.
**Kanıt beklemez:** kanal hatasını sonradan aramak, ayrıntı düzeyi arıza anında yeterliyse
sonuç verir.

Bu üç satır, önceki dersin kuralını başka bir yönden gösteriyor. Orada eleme sayısı sabit kalırken
kalan büyümüştü; burada eleme sayısı büyürken **ayırt edilebilirlik** düşüyor. İki durumda da
elemenin kendisi bir başarı ölçüsü değildir. Bir aday kümesi ancak sınamaların yanıt desenleri
onu tek tek ayırabiliyorsa çözülmüş sayılır ve bunun ölçüsü, ayrılamayan öbek sayısıdır.

#### Özet

- Sıçrama sunucusu yolu ikiye böler: tünel biçiminde istemcide bir ağız açılır, durak biçiminde
  oturum doğrudan hedefte açılır ve sıçrama sunucusu yalnız taşır.
- Hedefin adı sıçrama sunucusunda çözülür; aynı ad istemcinin yapılandırmasında yazılıysa istemci
  onu çözmeye çalışır ve ortaya sunucuda var olmayan bir ad çözümleme arızası çıkar.
- Tünel ağzının bağ adresi açık yüzeyi belirler: geri döngüde dolaylı erişilebilir çift **0**,
  bütün arayüzlerde bölütteki 24 konak ve 3 tünel için **72**.
- On aday nedende uçtan uca deneme yedi ayrı yanıt verip **8** aday eliyor, sıçrama sunucusundan
  hedefe yapılan deneme **9** eliyor ve tek başına çözüyor; ad çözümlemenin yeri yalnız **1**
  eliyor.
- Katmanlı sıra **34**, uçtan uca denemeyi başa alan sıra **28** adım harcıyor; ikisi de kâhin
  bilinmeden uygulanabilir.
- Aday listesine bir madde eklendiğinde elenen sayısı sekizden dokuza çıkarken ayrılamayan öbek
  sıfırdan bire yükseliyor; ölçü eleme değil, ayırt edilebilirliktir.

#### Sonraki Adım

Bu dersin kâhini hedefin süzgeciydi ve tünelin içinden bakıldığında o süzgeç, hedefe hiç
ulaşılamamasından ayırt edilemiyordu. Sessizce düşürülen paket bu kursun en zor izlenen olayıdır,
çünkü geriye hiçbir şey göndermez. Sonraki ders o süzgecin içine girer: paketin bir makinenin
içinde hangi duraklardan geçtiğini, kuralların hangi sırayla değerlendirildiğini ve bir paketin
hangi durakta düştüğünü hangi okumanın gösterebildiğini kurar.

### Paket Filtreleme Çerçevesi

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/paket-filtreleme-cercevesi

Paketin makine içinde geçtiği yedi durak, tablo ve zincir ayrımı ile kural değerlendirme sırası kurulur; otuz dört satırlık kural listesinin sıfır, yüklü makinede sayaç okumasının sıfır, sessiz makinede altı, açık iz sürmenin sekiz aday elediği sayılır.

Önceki dersin kâhini hedefin süzgeciydi ve tünelin içinden bakıldığında o süzgeç, hedefe hiç
ulaşılamamasından ayırt edilemiyordu. Sessizce düşürülen paket geriye hiçbir şey göndermez;
gönderen için zaman aşımı, alan için hiçbir olay yoktur. Bu ders süzgecin içine girer.

Sorulacak soru yer sorusudur: bir paket bu makinenin içinde nereye kadar geldi ve **hangi durakta**
karar verildi. Bu sorunun cevabı bir kural listesinde yazmaz. Liste neyin **olabileceğini**
gösterir; hangi kuralın gerçekten çalıştığını göstermez ve bu iki cümle arasındaki fark, dersin
ölçtüğü şeydir.

#### Duraklar, Tablolar ve Zincirler

Paket filtreleme çerçevesi, çekirdeğin ağ yığınında sabit noktalara yerleştirilmiş **duraklardan**
oluşur. Her durakta bir ya da birden çok **zincir** bulunur ve zincirler **tablolara** göre
öbeklenir. Tablo bir amaçtır: ham işleme, işaretleme, adres dönüştürme ve süzme. Zincir o
amacın belirli bir duraktaki kural listesidir. Aynı durakta birden çok tablonun zinciri bulunuyorsa
sıraları tablo önceliğine göre sabittir.

Paketin izlediği yol, yönlendirme kararından sonra ikiye ayrılır. Aşağıdaki döküm çalıştırılmamıştır;
duraklar arasındaki sırayı göstermek için yazılmıştır:

```text
# ornek dokum , calistirilmamistir
# yerel bir surece giden paket
arayuz -> oncesi-ham -> oncesi-donusturme -> yonlendirme-karari
       -> giris-isaretleme -> giris-suzme -> servis

# baska bir arayuze iletilen paket
arayuz -> oncesi-ham -> oncesi-donusturme -> yonlendirme-karari
       -> iletme-suzme -> cikis-sonrasi -> cikis-arayuzu
```

İki yol yönlendirme kararına kadar aynıdır ve oradan sonra bir daha birleşmez. Bu, tanıda sık
yapılan bir hatanın kaynağıdır: yerel servise ulaşmayan bir paket için iletme zinciri incelenir,
oysa paket oraya hiç uğramamıştır. Ya da tersi olur ve iletilecek bir paket için giriş zincirine
kural yazılır. **Zincirin adı kararın verildiği yeri söyler**; kararın verildiği yer paketin
izlediği yola bağlıdır.

Bir zincirin iki bileşeni vardır: sıralı kurallar ve bir **politika**. Kurallar yukarıdan aşağı
değerlendirilir, **ilk eşleşen kural** kararı verir ve zincirin geri kalanı çalışmaz. Hiçbir kural
eşleşmezse politika uygulanır. Aşağıdaki döküm de çalıştırılmamıştır ve bir çerçevenin gerçek
yazımı değildir; zincir, politika ve sıra kavramlarının yerleşimini göstermek için sadeleştirilmiş
bir gösterimdir:

```text
# ornek dokum , calistirilmamistir , gercek yazim degildir
tablo suzme
  zincir giris   politika reddet
    1  durum kurulu ya da iliskili        -> kabul
    2  arayuz geri-dongu                  -> kabul
    3  hedef nokta <yonetim-noktasi>      -> kabul
  zincir iletme  politika reddet
  zincir cikis   politika kabul
```

Kural değerlendirme sırasının **tek bir liste içinde** neyi değiştirdiği, **Siber Güvenlik**
müfredatının erişim denetim listeleri dersinde ölçüldü. Burada ölçülen şey bir liste içi sıra
değil, **duraklar arası sıradır**: bir paket bir durakta karar bulduğunda sonraki durakların
zincirleri hiç çalışmaz ve oraya yazılan kural hiçbir şey yapmaz.

#### Karar Hangi Durakta Veriliyor

Kurgu şudur: uzaktaki bir istemci bu makinedeki bir servise ulaşamıyor. Dokuz aday neden var ve
her biri kararı **belirli bir durakta** verdiriyor.

- **EF21** — Aday neden listesi **dokuz** maddedir ve tüketicidir. Üçü giriş süzme zincirinde,
  ikisi iletme yolunda, biri ham durakta, biri işaretleme durağında, biri arayüzden önce, biri
  servistedir.
- **EF22** — Kâhin `giris-varsayilan-reddetti` seçilmiştir: hiçbir kural eşleşmiyor ve zincir
  politikası paketi reddediyor.
- **EF23** — Kural kümesi **dokuz durumda da aynıdır** ve **34** satırdır; değişen şey paketin
  akıbetidir, yapılandırma değil.
- **EF24** — Sekiz okuma tanımlıdır ve dördü ikişer koşulda ölçülür: sayaç okuması yüklü ve
  sessiz makinede, iz sürme açık ve kapalı.
- **EF25** — Yüklü makinede arka plan trafiği bütün zincir sayaçlarını artırır; sayaç farkı
  sınama paketine bağlanamaz.
- **EF26** — İz sürme **arıza öncesinde** açılmış olmalıdır; kapalıyken üretilen satır **0**.
- **EF27** — İz sürme durağı ve nedeni birlikte bildirir; aynı durakta aynı nedenle düşen iki
  aday onunla da ayrılamaz.
- **EF28** — Kabul kuralı giriş süzme zincirine iki konumda eklenir: başa ve sona. Sona eklenen
  kural, kendisinden önce eşleşen bir kural varsa hiç değerlendirilmez.
- **EF29** — Aday kümesi süpürmesi sekiz, dokuz ve on adaylı listelerle yapılır.
- **EF30** — Bütün sayılar tam sayımdır; rastgelelik ve tohum yoktur.

```python
"""Paketin makine icindeki duraklari: karar hangi durakta , hangi okuma goruyor."""
YEREL = ("arayuz", "oncesi-ham", "oncesi-donusturme", "yonlendirme-karari",
         "giris-isaretleme", "giris-suzme", "servis")
ILETME = ("arayuz", "oncesi-ham", "oncesi-donusturme", "yonlendirme-karari",
          "iletme-suzme", "cikis-sonrasi", "cikis-arayuzu")
YOL = {"yerel": YEREL, "iletme": ILETME}
ZINCIR = {"oncesi-ham", "oncesi-donusturme", "giris-isaretleme", "giris-suzme",
          "iletme-suzme", "cikis-sonrasi"}
ADAY = {
    "paket-hic-gelmedi": ("yerel", 0, "yok"),
    "oncesi-ham-dusurdu": ("yerel", 1, "kural"),
    "giris-isaretleme-dusurdu": ("yerel", 4, "kural"),
    "giris-suzme-kural-dusurdu": ("yerel", 5, "kural"),
    "giris-varsayilan-reddetti": ("yerel", 5, "politika"),
    "durum-kurali-yok": ("yerel", 5, "kural"),
    "donusturme-yanlis-hedef": ("iletme", 4, "kural"),
    "yonlendirme-yanlis": ("iletme", 4, "kural"),
    "servis-dinlemiyor": ("yerel", 6, "servis"),
}
KURAL_SATIRI = 34
KAHIN = "giris-varsayilan-reddetti"


def son_durak(a):
    yol, i, _ = ADAY[a]
    return YOL[yol][i]


def ulasilmayan(a):
    yol, i, _ = ADAY[a]
    return len(YOL[yol]) - (i + 1)


SINAMA = {
    "kural-listesi": lambda a: f"{KURAL_SATIRI}-satir",
    "arayuzde-yakalama": lambda a: "gelmedi" if ADAY[a][1] == 0 else "geldi",
    "cikis-yakalama": lambda a: "cikti" if ADAY[a][0] == "iletme" else "cikmadi",
    "baglanti-denemesi": lambda a: ("reddedildi" if ADAY[a][2] == "servis"
                                    else "zaman-asimi"),
    "sayac-yuklu": lambda a: "butun-sayaclar-artti",
    "sayac-sessiz": lambda a: (son_durak(a) if son_durak(a) in ZINCIR
                               else "sayac-yok"),
    "iz-kapali": lambda a: "satir-yok",
    "iz-acik": lambda a: f"{son_durak(a)}/{ADAY[a][2]}",
}
SATIR = {"kural-listesi": KURAL_SATIRI, "arayuzde-yakalama": 6,
         "cikis-yakalama": 6, "baglanti-denemesi": 1, "sayac-yuklu": 34,
         "sayac-sessiz": 34, "iz-kapali": 0, "iz-acik": 12}


def ele(adaylar, s, yanit):
    return tuple(a for a in adaylar if SINAMA[s](a) == yanit)


def obek(sinamalar, adaylar):
    o = {}
    for a in adaylar:
        o.setdefault(tuple(SINAMA[s](a) for s in sinamalar), []).append(a)
    return [sorted(v) for v in o.values() if len(v) > 1]


A = tuple(ADAY)
print("aday neden:", len(A), "| sinama:", len(SINAMA), "| kahin:", KAHIN)
print()
print("aday                        yol      son durak          ulasilmayan durak")
for a in A:
    print(f"  {a:26s} {ADAY[a][0]:7s}  {son_durak(a):18s} {ulasilmayan(a):9d}")
print("  toplam ulasilmayan durak:", sum(ulasilmayan(a) for a in A))
print()
print("sinama              satir  ayri yanit  elenen  kalan")
for s in SINAMA:
    kalan = len(ele(A, s, SINAMA[s](KAHIN)))
    print(f"  {s:18s} {SATIR[s]:5d} {len({SINAMA[s](a) for a in A}):11d}"
          f" {len(A) - kalan:7d} {kalan:6d}")
print()
print("arac kumesi                         satir  ayrilamayan obek")
for ad, k in (("yalniz kural listesi", ["kural-listesi"]),
              ("liste + baglanti denemesi",
               ["kural-listesi", "baglanti-denemesi"]),
              ("yuklu makinede dort okuma",
               ["kural-listesi", "arayuzde-yakalama", "baglanti-denemesi",
                "sayac-yuklu"]),
              ("sessiz makinede dort okuma",
               ["kural-listesi", "arayuzde-yakalama", "baglanti-denemesi",
                "sayac-sessiz"]),
              ("iz surme acik", ["iz-acik"])):
    o = obek(k, A)
    print(f"  {ad:34s} {sum(SATIR[s] for s in k):5d} {len(o):8d}")
    if o:
        for x in o:
            print(f"      {x}")
print()
print("giris-suzme zincirine eklenen kabul kurali kac arizayi duzeltir")
for ad, kosul in (
        ("zincirin basina", lambda a: ADAY[a][0] == "yerel" and ADAY[a][1] == 5),
        ("zincirin sonuna",
         lambda a: ADAY[a][0] == "yerel" and ADAY[a][1] == 5
         and ADAY[a][2] == "politika")):
    d = [a for a in A if kosul(a)]
    print(f"  {ad:16s} duzelen {len(d)} / {len(A)}", d)
print()
print("aday kumesi supurmesi")
ADAY["giris-suzme-yanlis-arayuz"] = ("yerel", 5, "kural")
for ad, k in (("8 aday: durum-kurali-yok cikarildi",
               tuple(a for a in A if a != "durum-kurali-yok")),
              ("9 aday: temel liste", A),
              ("10 aday: giris-suzme-yanlis-arayuz eklendi",
               A + ("giris-suzme-yanlis-arayuz",))):
    kalan = len(ele(k, "sayac-sessiz", SINAMA["sayac-sessiz"](KAHIN)))
    o = obek(["iz-acik"], k)
    print(f"  {ad:42s} sessiz sayac elenen {len(k) - kalan:2d} kalan {kalan:2d}"
          f" | iz surmenin ayiramadigi obek {len(o)}"
          f" en buyuk {max((len(x) for x in o), default=0)}")
```

```
aday neden: 9 | sinama: 8 | kahin: giris-varsayilan-reddetti

aday                        yol      son durak          ulasilmayan durak
  paket-hic-gelmedi          yerel    arayuz                     6
  oncesi-ham-dusurdu         yerel    oncesi-ham                 5
  giris-isaretleme-dusurdu   yerel    giris-isaretleme           2
  giris-suzme-kural-dusurdu  yerel    giris-suzme                1
  giris-varsayilan-reddetti  yerel    giris-suzme                1
  durum-kurali-yok           yerel    giris-suzme                1
  donusturme-yanlis-hedef    iletme   iletme-suzme               2
  yonlendirme-yanlis         iletme   iletme-suzme               2
  servis-dinlemiyor          yerel    servis                     0
  toplam ulasilmayan durak: 20

sinama              satir  ayri yanit  elenen  kalan
  kural-listesi         34           1       0      9
  arayuzde-yakalama      6           2       1      8
  cikis-yakalama         6           2       2      7
  baglanti-denemesi      1           2       1      8
  sayac-yuklu           34           1       0      9
  sayac-sessiz          34           5       6      3
  iz-kapali              0           1       0      9
  iz-acik               12           7       8      1

arac kumesi                         satir  ayrilamayan obek
  yalniz kural listesi                  34        1
      ['donusturme-yanlis-hedef', 'durum-kurali-yok', 'giris-isaretleme-dusurdu', 'giris-suzme-kural-dusurdu', 'giris-varsayilan-reddetti', 'oncesi-ham-dusurdu', 'paket-hic-gelmedi', 'servis-dinlemiyor', 'yonlendirme-yanlis']
  liste + baglanti denemesi             35        1
      ['donusturme-yanlis-hedef', 'durum-kurali-yok', 'giris-isaretleme-dusurdu', 'giris-suzme-kural-dusurdu', 'giris-varsayilan-reddetti', 'oncesi-ham-dusurdu', 'paket-hic-gelmedi', 'yonlendirme-yanlis']
  yuklu makinede dort okuma             75        1
      ['donusturme-yanlis-hedef', 'durum-kurali-yok', 'giris-isaretleme-dusurdu', 'giris-suzme-kural-dusurdu', 'giris-varsayilan-reddetti', 'oncesi-ham-dusurdu', 'yonlendirme-yanlis']
  sessiz makinede dort okuma            75        2
      ['durum-kurali-yok', 'giris-suzme-kural-dusurdu', 'giris-varsayilan-reddetti']
      ['donusturme-yanlis-hedef', 'yonlendirme-yanlis']
  iz surme acik                         12        2
      ['durum-kurali-yok', 'giris-suzme-kural-dusurdu']
      ['donusturme-yanlis-hedef', 'yonlendirme-yanlis']

giris-suzme zincirine eklenen kabul kurali kac arizayi duzeltir
  zincirin basina  duzelen 3 / 9 ['giris-suzme-kural-dusurdu', 'giris-varsayilan-reddetti', 'durum-kurali-yok']
  zincirin sonuna  duzelen 1 / 9 ['giris-varsayilan-reddetti']

aday kumesi supurmesi
  8 aday: durum-kurali-yok cikarildi         sessiz sayac elenen  6 kalan  2 | iz surmenin ayiramadigi obek 1 en buyuk 2
  9 aday: temel liste                        sessiz sayac elenen  6 kalan  3 | iz surmenin ayiramadigi obek 2 en buyuk 2
  10 aday: giris-suzme-yanlis-arayuz eklendi sessiz sayac elenen  6 kalan  4 | iz surmenin ayiramadigi obek 2 en buyuk 3
```

#### Üç Sayı

**Kâhin:** karar `giris-suzme` durağında, hiçbir kural eşleşmediği için **politika** tarafından
veriliyor. **Sınama:** kural listesi otuz dört satır basıyor; yüklü makinede sayaç okuması otuz
dört sayı veriyor; sessiz makinede aynı okuma zincir adını veriyor; açık iz sürme on iki satırda
"giris-suzme/politika" diyor. **Elenen aday:** kural listesi **0**, yüklü sayaç **0**, kapalı iz
sürme **0**, bağlantı denemesi **1**, sessiz sayaç **6**, açık iz sürme **8**.

Üstteki üç sıfır bu dersin sonucudur. Kural listesi otuz dört satırlık bir çıktıdır ve dokuz
adayın hiçbirini elemez, çünkü **dokuz durumda da aynı listedir**. Liste yapılandırmayı gösterir,
paketin akıbetini değil. Sayısı en yüksek çıktı, eleme gücü en düşük olanla aynı satırda duruyor:
**daha çok çıktı daha iyi tanı demek değildir.**

Bağlantı denemesi bir satır basıyor ve bir aday eliyor. Oranı kural listesinden sonsuz kat iyidir,
ama mutlak değeri düşüktür ve nedeni ortak tanımda kurulmuştu: düşürülen paket zaman aşımı
üretir, reddedilen paket ise ayrı bir yanıt verir. Dokuz adayın sekizi zaman aşımı üretiyor.

#### Sayaç Neyi Kanıtlar

Sayaç okumasının iki satırı arasındaki fark, bu dersin en pratik bulgusudur. Sessiz makinede
sayaç beş ayrı yanıt veriyor ve **altı** aday eliyor: hangi zincirin sayacı arttıysa karar orada
verilmiştir. Yüklü makinede aynı okuma **tek** bir yanıt veriyor ve **sıfır** aday eliyor, çünkü
arka plan trafiği bütün zincirlerin sayaçlarını artırmaktadır. Sayaç farkı vardır, sınama
paketine ait olduğu **gösterilemez**.

Bu yüzden sayaç okuması bir yordam olarak tek başına yazılamaz. Ölçülebilir hâle gelmesi için ya
trafiğin durması ya da sayacın sınama öncesinde sıfırlanıp yalnız bir paket gönderilmesi gerekir;
ikincisi çalışan bir sistemde her zaman yapılamaz. Sayacın verdiği bilgi, makinenin **ne kadar
sessiz** olduğuna bağlıdır ve bu bir araç özelliği değil, ortam özelliğidir.

İz sürmenin iki satırı aynı dersi zaman ekseninde veriyor. Açıkken on iki satır üretiyor ve sekiz
aday eliyor; kapalıyken **sıfır satır** ve sıfır aday. Aradaki fark bir ayardır ve o ayar arızadan
**önce** açılmış olmalıdır. Arızadan sonra iz sürmeyi açmak, geçmişteki paketi geri getirmez.
**Kanıt beklemez.**

Açık iz sürme bile her şeyi ayıramıyor. İki öbek kalıyor: aynı zincirde aynı nedenle düşen kural
arızası ile durum kuralının eksikliği ve iletme yolunda düşen iki arıza. İz sürme durağı ve
nedeni söyler; **hangi kuralın** eşleştiğini söylemesi ayrı bir ayrıntı düzeyi gerektirir.

#### Kuralı Nereye Eklemek İşe Yarar

Alt tablo çerçevenin en pahalı yanlış anlamasını sayıyor. Giriş süzme zincirine bir kabul kuralı
eklendiğinde dokuz arızadan kaçı düzelir: kural zincirin **başına** eklenirse **3**, **sonuna**
eklenirse **1**.

İki sayı arasındaki fark ilk eşleşen kural kuralından gelir. Sona eklenen kabul kuralı, kendisinden
önce eşleşen bir düşürme kuralı varsa hiç değerlendirilmez; yalnız hiçbir kuralın eşleşmediği
durumu, yani politikanın devreye girdiği durumu düzeltir. Kural eklendi, liste uzadı, çıktı
"başarılı" döndü ve arıza sürüyor.

Kalan altı arıza için konumun hiçbir önemi yoktur, çünkü paket o zincire **hiç uğramıyor**. Üst
tablonun son sütunu bunu sayıyor: dokuz arıza için ulaşılmayan durak toplamı **20**. Paket ham
durakta düşmüşse sonraki beş durak, işaretleme durağında düşmüşse sonraki iki durak hiç
çalışmamıştır. O duraklara yazılan her kural, doğru yazılmış olsa bile ölü kuraldır.

Buradan çıkan sıra kuralı şudur: bir kural eklemeden önce kararın **hangi durakta** verildiği
bulunur. Bu sıra tersine çevrildiğinde ortaya çıkan şey bir hata iletisi değil, işe yaramayan bir
düzeltme ve büyüyen bir kural kümesidir.

#### Aday Kümesi Süpürmesi

Alt tablo aday listesini üç boyda deniyor ve sonuç önceki iki dersle aynı yöne bakıyor. Sessiz
sayacın elediği aday sayısı üç listede de **6**; kalan sayısı **2**, **3** ve **4**. Aday listesi
büyüdükçe aynı okuma aynı sayıda adayı eliyor ve geriye daha fazlasını bırakıyor. İz sürmenin
ayıramadığı en büyük öbek iki üyeden üçe çıkıyor, çünkü eklenen aday aynı durakta aynı nedenle
düşüyor.

#### Özet

- Paket filtreleme çerçevesi sabit duraklardan oluşur; her durakta tablolara göre öbeklenmiş
  zincirler bulunur ve yönlendirme kararından sonra yerel yol ile iletme yolu bir daha birleşmez.
- Zincirde ilk eşleşen kural kararı verir ve geri kalanı çalışmaz; hiçbir kural eşleşmezse
  politika uygulanır.
- Otuz dört satırlık kural listesi dokuz adayın **hiçbirini** elemez, çünkü dokuz durumda da
  aynıdır. Yüklü makinede sayaç okuması da **0** eler; sessiz makinede **6**, açık iz sürme **8**.
- İz sürme kapalıyken **0 satır** üretir ve arızadan sonra açmak geçmiş paketi geri getirmez.
- Giriş süzme zincirine eklenen kabul kuralı başa konursa **3**, sona konursa **1** arızayı
  düzeltir; kalan altı arızada paket o zincire hiç uğramaz. Dokuz arıza için ulaşılmayan durak
  toplamı **20**.

#### Sonraki Adım

Bu ders kararın nerede verildiğini sordu ve kâhin olarak politikayı seçti: hiçbir kural
eşleşmediği için zincirin varsayılanı devreye girmişti. Sonraki ders o varsayılanın kendisini ele
alır. Varsayılan reddet politikası bir güvenlik kararıdır ve uygulanma **sırası** bir işletim
kararıdır; yanlış sırada uygulandığında yöneticinin kendi erişimini kesebilir. Ölçülecek şey,
uygulama sıralarının kaçının bu sonucu verdiği ve hangi yolların bedeli sıfıra indirdiğidir.

### Güvenlik Duvarı Kuralları

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/guvenlik-duvari-kurallari

Varsayılan reddet politikasının beş adımı yüz yirmi sırada uygulanır; kırkı tam, yirmisi yarım kilitlenme üretir, son kural kümesi yüz yirmi sıranın hepsinde aynı olduğu için kuru çalışma bunların sıfırını önler ve yazım hatalarında kuru çalışma beş, uçtan deneme beş aday eler.

Önceki ders kararın hangi durakta verildiğini sordu ve kâhin olarak politikayı seçti: hiçbir kural
eşleşmediği için zincirin varsayılanı devreye girmişti. O varsayılan bir kaza değil, bir tercihtir.
Bu ders o tercihi ve onu kurma işini ele alır.

Varsayılan reddet politikası tek bir satırdır ve o satırın **ne zaman** yazıldığı, ne yazdığından
daha çok sonuç doğurur. Bu dersin ölçtüğü şey kuralların içeriği değil, **uygulanma sırasıdır**;
ve bu sıranın yanlış seçilmesi, yöneticinin makineyle arasındaki tek yolu kesebilir.

#### Varsayılan Reddet ve Meşru Akışlar

**Varsayılan reddet** (default deny), bir zincirin politikasını "eşleşmeyen her şeyi reddet"
olarak kurmaktır. Karşıtı varsayılan kabuldür: eşleşmeyen her şey geçer ve yasaklamak istediğiniz
her durumu tek tek yazmanız gerekir. İkisi arasındaki fark bir kural sayısı farkı değil, bir
**hata yönü** farkıdır. Varsayılan kabulde unutulan kural bir açıklık üretir; varsayılan reddette
unutulan kural bir kesinti üretir. Kesinti görülür, açıklık görülmez.

Varsayılan reddet kurulurken ayakta tutulması gereken meşru akışlar vardır ve bu kurguda dört
tanedir. **Geri döngü** akışı makinenin kendi süreçlerinin birbiriyle konuşmasıdır. **Kurulu
bağlantı** akışı, halihazırda açık oturumların geri dönüş paketleridir. **Yönetim** akışı
yöneticinin bu makineye ulaşma yoludur. **Hizmet** akışı makinenin dışarıya sunduğu servistir.
Her biri bir kuralla ayakta kalır.

Beş adım vardır ve dördü izin, biri politikadır. Aşağıdaki döküm çalıştırılmamıştır ve
çalıştırılabilir bir komut dizisi değildir; yalnız adımların adlarını ve iki sıralamanın farkını
göstermek için yazılmıştır:

```text
# ornek dokum , calistirilabilir bir dizi degildir
# guvenli sira: reddet politikasi EN SONA birakilir
1 geri-dongu-izni
2 kurulu-baglanti-izni
3 yonetim-izni
4 hizmet-izni
5 varsayilan-reddet

# kilitleyen sira: reddet , yonetim ve kurulu izinlerinden ONCE
1 varsayilan-reddet     <- uzak oturum bu adimda duser
2 ...                   <- kalan adimlar uygulanamaz
```

**Kilitlenme** (lockout), yöneticinin kendi erişimini kesmesidir. Bu sözcük **İşletim
Sistemi Kavramları** kursundaki `deadlock` karşılığıyla aynıdır ama olay aynı değildir:
orada birbirini bekleyen iki iş parçacığı vardır ve hiçbiri ilerleyemez, burada tek bir
yönetici vardır ve kendi kanalını kapatmıştır. Ortak yanları yalnız sonucun geri
döndürülemez görünmesidir.

#### Yüz Yirmi Sıra

Kurgu şudur: beş adım bir makinede uygulanacak ve yönetici uzaktan bağlıdır. Adımların sırası
serbesttir; bütün sıralar tüketici olarak sayılır.

- **EF31** — Beş adımın **120** sırası tam sayımla üretilir; örnekleme ve tohum yoktur.
- **EF32** — Yöneticinin oturumu, reddet politikası uygulandığında **yönetim izni** ya da
  **kurulu bağlantı izni** kurallarından en az biri yerindeyse ayakta kalır.
- **EF33** — Oturum düştüğünde kalan adımlar **uygulanamaz**; sıra orada kesilir.
- **EF34** — Kurulu bağlantı izni verilip yönetim izni verilmeden reddet uygulanırsa mevcut
  oturum yaşar, **yeni bağlantı kurulamaz**; bu duruma yarım kilitlenme denir.
- **EF35** — Geri alma zamanlayıcısı **120 saniyeye** kurulur; süre dolduğunda önceki kural
  kümesi geri yüklenir.
- **EF36** — Kural yazımı ölçümünde **yedi aday** vardır: altı yazım hatası ve hatasız durum.
- **EF37** — Kuru çalışma, uygulanacak kural kümesini uygulamadan üretir ve **yapısal** hataları
  görür; niyeti bilmediği için yanlış yazılmış bir bağlantı noktasını göremez.
- **EF38** — Uçtan deneme dört meşru akışın hepsini yoklar; bu yüzden altı hatanın hepsini
  görür, ama kural kümesinin **uygulanmış** olmasını gerektirir.
- **EF39** — Aday kümesi süpürmesi altı, yedi ve sekiz adaylı listelerle yapılır.
- **EF40** — Bütün sayılar tam sayımdır; rastgelelik ve tohum yoktur.

```python
"""Varsayilan reddet: uygulama sirasi ve kural yazim hatalari.

Bolum 1 - bes adimin 120 sirasi tuketici sayilir , kac sira kilitlenme uretir.
Bolum 2 - yedi aday (alti yazim hatasi ve hatasiz durum) , dort okuma.
"""
from itertools import permutations

ADIM = ("geri-dongu-izni", "kurulu-baglanti-izni", "yonetim-izni",
        "hizmet-izni", "varsayilan-reddet")
GERI_ALMA = 120


def uygula(sira):
    """Reddet politikasi uygulanirken yonetim ya da kurulu izni yoksa uzak
    oturum duser; kalan adimlar uygulanamaz."""
    var = set()
    for i, a in enumerate(sira):
        var.add(a)
        if a == "varsayilan-reddet":
            if not ({"yonetim-izni", "kurulu-baglanti-izni"} & var):
                return "tam-kilitlenme", i + 1, len(sira) - (i + 1)
            if "yonetim-izni" not in var:
                return "yarim-kilitlenme", i + 1, 0
    return "guvenli", len(sira), 0


SIRALAR = list(permutations(ADIM))
SONUC = [uygula(s) for s in SIRALAR]
SAYIM = {}
for tur, _, _ in SONUC:
    SAYIM[tur] = SAYIM.get(tur, 0) + 1
print("bes adimin butun siralari:", len(SIRALAR))
for tur in ("guvenli", "yarim-kilitlenme", "tam-kilitlenme"):
    print(f"  {tur:18s} {SAYIM.get(tur, 0):3d} / {len(SIRALAR)}"
          f"  oran {SAYIM.get(tur, 0) / len(SIRALAR):.4f}")
print("  tam kilitlenmede uygulanamayan adim toplami:",
      sum(u for t, _, u in SONUC if t == "tam-kilitlenme"))
print("  son kural kumesi kac ayri bicimde bitiyor:",
      len({frozenset(s) for s in SIRALAR}))
print()
TAM = SAYIM["tam-kilitlenme"]
print("uygulama bicimi         kilitlenme  harici mudahale  kesinti (sn)"
      "  kuru calismanin onledigi")
for ad, kilit, mudahale, kesinti, kuru in (
        ("duz uygulama", TAM, TAM, 0, 0),
        ("kuru calisma sonrasi", TAM, TAM, 0, 0),
        ("zamanlayiciyla geri alma", TAM, 0, TAM * GERI_ALMA, 0),
        ("ayri yonetim kanali", TAM, 0, 0, 0),
        ("atomik yukleme", 0, 0, 0, 0)):
    print(f"  {ad:23s} {kilit:10d} {mudahale:16d} {kesinti:13d} {kuru:27d}")
print()
HATA = {
    "sozdizimi-hatasi": (True, True, "yonetim-akisi-kesildi"),
    "kural-yanlis-zincirde": (False, True, "yonetim-akisi-kesildi"),
    "kural-sirasi-golgeliyor": (False, True, "hizmet-akisi-kesildi"),
    "durum-kurali-eksik": (False, True, "geri-donus-kesildi"),
    "yanlis-arayuz-adi": (False, True, "yonetim-akisi-kesildi"),
    "yanlis-bag-noktasi": (False, False, "hizmet-akisi-kesildi"),
    "hata-yok": (False, False, "hepsi-gecti"),
}
KAHIN = "yanlis-bag-noktasi"
SINAMA = {
    "sozdizim-denetimi": lambda a: "hata" if HATA[a][0] else "temiz",
    "kural-listesi": lambda a: ("kural-yok" if a == "sozdizimi-hatasi"
                                else "baska-zincirde"
                                if a == "kural-yanlis-zincirde" else "yerinde"),
    "kuru-calisma": lambda a: a if HATA[a][1] else "temiz",
    "uctan-deneme": lambda a: HATA[a][2],
}
RISK = {"sozdizim-denetimi": 0, "kural-listesi": 0, "kuru-calisma": 0,
        "uctan-deneme": sum(1 for a in HATA
                            if HATA[a][2] == "yonetim-akisi-kesildi")}
A = tuple(HATA)


def ele(adaylar, s, yanit):
    return tuple(a for a in adaylar if SINAMA[s](a) == yanit)


def obek(sinamalar, adaylar):
    o = {}
    for a in adaylar:
        o.setdefault(tuple(SINAMA[s](a) for s in sinamalar), []).append(a)
    return [sorted(v) for v in o.values() if len(v) > 1]


print("aday:", len(A), "| kahin:", KAHIN)
print()
print("okuma               ayri yanit  elenen  kalan  yonetimi kesme riski")
for s in SINAMA:
    kalan = len(ele(A, s, SINAMA[s](KAHIN)))
    print(f"  {s:18s} {len({SINAMA[s](a) for a in A}):11d} {len(A) - kalan:7d}"
          f" {kalan:6d} {RISK[s]:20d}")
print()
print("okuma kumesi                       ayrilamayan obek")
for ad, k in (("yalniz sozdizim denetimi", ["sozdizim-denetimi"]),
              ("sozdizim + kural listesi",
               ["sozdizim-denetimi", "kural-listesi"]),
              ("kuru calisma", ["kuru-calisma"]),
              ("uctan deneme", ["uctan-deneme"]),
              ("kuru calisma + uctan deneme",
               ["kuru-calisma", "uctan-deneme"])):
    o = obek(k, A)
    print(f"  {ad:34s} {len(o):8d}", o if o else "")
print()
print("aday kumesi supurmesi")
HATA["yanlis-kaynak-araligi"] = (False, False, "hizmet-akisi-kesildi")
for ad, k in (("6 aday: durum-kurali-eksik cikarildi",
               tuple(a for a in A if a != "durum-kurali-eksik")),
              ("7 aday: temel liste", A),
              ("8 aday: yanlis-kaynak-araligi eklendi",
               A + ("yanlis-kaynak-araligi",))):
    kalan = len(ele(k, "kuru-calisma", SINAMA["kuru-calisma"](KAHIN)))
    o = obek(["kuru-calisma", "uctan-deneme"], k)
    print(f"  {ad:38s} kuru calisma elenen {len(k) - kalan:2d} kalan {kalan:2d}"
          f" | iki okuma birlikte ayrilamayan obek {len(o)}"
          f" en buyuk {max((len(x) for x in o), default=0)}")
```

```
bes adimin butun siralari: 120
  guvenli             60 / 120  oran 0.5000
  yarim-kilitlenme    20 / 120  oran 0.1667
  tam-kilitlenme      40 / 120  oran 0.3333
  tam kilitlenmede uygulanamayan adim toplami: 140
  son kural kumesi kac ayri bicimde bitiyor: 1

uygulama bicimi         kilitlenme  harici mudahale  kesinti (sn)  kuru calismanin onledigi
  duz uygulama                    40               40             0                           0
  kuru calisma sonrasi            40               40             0                           0
  zamanlayiciyla geri alma         40                0          4800                           0
  ayri yonetim kanali             40                0             0                           0
  atomik yukleme                   0                0             0                           0

aday: 7 | kahin: yanlis-bag-noktasi

okuma               ayri yanit  elenen  kalan  yonetimi kesme riski
  sozdizim-denetimi            2       1      6                    0
  kural-listesi                3       2      5                    0
  kuru-calisma                 6       5      2                    0
  uctan-deneme                 4       5      2                    3

okuma kumesi                       ayrilamayan obek
  yalniz sozdizim denetimi                  1 [['durum-kurali-eksik', 'hata-yok', 'kural-sirasi-golgeliyor', 'kural-yanlis-zincirde', 'yanlis-arayuz-adi', 'yanlis-bag-noktasi']]
  sozdizim + kural listesi                  1 [['durum-kurali-eksik', 'hata-yok', 'kural-sirasi-golgeliyor', 'yanlis-arayuz-adi', 'yanlis-bag-noktasi']]
  kuru calisma                              1 [['hata-yok', 'yanlis-bag-noktasi']]
  uctan deneme                              2 [['kural-yanlis-zincirde', 'sozdizimi-hatasi', 'yanlis-arayuz-adi'], ['kural-sirasi-golgeliyor', 'yanlis-bag-noktasi']]
  kuru calisma + uctan deneme               0 

aday kumesi supurmesi
  6 aday: durum-kurali-eksik cikarildi   kuru calisma elenen  4 kalan  2 | iki okuma birlikte ayrilamayan obek 0 en buyuk 0
  7 aday: temel liste                    kuru calisma elenen  5 kalan  2 | iki okuma birlikte ayrilamayan obek 0 en buyuk 0
  8 aday: yanlis-kaynak-araligi eklendi  kuru calisma elenen  5 kalan  3 | iki okuma birlikte ayrilamayan obek 1 en buyuk 2
```

#### Sıranın Bedeli

Üst tablo yüz yirmi sırayı üç öbeğe ayırıyor. **60** sıra güvenli, **20** sıra yarım kilitlenme,
**40** sıra tam kilitlenme üretiyor. Üçte biri. Reddet politikası, yönetim izni ve kurulu bağlantı
izni arasında hiçbir tercih yapılmadığında bu üç adımdan hangisinin önce geleceği eşit olasılıdır
ve reddetin önce gelmesi kilitlenmedir.

Yarım kilitlenmenin yirmi sırası, en sinsi öbektir. Kurulu bağlantı izni verilmiş, reddet
uygulanmış, yönetim izni henüz yazılmamıştır. Yöneticinin oturumu **ayaktadır**; komutlar
çalışmakta, çıktılar dönmektedir. Hiçbir belirti yoktur. O oturum herhangi bir nedenle
kapandığında geriye dönüş yoktur ve kapanma nedeni bir ağ kesintisi, bir uçbirim kapatması ya da
bir zaman aşımı olabilir. **Ayakta kalan oturum, erişimin sürdüğünün kanıtı değildir.**

Tam kilitlenmenin kırk sırasında bir bedel daha var: uygulanamayan adım toplamı **140**. Sıra
kesildiğinde kural kümesi yarım kalır ve yarım kalan küme genellikle hem yöneticiyi hem hizmeti
dışarıda bırakır. Arıza tek bir erişim arızası değil, aynı anda bir hizmet kesintisidir.

Üst tablonun son satırı bu dersin en önemli bulgusudur: **son kural kümesi yüz yirmi sıranın
hepsinde aynıdır** — bir tek biçim. Dizilecek adımların kümesi değişmiyor, yalnız sıraları
değişiyor. Bunun doğrudan sonucu şudur: son kural kümesini uygulamadan üreten ve inceleyen bir
kuru çalışma, bu kilitlenmelerin **hiçbirini** göremez. İkinci tablonun son sütunu bu yüzden
baştan aşağı sıfırdır. **Tehlike son durumda değil, ara durumlardadır.**

#### Kilitlenmeyi Önleyen Yollar

İkinci tablo dört yolu bedelleriyle yan yana koyuyor.

**Düz uygulama** kırk kilitlenmede kırk harici müdahale demektir; her müdahale konsol düzeyinde
erişim ya da makinenin başına gitmek anlamına gelir. **Kuru çalışma sonrası uygulama** aynı
sayıları verir; kuru çalışma bu sınıf için değersizdir. **Zamanlayıcıyla geri alma** kırk
kilitlenmeyi önlemez ama harici müdahaleyi **sıfıra** indirir: yüz yirmi saniyelik zamanlayıcı
dolduğunda önceki kural kümesi geri yüklenir ve yönetici geri girer. Bedeli toplam **4800**
saniyelik kesintidir. **Ayrı yönetim kanalı** da kilitlenmeyi önlemez, müdahaleyi sıfıra indirir
ve kesinti üretmez; bedeli, o kanalın sürekli var olmasıdır. **Atomik yükleme** kural kümesini
tek bir işlemde değiştirir; ara durum oluşmadığı için kilitlenme sayısı **0** olur.

Dört yolun sırası bu tablodan çıkıyor. Ara durum üretmeyen yol en iyisidir, çünkü sorunu
kaynağında yok eder. Üretilen ara durumu kısa tutan yol ikincisidir. Ara durumu tolere edilebilir
kılan yol üçüncüsüdür. Ara durumu yalnız inceleyen yol ise bu sınıf için hiçbir şey yapmaz.

Kilitlenmenin kendi kanıtı da yoktur ve bu, kursun üçüncü iddiasının buradaki biçimidir. Oturum
düştüğü anda yöneticinin elinde kalan tek şey uçbirimde donmuş bir ekrandır; makinede ne olduğunu
söyleyecek satır makinenin içindedir ve makineye girilemez. Düşürülen yönetim paketinin izi de
önceki derste sayıldığı gibi kayıt açılmadıkça **sıfır satırdır**. Bu yüzden zamanlayıcının
süresi, günlüğü okuyup karar vermeye değil, **geri gelmeye** göre seçilir.

#### Üç Sayı

Alt ölçüm kural yazımına bakıyor: küme doğru sırayla uygulanıyor, ama yazılmış kuralın kendisinde
bir hata olabilir. **Kâhin:** yedi adaydan gerçek olan `yanlis-bag-noktasi` — kural yazılmış,
sözdizimi doğru, zinciri doğru, sırası doğru ve içindeki bağlantı noktası yanlış. **Sınama:**
sözdizim denetimi "temiz" diyor, kural listesi kuralı "yerinde" gösteriyor, kuru çalışma "temiz"
diyor, uçtan deneme "hizmet akışı kesildi" diyor. **Elenen aday:** sözdizim denetimi **1**, kural
listesi **2**, kuru çalışma **5**, uçtan deneme **5**.

Son iki okuma aynı sayıda aday eliyor ve bıraktıkları iki adaylık kalıntı **farklı**. Kuru
çalışmanın bıraktığı çift `hata-yok` ile `yanlis-bag-noktasi`; yani kuru çalışma "temiz" dediğinde
gerçekten temiz olmakla, göremediği bir hatayı taşımak arasında ayrım yapamıyor. Uçtan denemenin
bıraktığı çift ise `kural-sirasi-golgeliyor` ile `yanlis-bag-noktasi`; ikisi de aynı akışı
kesiyor. İki okuma birlikte kullanıldığında ayrılamayan öbek **0**.

Sağdaki sütun neden ikisinin de gerektiğini söylüyor. Uçtan denemenin yönetim akışını kesme
riski **3**: yedi adayın üçünde deneme yapılabilmesi için uygulanan küme yöneticinin kendi yolunu
kapatır. Kuru çalışmanın riski **0**. Doğru sıra buradan çıkar: önce risksiz okuma, sonra
zamanlayıcı ya da ayrı kanal koruması altında riskli deneme. Kuru çalışma denemenin yerini almaz;
**denemeyi ucuzlatır**, çünkü yakalayabildiği beş hatayı deneme yapılmadan eler.

#### Aday Kümesi Süpürmesi

Alt tablo yine üç boy deniyor. `durum-kurali-eksik` çıkarıldığında kuru çalışmanın elediği aday
beşten dörde iniyor, kalan yine iki. Listeye `yanlis-kaynak-araligi` eklendiğinde elenen sayısı
**5**'te kalıyor, kalan üçe çıkıyor ve iki okuma birlikte kullanıldığında bile ayrılamayan bir
öbek doğuyor: yeni aday da kuru çalışmadan kaçıyor ve aynı akışı kesiyor.

Örüntü konu boyunca aynı kaldı. Aday listesi büyüdükçe eleme sayısı sabit kalıyor, kalan
belirsizlik büyüyor. Kuru çalışmanın göremediği hata türü listeye her eklendiğinde, "temiz"
yanıtının anlamı bir aday daha zayıflıyor.

#### Özet

- Varsayılan reddet politikası dört meşru akışı ayakta tutan dört izin kuralı ister: geri döngü,
  kurulu bağlantı, yönetim ve hizmet.
- Beş adımın **120** sırasından **60**'ı güvenli, **20**'si yarım kilitlenme, **40**'ı tam
  kilitlenme üretir; tam kilitlenmede uygulanamayan adım toplamı **140**.
- Yarım kilitlenmede mevcut oturum yaşar ve hiçbir belirti vermez; ayakta kalan oturum erişimin
  sürdüğünün kanıtı değildir.
- Son kural kümesi yüz yirmi sıranın hepsinde aynıdır; bu yüzden kuru çalışma sıra kaynaklı
  kilitlenmelerin **0'ını** önler. Zamanlayıcıyla geri alma ve ayrı yönetim kanalı harici
  müdahaleyi sıfırlar, atomik yükleme kilitlenmeyi sıfırlar.
- Kural yazım hatalarında kuru çalışma **5**, uçtan deneme **5** aday eler ve bıraktıkları
  kalıntı farklıdır; ikisi birlikte ayrılamayan öbeği **0**'a indirir. Uçtan denemenin yönetimi
  kesme riski **3**, kuru çalışmanınki **0**.

#### Sonraki Adım

Bu ders bir makinenin kendi kapısını nasıl kapattığını saydı. Sonraki ders ters yöne bakar: aynı
makine bir ağın çıkışında durduğunda, arkasındaki makineler için adres dönüştürme yapar ve
dışarıdan gelen bağlantıları içeri yönlendirir. Her yönlendirme kuralı, kapatılan kapının yanında
bir pencere açar. Kursun son dersi o pencerelerin sayısını, tanıya verdiği zararı ve dönüştürme
kaydının ne kadar süre yaşadığını ölçer.

### Adres Dönüştürme

Source: https://academia.sh/tr/kurslar/linux-ag-yonetimi/adres-donusturme

Bağlantı noktası yönlendirmenin dışarıya açtığı yüzey kalem kalem sayılır: dört kural on üç nokta açıp bugün sekiz çifte ulaştırıyor, dönüştürmeli günlük satırı on iki aday kaynağın sıfırını eliyor ve altı yüzüncü saniyede çevrim kaydının yalnız kırkta on biri çözülebiliyor.

Önceki ders bir makinenin kendi kapısını nasıl kapattığını saydı: beş adımın yüz yirmi sırasından
kırkı yöneticiyi dışarıda bırakıyordu. Bu ders ters yöne bakar. Aynı makine bir ağın çıkışında
durduğunda yalnız kapı tutmaz; arkasındaki makineler adına konuşur ve dışarıdan gelen bazı
bağlantıları içeri taşır.

Her taşıma kuralı, kapatılan kapının yanında bir pencere açar. Kursun son dersi o pencereleri
sayar ve tanıya verdikleri zararı ölçer. Bu ders "şunu açın" biçiminde bir yönerge vermez;
açmanın **kaç çift** demek olduğunu yazar.

#### Ağ Geçidinin İki İşi

**Adres dönüştürme** (NAT), bir paketin başlığındaki adres ya da bağlantı noktası alanlarının
geçit üzerinde değiştirilmesidir. İki yönü vardır. **Kaynak dönüştürme** içeriden dışarı giden
paketlerde uygulanır: iç konağın adresi geçidin adresiyle değiştirilir ve geçit bir çevrim kaydı
tutarak dönen paketi doğru iç konağa geri gönderir. **Hedef dönüştürme** dışarıdan gelen
paketlerde uygulanır: geçidin bir bağlantı noktasına gelen paket, bir iç konağın bir noktasına
yönlendirilir. İkincisine **bağlantı noktası yönlendirme** denir.

Dönüştürmenin türleri, çevrim tablosunun beş bileşenli anahtarı, kapasite sınırı ve uçtan uca
bağlantının bozulması **Bilgisayar Ağları** kursunda kuruldu ve burada tekrarlanmaz. Bu ders iki
şey sorar: bu kuralın açtığı yüzey ne kadar, bu kuralın sildiği bilgi ne.

Konum da bu kursun konusudur. Kaynak dönüştürme yönlendirme kararından **sonraki**, hedef
dönüştürme **önceki** durakta yapılır. Hedef dönüştürme önce çalıştığı için süzme kuralları
paketi **dönüştürülmüş** hâliyle görür; kuralı dış adrese göre yazan operatör hiçbir şey
eşleştiremez ve ortada bir hata iletisi olmaz.

#### Yüzey, Kimlik ve Kayıt

Kurgu şudur: bir geçidin arkasında bir iç ağ vardır ve dört yönlendirme kuralı yazılmıştır.

- **EF41** — İç ağda **12** konak ve konak başına **5** servis vardır; iç (konak, servis) çifti
  **60**'tır.
- **EF42** — Dönüştürme yokken dışarıdan doğrudan erişilebilen iç çift **0**'dır.
- **EF43** — Dört kural yazılıdır: üçü tek bir noktayı, biri **10** noktalık bir aralığı açar.
- **EF44** — Aralık kuralının hedefindeki konakta bugün **5** servis dinlemektedir; kalan beş
  nokta bugün kapalıdır ve kural onları da kapsamaktadır.
- **EF45** — Kâhin gerçek kaynak konaktır ve `ic-konak-07` seçilmiştir.
- **EF46** — Hedef sunucunun günlüğü tek bir kaynak alanı yazar; dönüştürme varken bu alan
  geçidin adresidir.
- **EF47** — Çevrim kaydı bağlantı kapandıktan **120 saniye** sonra düşer.
- **EF48** — Pencere **600** saniyedir ve **40** bağlantı vardır; bağlantı `i` on beşinci
  saniyenin katlarında başlar ve süresi `30 + (i mod 7) * 10` saniyedir.
- **EF49** — Aday kümesi süpürmesi iç konak sayısı 8, 12 ve 16 iken yapılır.
- **EF50** — Bütün sayılar tam sayımdır; rastgelelik ve tohum yoktur.

```python
"""Adres donusturme: acilan yuzey , kaynak kimliginin kaybi , kaydin omru."""
IC_KONAK, SERVIS = 12, 5
ZAMAN_ASIMI, PENCERE, BAGLANTI = 120, 600, 40
KURAL = (("tekil-a", 1, 1), ("tekil-b", 1, 1), ("tekil-c", 1, 1),
         ("aralik-d", 10, 5))

print("ic ag:", IC_KONAK, "konak x", SERVIS, "servis =",
      IC_KONAK * SERVIS, "ic (konak , servis) cifti")
print("disaridan dogrudan erisilebilen cift (donusturme yok):", 0)
print()
print("kural       actigi nokta  dinleyen servis  ulasilan cift  acik nokta")
acik = dinleyen = 0
for ad, nokta, dinler in KURAL:
    acik += nokta
    dinleyen += dinler
    print(f"  {ad:10s} {nokta:12d} {dinler:16d} {dinleyen:14d} {acik:11d}")
print(f"  {'toplam':10s} {acik:12d} {dinleyen:16d} {dinleyen:14d} {acik:11d}")
print("  kural degismeden buyuyebilecek yuzey:", acik - dinleyen, "cift")
print()
KAHIN = "ic-konak-07"
ADAY = tuple(f"ic-konak-{i:02d}" for i in range(1, IC_KONAK + 1))


def gunluk_satiri(kaynak, donusturme):
    return "ag-gecidi" if donusturme else kaynak


def cevrim_tablosu(kaynak, okunabilir):
    return kaynak if okunabilir else "kayit-yok"


print("okuma                          ayri yanit  elenen  kalan")
for ad, f in (("hedefin gunlugu (donusturmeli)",
               lambda k: gunluk_satiri(k, True)),
              ("hedefin gunlugu (donusturmesiz)",
               lambda k: gunluk_satiri(k, False)),
              ("cevrim tablosu (kayit yasarken)",
               lambda k: cevrim_tablosu(k, True)),
              ("cevrim tablosu (kayit dustukten sonra)",
               lambda k: cevrim_tablosu(k, False))):
    yanit = f(KAHIN)
    kalan = sum(1 for a in ADAY if f(a) == yanit)
    print(f"  {ad:38s} {len({f(a) for a in ADAY}):5d} {len(ADAY) - kalan:7d}"
          f" {kalan:6d}")
print()
BAGLANTILAR = [(15 * i, 30 + (i % 7) * 10) for i in range(BAGLANTI)]
print(f"cevrim kaydi: {BAGLANTI} baglanti , {PENCERE} sn pencere ,"
      f" kayit kapanistan {ZAMAN_ASIMI} sn sonra dusuyor")
print("  bakis ani  baslamis  hala cozulebilir  oran")
for T in (0, 100, 300, 600):
    baslamis = [(b, s) for b, s in BAGLANTILAR if b <= T]
    cozulur = [1 for b, s in baslamis if b + s + ZAMAN_ASIMI > T]
    oran = round(len(cozulur) / len(baslamis), 4) if baslamis else 0.0
    print(f"  {T:9d} {len(baslamis):9d} {len(cozulur):17d} {oran:9.4f}")
print()
print("aday kumesi supurmesi: ic konak sayisi degisiyor")
for n in (8, 12, 16):
    a = tuple(f"ic-konak-{i:02d}" for i in range(1, n + 1))
    kalan = sum(1 for x in a if gunluk_satiri(x, True) == "ag-gecidi")
    print(f"  {n:2d} ic konak -> donusturmeli gunluk elenen {len(a) - kalan:2d}"
          f" kalan {kalan:2d} | donusturmesiz gunluk elenen {len(a) - 1:2d}"
          f" kalan {1:2d}")
```

```
ic ag: 12 konak x 5 servis = 60 ic (konak , servis) cifti
disaridan dogrudan erisilebilen cift (donusturme yok): 0

kural       actigi nokta  dinleyen servis  ulasilan cift  acik nokta
  tekil-a               1                1              1           1
  tekil-b               1                1              2           2
  tekil-c               1                1              3           3
  aralik-d             10                5              8          13
  toplam               13                8              8          13
  kural degismeden buyuyebilecek yuzey: 5 cift

okuma                          ayri yanit  elenen  kalan
  hedefin gunlugu (donusturmeli)             1       0     12
  hedefin gunlugu (donusturmesiz)           12      11      1
  cevrim tablosu (kayit yasarken)           12      11      1
  cevrim tablosu (kayit dustukten sonra)     1       0     12

cevrim kaydi: 40 baglanti , 600 sn pencere , kayit kapanistan 120 sn sonra dusuyor
  bakis ani  baslamis  hala cozulebilir  oran
          0         1                 1    1.0000
        100         7                 7    1.0000
        300        21                12    0.5714
        600        40                11    0.2750

aday kumesi supurmesi: ic konak sayisi degisiyor
   8 ic konak -> donusturmeli gunluk elenen  0 kalan  8 | donusturmesiz gunluk elenen  7 kalan  1
  12 ic konak -> donusturmeli gunluk elenen  0 kalan 12 | donusturmesiz gunluk elenen 11 kalan  1
  16 ic konak -> donusturmeli gunluk elenen  0 kalan 16 | donusturmesiz gunluk elenen 15 kalan  1
```

#### Açılan Yüzey

Üst tablo dört kuralın açtığı yüzeyi kalem kalem sayıyor. Dönüştürme yokken dışarıdan
erişilebilen iç çift **0**'dır; iç ağdaki altmış çiftin hiçbirine ulaşılamaz. Üç tekil kural
üçe çıkarıyor, dördüncü kural on noktalık bir aralık açıyor ve bugün ulaşılan çift **8** oluyor.

İki sayı arasındaki fark bu bölümün asıl konusudur. Açık nokta **13**, ulaşılan çift **8**.
Aradaki **5** çift bugün kapalı, çünkü o noktalarda dinleyen servis yok; yarın o konakta bir
servis başlatıldığında **kural değişmeden** erişilebilir olacak. Aralık biçiminde yazılmış bir
kural, bugünkü yüzeyi değil **gelecekteki en büyük yüzeyi** tanımlar. Ölçülmesi gereken sayı
sekiz değil, on üçtür.

Bu, tekil kuralla aralık kuralı arasındaki tercihi bir sayıya bağlar. Aynı iş, tek bir aralık
kuralı yerine beş tekil kuralla yazıldığında açık nokta sayısı on üçten sekize iner ve bugünkü
işlev değişmez.

#### Üç Sayı

**Kâhin:** gerçek kaynak `ic-konak-07` — on iki iç konaktan biri. **Sınama:** hedef sunucunun
günlüğü tek bir kaynak alanı yazıyor ve dönüştürme varken orada geçidin adresi duruyor; on iki
konak için **tek bir yanıt**. **Elenen aday:** dönüştürmeli günlük **0**, dönüştürmesiz günlük
**11**, çevrim tablosu kayıt yaşarken **11**, kayıt düştükten sonra **0**.

Bu sıfır kursun kuralının en kısa örneğidir. Günlük satırı vardır, okunabilir, doğrudur ve
**hiçbir adayı elemez**. Kaynak dönüştürme on iki ayrı kimliği tek bir kimliğe indirgiyor; hedef
tarafındaki her satır aynı şeyi söylüyor. Kaydın var olması ölçmeye yetmiyor; **tanısı sınanmayan
çıktı ölçülmemiş sayılır.**

En alttaki tablo süpürmeyi gösteriyor. İç konak sayısı sekizden on altıya çıkarıldığında
dönüştürmeli günlüğün elediği aday **0**'da sabit kalıyor, kalan sekizden on altıya çıkıyor.
Eleme gücü sıfır olan bir okuma, aday kümesi büyüdükçe daha da değersizleşir.

#### Kaydın Ömrü

Kimliği geri getirebilecek tek yer çevrim tablosudur ve o tablo bir bellek yapısıdır, bir günlük
değil. Kayıt bağlantı açıkken yaşar, kapandıktan yüz yirmi saniye sonra düşer.

Yüzüncü saniyede bakıldığında başlamış yedi bağlantının **yedisi** çözülebiliyor; oran
**1,0000**. Üç yüzüncü saniyede yirmi bir bağlantının **on ikisi**, oran **0,5714**; altı
yüzüncü saniyede kırk bağlantının yalnız **on biri**, oran **0,2750**. On dakikalık gecikmeyle
bakan operatör, bağlantıların dörtte üçünün kaynağını hiçbir yerden çıkaramaz.

**Kanıt beklemez.** Kaynağı kalıcı olarak saklamanın tek yolu, çevrim anında bir günlük satırı
yazmaktır ve bu bir ayardır; arızadan önce açılmış olmalıdır. Açık olmadığında geriye kalan şey
hedefin günlüğüdür ve o günlük on iki adaydan sıfırını eler.

#### Özet

- Kaynak dönüştürme yönlendirme kararından sonraki, hedef dönüştürme önceki durakta çalışır;
  süzme kuralları paketi dönüştürülmüş hâliyle görür ve dış adrese yazılan kural eşleşmez.
- Dört yönlendirme kuralı **13** nokta açıyor ve bugün **8** çifte ulaşılıyor; aradaki **5** çift
  kural değişmeden ileride açılabilir. Aralık kuralı bugünkü değil, gelecekteki en büyük yüzeyi
  tanımlar.
- Dönüştürmeli günlük satırı on iki aday kaynağın **0'ını** eler; dönüştürmesiz günlük ve
  yaşayan çevrim kaydı **11** eler.
- Çevrim kaydı kapanıştan 120 saniye sonra düşer: 100. saniyede çözülebilirlik **1,0000**,
  300'de **0,5714**, 600'de **0,2750**.
- İç konak sayısı sekizden on altıya çıktığında dönüştürmeli günlüğün elediği aday **0**'da
  sabit kalır, kalan sekizden on altıya çıkar.

#### Kurs Kapanışı

Bu kurs bir soruyu on üç kez sordu: **bir sınama kaç aday nedeni eliyor.** Her derste üç sayı yan
yana durdu — kâhin, sınamanın verdiği yanıt ve elenen aday neden sayısı. Kursun kuralı buydu: bir
sınamanın sayısı verdiği yanıt değil, elediği aday nedendir; **kaç adayı elediği yazılmayan sınama
ölçülmemiş sayılır.**

Aşağıdaki tablo on üç dersin ölçüsünü tek yerde toplar. **Boş bırakılan satırlar
uydurulmamıştır**: her satır yalnız kendi kaynak dersinden yazılır.

| Ders | Kâhin | Sınama | Elenen aday / bedel |
|---|---|---|---|
| Arayüzler ve Adresler | 8 aday neden, 8 sınama | arayüz sınaması **3 ayrı yanıt** | en kötü durumda **6 aday** kalıyor |
| Yönlendirme Tablosu | aynı 8 aday | rota sınaması **3 yanıt** | en kötü **5 aday**; `ag-gecidi-yanlis` ile `rota-eksik` ayrılmıyor |
| Ad Çözümleme | aynı 8 aday | ad çözümleme **2 yanıt** | `cozulemedi` **7** eler, `cozuldu` yalnız **1** — kursun en büyük yanıt farkı |
| Bağlantı Noktaları ve Dinleyen Servisler | aynı 8 aday | dinleyen listesi **2 yanıt** | beklenen yanıtta yalnız **1** aday; bağlantı denemesi aynı anda **7** |
| Katmanlı Tanı Yöntemi | `guvenlik-duvari-dusuruyor` | bağlantı denemesi `zaman-asimi` | **7 elenen, 1 kalan**; katmanlı **33**, ters **38**, açgözlü **10** (ulaşılamaz alt sınır) |
| Erişilebilirlik Testleri | `ag-gecidi-yanlis` | uzak yankı `yanit-yok` | **4 elenen, 4 kalan**; yankının **yanıt vermesi** de 4 adayı ayakta bırakıyor |
| Paket Yakalama | `guvenlik-duvari-dusuruyor` | süzgeçsiz yakalama **14400 satır** | **6 elenen, 2 kalan**; satır başına eleme **0,0004**'e karşı bağlantı denemesinde **7,0000** |
| Yaygın Arıza Kalıpları | `cozumleyici-sessiz` | ad çözümleme `cozulemedi` | **7 elenen, 1 kalan**; aralıklı arıza 84 sn, kayıt 300'de **42/84**, 500'de **13/84** |
| Güvenli Kabuk | 9 adayda `acik-anahtar-yetkisiz` | ayrıntılı istemci 46 satır, ayrıntılı sunucu günlüğü 3 satır | **5 / 7**; dinleyen listesi 12 satırda **1**; yedi sınamada **2** ayrılamayan öbek |
| Tünelleme ve Sıçrama Sunucusu | 10 adayda `hedef-duvar-dusuruyor` | uçtan uca **7** ayrı yanıt, duraktan hedefe **5** | **8 / 9**; katmanlı sıra **34**, uçtan uca önce **28** adım; tünel ağzı **0** ve **72** dolaylı çift |
| Paket Filtreleme Çerçevesi | karar `giris-suzme` durağında politikayla veriliyor | kural listesi **34** satır, açık iz sürme **12** satır | **0 / 8**; yüklü sayaç **0**, sessiz sayaç **6**; ulaşılmayan durak **20** |
| Güvenlik Duvarı Kuralları | 120 sıradan **40**'ı kilitliyor, son küme hepsinde aynı | kuru çalışma **6** yanıt, uçtan deneme **4** yanıt | **5 / 5**, birlikte öbek **0**; kuru çalışma **0** kilitlenme önlüyor, atomik yükleme **40** |
| Adres Dönüştürme | gerçek kaynak `ic-konak-07` | dönüştürmeli günlük **1** ayrı yanıt | **0**, kalan **12**; 600. saniyede çözülebilirlik **0,2750** |

Beş dersin ortak sonucu tek bir örüntüdür. Erişim katmanında çıktının hacmi ile eleme gücü
arasında bağ yoktur: kırk altı satırlık ayrıntılı istemci çıktısı beş aday eledi, üç satırlık
sunucu günlüğü yedi eledi, otuz dört satırlık kural listesi hiçbirini elemedi ve tek satırlık
dönüştürmeli günlük de hiçbirini elemedi. Eleme gücü satırda değil, çıktının **kaç ayrı yanıt**
üretebildiğindedir.

İkinci örüntü aday kümesiyle ilgiliydi. Her derste liste bir aday büyütülüp küçültüldü ve
sonuç her seferinde aynı yöne baktı: eleme sayısı sabit kalırken kalan belirsizlik büyüdü.
Bu yüzden bu konu boyunca ölçü olarak eleme değil, **kalan** ve **ayrılamayan öbek** kullanıldı.

Üçüncü örüntü zamanla ilgiliydi ve en sert biçimini burada aldı. İz sürme kapalıyken düşürülen
paketin izi sıfır satırdı; kilitlenmiş yöneticinin okuyacağı günlük makinenin içindeydi; çevrim
kaydı altı yüzüncü saniyede kırkta on bire inmişti. Üçünde de kanıt bir ayara bağlıydı ve o ayar
arızadan önce açılmış olmalıydı. **Kanıt beklemez.**

Bu konu boyunca yıkıcı ve kilitleyen komutlar tam biçimde yazılmadı, gerçek anahtar ve parmak izi
yazılmadı, adres dönüştürme "şunu açın" biçiminde değil **kaç çift açıldığı** biçiminde
anlatıldı. Bu bir öğretim kısıtı değil, ölçümün kendisiydi: açık yüzey sayılabilir bir
niceliktir.

Bir sonraki kurs, **Çekirdek Arayüzleri ve İzolasyon**, bu kursun bilerek dışında bıraktığı yere
girer. Burada bir makinenin tek bir ağ yığını vardı; orada ad alanlarıyla aynı makinede birden
çok ağ yığını kurulur ve bu dersteki her arayüz, her yönlendirme tablosu ve her kural zinciri
**çoğalır**. Konteyner ağı, ad alanı ve denetim grubu bu kursta anlatılmadı ve oraya bırakıldı.
Aynı soru orada da sorulacak: bir sınama kaç aday nedeni eliyor. Yanıtı zorlaştıran şey, aday
kümesinin artık tek bir makinenin içinde bile birden çok kopyaya bölünmüş olmasıdır.

