İçeriğe geç
academia.sh

Ders 13 / 21

Ağ Yalıtımı ve Özel Uç Noktalar

Yönetilen hizmete genel uçtan mı özel uçtan mı gidildiğinin ölçümü: 25 erişimde genel uç kapatılınca 12 meşru erişimin kırılması, 12 erişimin sıfır yola düşmesi, aynı adın 11 yerine 14 yerde özel adrese çözülmesi ve eksiklerin kapatılmasının 12 yeni özel uç ile ayda 180 kurgu birim tutması.

İçindekiler

Önceki ders bir kaynağın genel erişime açık olup olmadığını tek bir bayrakla okudu: Y1 sekiz yerde ateşledi, altısı işaretlendi. O bayrak bir kaynağın kendi ayarıdır. Bu dersin sorusu bir aşama öncesindedir — bir iş yükü yönetilen bir hizmete gittiğinde paketi hangi yoldan gidiyor? Ağ yalıtımının ve özel bağlantının kendisi M23/K02’de ölçüldü; burada tekrarlanmaz. Buranın nesnesi tek tek kiralanmış hizmetlerdir: bir nesne deposuna, bir kuyruğa ya da bir sır saklama servisine erişim, hizmetin genel ucundan mı yoksa özel ağın içine yerleştirilmiş bir özel uç noktadan mı geçiyor?

Ayrımın ölçülebilir olmasının nedeni şudur: yönetilen hizmet varsayılan olarak genel bir adla ve genel bir adresle gelir. Özel uç nokta iki şeyi birden değiştirir — ağa yeni bir yol ekler ve adın çözümlendiği adresi değiştirir. İkisi ayrı ayrı bozulabilir ve bu ders ikisini ayrı ayrı sayar.

Hizmet, Ağ ve Erişim Çizelgesi

Örnek kursun kurgu bölgesel ölçüm ağıdır. BG31 — yönetilen hizmet kataloğu: yedi hizmet; altısı özel uç noktayı destekler, biri yalnız genel uç sunar. Her destekli hizmetin aylık bir özel uç kirası vardır (kurgu birim). BG32 — üç özel ağ ve tek eşleme kaydı: üretim ile sınama ağı eşlenmiştir, ortak ağ eşlenmemiştir. BG33 — kurulu özel uç noktalar: altı hizmetin altısı da yalnız üretim ağında kuruludur. BG34 — ad çözümleme bölgesi: özel kayıtları taşıyan bölge üretim ve ortak ağa bağlıdır, sınama ağına bağlı değildir. BG35 — erişim çizelgesi: yirmi beş erişim; yirmi ikisi meşru, üçü meşru değil, üçü bir atlama noktasına çevrilebilir. BG36 — üç senaryo: A genel uç açık, B genel uç kapalı, C genel uç kapalı ve eksikler kapatılmış.

Aşağıdaki dosya bu çizelgeleri kurar ve üç senaryoyu koşturur. Süreç içi bir modeldir; gerçek ağ, ad kaydı ya da hizmet yoktur.

// yalitim/uc.mjs — yonetilen hizmete genel uctan mi ozel uctan mi gidildiginin olcumu.
// Surec ici model: bolgesel olcum agi (kurgu); gercek ag, ad kaydi ya da hizmet yoktur.

const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));

// Yonetilen hizmet: ad|ozel uc destegi|ozel uc aylik kirasi (kurgu birim)
const HIZMET = Object.fromEntries(satir(`
  nesne-deposu|1|18
  iliskisel-depo|1|18
  kuyruk|1|14
  sir-saklama|1|12
  anahtar-yonetimi|1|12
  gunluk-toplama|1|16
  bildirim-hizmeti|0|0`).map(([ad, d, k]) => [ad, { destek: d === "1", kira: +k }]));

// Ozel aglar ve esleme (model girdisi). ortak-ag eslenmemistir.
const AG = ["uretim-ag", "sinama-ag", "ortak-ag"];
const ESLEME = [["uretim-ag", "sinama-ag"]];
const eslesik = (a, b) => a === b || ESLEME.some(([x, y]) =>
  (x === a && y === b) || (x === b && y === a));

// Kurulu ozel uc noktalar: hizmet|ag. Alti hizmetin altisi da yalniz uretim aginda.
const KURULU_A = satir(`
  nesne-deposu|uretim-ag
  iliskisel-depo|uretim-ag
  kuyruk|uretim-ag
  sir-saklama|uretim-ag
  anahtar-yonetimi|uretim-ag
  gunluk-toplama|uretim-ag`).map((x) => x.join("|"));

// Ad cozumleme bolgesinin bagli oldugu aglar: sinama-ag baglanmamistir.
const ZONA_A = ["uretim-ag", "ortak-ag"];

// Erisim: istemci|hizmet|konum (ag ya da dis)|mesru mu|atlama noktasina cevrilebilir mi
const ERISIM = satir(`
  olcum-toplayici|nesne-deposu|uretim-ag|1|0
  olcum-toplayici|kuyruk|uretim-ag|1|0
  akis-isleyici|kuyruk|uretim-ag|1|0
  akis-isleyici|iliskisel-depo|uretim-ag|1|0
  akis-isleyici|anahtar-yonetimi|uretim-ag|1|0
  katalog-servisi|iliskisel-depo|uretim-ag|1|0
  katalog-servisi|sir-saklama|uretim-ag|1|0
  kapi-servisi|gunluk-toplama|uretim-ag|1|0
  kapi-servisi|bildirim-hizmeti|uretim-ag|1|0
  sinama-kosucu|nesne-deposu|sinama-ag|1|0
  sinama-kosucu|iliskisel-depo|sinama-ag|1|0
  sinama-kosucu|kuyruk|sinama-ag|1|0
  ortak-rapor|nesne-deposu|ortak-ag|1|0
  ortak-rapor|iliskisel-depo|ortak-ag|1|0
  ortak-rapor|gunluk-toplama|ortak-ag|1|0
  yonetim-araci|iliskisel-depo|dis|1|1
  yonetim-araci|sir-saklama|dis|1|1
  yonetim-araci|anahtar-yonetimi|dis|1|1
  gece-isi|nesne-deposu|dis|1|0
  gece-isi|kuyruk|dis|1|0
  kenar-yukleyici|nesne-deposu|dis|1|0
  kenar-yukleyici|bildirim-hizmeti|dis|1|0
  gelistirici-dizustu|nesne-deposu|dis|0|0
  gelistirici-dizustu|iliskisel-depo|dis|0|0
  bilinmeyen-istemci|nesne-deposu|dis|0|0`)
  .map(([istemci, hizmet, konum, mesru, atlama]) =>
    ({ istemci, hizmet, konum, mesru: mesru === "1", atlama: atlama === "1" }));

// Bir erisimin yollari ve ad cozumlemesi. genelAcik: hizmetin genel ucu hala aciksa.
const olc = (e, { kurulu, zona, genelAcik, atlamaVar }) => {
  const ozelVar = (ag) => kurulu.includes(`${e.hizmet}|${ag}`);
  const ozelYol = e.konum !== "dis" && AG.some((a) => ozelVar(a) && eslesik(a, e.konum));
  const genelYol = genelAcik(e.hizmet);
  // Ad cozumlemesi: ic bolgeye bagli bir agdan bakiliyorsa ve o hizmetin kaydi varsa ozel adres
  const kayitVar = AG.some((a) => ozelVar(a));
  const cozum = e.konum !== "dis" && zona.includes(e.konum) && kayitVar ? "ozel" : "genel";
  // Atlama noktasi: dis istemci ic ag uzerinden gecer, ad ic bolgeden cozulur
  const atlamaYolu = atlamaVar && e.atlama && kayitVar;
  const yollar = [];
  if (ozelYol) yollar.push("ozel");
  if (genelYol) yollar.push("genel");
  if (atlamaYolu) yollar.push("atlama");
  const calisiyor = (cozum === "ozel" && ozelYol) || (cozum === "genel" && genelYol) || atlamaYolu;
  const durum = calisiyor
    ? (atlamaYolu && !(cozum === "ozel" && ozelYol) && !(cozum === "genel" && genelYol)
        ? "atlama" : cozum === "ozel" ? "ozel uc" : "genel uc")
    : (cozum === "ozel" ? "ad ozel, yol yok" : "ad genel, uc kapali");
  return { yol: yollar.length, cozum, calisiyor, durum };
};

// Uc senaryo
const hepsiDestekli = (h) => HIZMET[h].destek;
const KURULU_C = AG.flatMap((a) => Object.keys(HIZMET).filter(hepsiDestekli).map((h) => `${h}|${a}`));
const SENARYO = {
  "A genel uc acik": { kurulu: KURULU_A, zona: ZONA_A, atlamaVar: false,
    genelAcik: () => true },
  "B genel uc kapali": { kurulu: KURULU_A, zona: ZONA_A, atlamaVar: false,
    genelAcik: (h) => !HIZMET[h].destek },
  "C eksikler kapatildi": { kurulu: KURULU_C, zona: AG, atlamaVar: true,
    genelAcik: (h) => !HIZMET[h].destek },
};

const S = [-22, 10, 12, 10, 16, 10, 14];
yaz(S, "senaryo", "ozel uc", "genel uc", "atlama", "kirilan mesru", "kesilen", "internetten");
const R = {};
for (const [ad, s] of Object.entries(SENARYO)) {
  const c = ERISIM.map((e) => ({ e, ...olc(e, s) }));
  const say = (d) => c.filter((x) => x.durum === d).length;
  R[ad] = {
    ozel: say("ozel uc"), genel: say("genel uc"), atlama: say("atlama"),
    kirilan: c.filter((x) => !x.calisiyor && x.e.mesru).length,
    kesilen: c.filter((x) => !x.calisiyor && !x.e.mesru).length,
    internet: c.filter((x) => x.calisiyor && x.durum === "genel uc").length,
    c,
  };
  yaz(S, ad, R[ad].ozel, R[ad].genel, R[ad].atlama, R[ad].kirilan, R[ad].kesilen, R[ad].internet);
}

// Ad cozumlemesi: ayni ad hangi senaryoda hangi adrese cozuluyor
const C = [-22, 14, 15];
console.log();
yaz(C, "senaryo", "ozel adrese", "genel adrese");
for (const ad of Object.keys(SENARYO))
  yaz(C, ad, R[ad].c.filter((x) => x.cozum === "ozel").length,
    R[ad].c.filter((x) => x.cozum === "genel").length);

// Genel uc kapatilinca kac yol kaliyor: erisim basina yol sayisi dagilimi
const Y = [-22, 9, 9, 9, 14];
console.log();
yaz(Y, "senaryo", "0 yol", "1 yol", "2 yol", "toplam erisim");
for (const ad of Object.keys(SENARYO)) {
  const d = [0, 1, 2].map((n) => R[ad].c.filter((x) => x.yol === n).length);
  yaz(Y, ad, ...d, ERISIM.length);
}

// B senaryosunda kirilan mesru erisimlerin nedeni
const B = [-24, 10];
console.log();
yaz(B, "B: kirilma nedeni", "erisim");
for (const n of ["ad ozel, yol yok", "ad genel, uc kapali"])
  yaz(B, n, R["B genel uc kapali"].c.filter((x) => !x.calisiyor && x.e.mesru
    && x.durum === n).length);
const konumlar = [...new Set(ERISIM.map((e) => e.konum))];
const KN = [-24, 10];
console.log();
yaz(KN, "B: kirilan mesru, konum", "erisim");
for (const k of konumlar) {
  const n = R["B genel uc kapali"].c.filter((x) => !x.calisiyor && x.e.mesru && x.e.konum === k);
  if (n.length) yaz(KN, k, n.length);
}

// Ozel uc noktanin maliyeti: her hizmet ve her ag icin ayri (kurgu birim)
const kira = (kurulu) => kurulu.reduce((t, x) => t + HIZMET[x.split("|")[0]].kira, 0);
const destekli = Object.keys(HIZMET).filter(hepsiDestekli).length;
console.log(`\nozel uc: A/B ${KURULU_A.length} adet, aylik ${kira(KURULU_A)} birim; ` +
  `C ${KURULU_C.length} adet (${destekli} hizmet x ${AG.length} ag), aylik ${kira(KURULU_C)} birim`);
console.log(`C, B'ye gore ${KURULU_C.length - KURULU_A.length} yeni ozel uc ve ` +
  `${kira(KURULU_C) - kira(KURULU_A)} birim/ay ekliyor; ` +
  `kirilan mesru erisim ${R["B genel uc kapali"].kirilan} -> ${R["C eksikler kapatildi"].kirilan}`);
const kapatilamaz = Object.keys(HIZMET).filter((h) => !HIZMET[h].destek);
console.log(`ozel uc desteklemeyen ${kapatilamaz.length} hizmet: ` +
  `${ERISIM.filter((e) => !HIZMET[e.hizmet].destek).length} erisim her senaryoda ` +
  `genel uctan geciyor; birim basina ${(kira(KURULU_C) / KURULU_C.length).toFixed(1)} birim ` +
  `ortalama kira`);

// Kurulan her ozel uc bir hizmet ve bir ag icindir; kaci gercekten kullaniliyor
const GEREKLI = [...new Set(ERISIM.filter((e) => e.mesru && e.konum !== "dis"
  && HIZMET[e.hizmet].destek).map((e) => `${e.hizmet}|${e.konum}`))];
const bosta = KURULU_C.filter((x) => !GEREKLI.includes(x));
console.log(`C'deki ${KURULU_C.length} ozel ucun ${GEREKLI.length} tanesi bir mesru erisim ` +
  `tarafindan kullaniliyor; ${bosta.length} tanesi bosta ve ayda ${kira(bosta)} birim yiyor`);
console.log(`yalnizca gerekli ${GEREKLI.length} ozel uc kurulsa ayda ${kira(GEREKLI)} birim: ` +
  `ust sinir ${destekli} hizmet x ${AG.length} ag = ${destekli * AG.length}, kalan ` +
  `${destekli * AG.length - GEREKLI.length} kurulum`);
senaryo                  ozel uc    genel uc    atlama   kirilan mesru   kesilen   internetten
A genel uc acik                8          14         0               3         0            14
B genel uc kapali              8           2         0              12         3             2
C eksikler kapatildi          14           2         3               3         3             2

senaryo                  ozel adrese   genel adrese
A genel uc acik                   11             14
B genel uc kapali                 11             14
C eksikler kapatildi              14             11

senaryo                   0 yol    1 yol    2 yol toplam erisim
A genel uc acik               0       14       11            25
B genel uc kapali            12       13        0            25
C eksikler kapatildi          6       19        0            25

B: kirilma nedeni           erisim
ad ozel, yol yok                 3
ad genel, uc kapali              9

B: kirilan mesru, konum     erisim
sinama-ag                        3
ortak-ag                         3
dis                              6

ozel uc: A/B 6 adet, aylik 90 birim; C 18 adet (6 hizmet x 3 ag), aylik 270 birim
C, B'ye gore 12 yeni ozel uc ve 180 birim/ay ekliyor; kirilan mesru erisim 12 -> 3
ozel uc desteklemeyen 1 hizmet: 2 erisim her senaryoda genel uctan geciyor; birim basina 15.0 birim ortalama kira
C'deki 18 ozel ucun 12 tanesi bir mesru erisim tarafindan kullaniliyor; 6 tanesi bosta ve ayda 78 birim yiyor
yalnizca gerekli 12 ozel uc kurulsa ayda 192 birim: ust sinir 6 hizmet x 3 ag = 18, kalan 6 kurulum

Sayılar ölçüm sınıfındadır; girdileri yukarıdaki varsayımlardır. İlk okunacak satır A senaryosudur ve rahatsız edicidir: özel uç noktalar kurulmuş, genel uç hâlâ açık ve yirmi beş erişimin on dördü genel internetten geçiyor. Özel uç kurulmuş olması trafiğin oradan geçtiği anlamına gelmiyor. Aynı satırda A senaryosunda bile üç meşru erişim kırık duruyor.

Yol Sayısı ile Erişimin Ayrılması

Yol dağılımı tablosu bu ayrımı taşıyor. A senaryosunda hiçbir erişim sıfır yolda değil: on dördü tek yolda, on biri iki yolda. Yani üretim ve sınama ağındaki on bir erişim için hem özel uç hem genel uç açıktır. Buna rağmen sınama ağındaki üç erişim genel uçtan gidiyor, çünkü ad çözümleme bölgesi sınama ağına bağlı değil. Yol vardır, ad onu göstermez. Ölçünün ayırdığı şey budur: özel uç noktayı kurmak bir yol açar, ad kaydını bağlamak o yolu kullanılır kılar ve ikisi ayrı işlerdir.

Ortak ağdaki üç erişim ters tarafta durur. Ad bölgesi ortak ağa bağlıdır, dolayısıyla ad özel adrese çözülür; ama ortak ağ üretim ağıyla eşlenmemiştir ve özel adrese giden bir yol yoktur. A senaryosunda bile bu üç erişim kırıktır ve kırılma nedeni genel ucun kapatılması değildir. Ad çözümlemesi yönlendirmeden önce sonuç verir; adres yanlış tarafa çözüldüğünde açık duran genel uç bile kurtarmaz.

Genel Uç Kapatıldığında Kalan

B senaryosunda destekli altı hizmetin genel ucu kapatılıyor. Yirmi beş erişimin on ikisi sıfır yola düşüyor, on üçü tek yolda kalıyor ve iki yollu erişim kalmıyor. Kırılan meşru erişim üçten on ikiye çıkıyor; buna karşılık meşru olmayan üç erişim — geliştirici dizüstünün üretim deposuna iki doğrudan okuması ve kaynağı bilinmeyen bir istemci — kesiliyor. Kazanç sütunu budur ve üç kalemdir.

Kırılan on ikinin nedenleri iki gruba ayrılıyor. Üçü “ad özel, yol yok” durumundadır ve zaten A’da da kırıktı; dokuzu “ad genel, uç kapalı” durumundadır ve doğrudan kapatmanın sonucudur. Konuma göre bakıldığında sınama ağından üç, ortak ağdan üç ve dışarıdan altı erişim kırılıyor. Dışarıdan gelen altısı bu dersin asıl uyarısıdır: gece toplu işi, kenar yükleyicisi ve yönetim aracı özel ağın içinde değildir, hiçbir zaman da olmamıştı. Genel ucun kapatılması bunları görmeden keser, çünkü kapatma kararı hizmet tarafında verilir ve hizmet tarafı istemcinin nerede olduğunu bilmez.

Eksikleri Kapatmanın Faturası

C senaryosunda üç şey birden yapılıyor: her destekli hizmet için her ağda özel uç kuruluyor, ad bölgesi üç ağa da bağlanıyor ve yönetim aracı için bir atlama noktası ekleniyor. Sonuç, kırılan meşru erişimi on ikiden üçe indiriyor; özel uçtan geçen erişim sekizden on dörde çıkıyor, üç erişim atlama noktası üzerinden geçiyor ve genel adrese çözülen ad sayısı on dörtten on bire iniyor.

Kalan üç kırık erişim kapatılamayanlardır: gece toplu işinin iki erişimi ve kenar yükleyicisinin depo erişimi. Bunlar dışarıdan çalışır, atlama noktasına çevrilemez ve özel uç noktanın tanımı gereği erişemez. Bir özel uç nokta, ağın içinden erişimi çözer; ağın dışında kalan bir istemci için çözecek bir şeyi yoktur. Bu üç iş ya ağın içine taşınacak ya da genel uç açık kalacaktır.

Faturanın kendisi ayrı bir kalemdir ve tek seferlik değildir. Özel uç nokta hizmet başına ve ağ başına ayrı gerekir: altı destekli hizmet çarpı üç ağ, on sekiz kurulum ve ayda 270 kurgu birim. B’ye göre on iki yeni özel uç ve 180 birim/ay eklenmiş oluyor — dokuz meşru erişimi kurtarmanın bedeli budur. On sekiz kurulumun yalnız on ikisi bir meşru erişim tarafından kullanılıyor; kalan altısı boştadır ve ayda 78 birim yiyor. Yalnız gerekli on ikisi kurulsaydı fatura 192 birim olurdu. Üst sınır on sekizdir ve on ikisi doludur; her yeni hizmet ya da yeni ağ bu çarpımı büyütür, çünkü tek bir özel uç birden çok hizmete hizmet etmez.

Bir kalem hiçbir senaryoda kapanmıyor. Bildirim hizmeti özel uç noktayı desteklemez; ona giden iki erişim üç senaryoda da genel uçtan geçer. Kiralanan katmanın sınırı burada görünür hâle geliyor: yalıtımı ne kadar ileri götürebileceğine sağlayıcının hizmet başına verdiği yetenek karar veriyor ve bu kalem müzakere edilemez.

Özet

  • Özel uç noktaların kurulu olması trafiğin oradan geçtiği anlamına gelmiyor: A senaryosunda yirmi beş erişimin on dördü genel internetten geçiyor ve üçü zaten kırık.
  • Yol ile ad çözümlemesi ayrı ölçülür. Sınama ağında iki yol açıktır ama ad bölgesi bağlı olmadığı için üç erişim genel uçtan gider; ortak ağda ad özele çözülür ama eşleme olmadığı için yol yoktur.
  • Genel uç kapatılınca yirmi beş erişimin on ikisi sıfır yola düşüyor; kırılan meşru erişim üçten on ikiye çıkıyor (sınama 3, ortak 3, dışarıdan 6) ve meşru olmayan üç erişim kesiliyor.
  • Eksikleri kapatmak kırılanı on ikiden üçe indiriyor; bedeli on iki yeni özel uç ve ayda 180 kurgu birimdir. Kalan üç erişim ağın dışındadır ve özel uç noktayla çözülemez.
  • Özel uç nokta hizmet başına ve ağ başına ayrı gerekir: altı hizmet çarpı üç ağ, on sekizlik üst sınırın on ikisi kullanılıyor, altısı boşta ayda 78 birim yiyor.
  • Bir hizmet özel uç noktayı desteklemiyor; ona giden iki erişim her senaryoda genel uçtan geçer ve bu sınıra kiracının verebileceği bir karar yoktur.

Sonraki Adım

Genel uç kapatıldı, yollar sayıldı ve dışarıda kalan üç erişim adıyla yazıldı. Ama kapanan yol yalnız beklenen istemcileri değil, beklenmeyenleri de dışarıda bırakmayı amaçlıyordu; kesilen üç meşru olmayan erişim bunu gösterdi. Sorun şu ki o üçü, çizelgede yazılı oldukları için sayılabildi. Çizelgede olmayan, özel ağın içinden gelen ve geçerli kimlik bilgisi taşıyan bir etkinlik hiçbir tabloda görünmedi. Sonraki ders anormal etkinliği ölçer: bilinen bir olay kümesinde tespit kurallarının kaçını yakaladığını, kaçını kaçırdığını ve kaç yanlış alarm ürettiğini sayar.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat