IP Sorgula Rehber Subnet ve CIDR nedir?

Subnet maskesi ve CIDR nedir? /24, /26 ve VLSM örnekleriyle alt ağ hesaplama

Alt ağ maskesi ve CIDR öneki, bir IP adresinin hangi bölümünün ağı, hangi bölümünün cihazı gösterdiğini belirler. /24, /26 ve /30 bloklarının ağ ve yayın adresini elle bulmayı, bloğu bölmeyi ve VLSM ile adres dağıtmayı örneklerle gösteriyoruz.

Son güncelleme Son doğrulama 10 dk okuma ipsorgu.net ekibi

Hızlı cevap

CIDR gösteriminde /24, adresin ilk 24 bitinin ağı, kalan 8 bitin cihazı gösterdiğini söyler; alt ağ maskesi (subnet mask) olarak 255.255.255.0 yazılır ve blokta 256 adres bulunur. Bunlardan ilki ağ adresi (network address), sonuncusu yayın adresi (broadcast address) olduğu için cihazlara 254 adres kalır (/31 ve /32 hariç). Önek bir büyüdükçe blok yarıya iner: /25'te 128, /26'da 64 adres vardır.

IP adresi, alt ağ maskesi ve CIDR öneki

IPv4 adresi 32 bittir. 192.168.10.77 yazımında her sayı 8 bitlik bir parçadır (sekizli, octet). Adresin baştaki bitleri ağı, sondaki bitleri o ağdaki cihazı (host) gösterir. Sınırın yerini alt ağ maskesi belirler: maskede 1 olan bitler ağ kısmı, 0 olan bitler host kısmıdır.

CIDR (Classless Inter-Domain Routing, sınıfsız alanlar arası yönlendirme) aynı sınırı kısa yazar: adresin ardına / ve ağ bitlerinin sayısı (önek uzunluğu, prefix length) eklenir. Bu sayı 0 ile 32 arasındadır (RFC 4632 §3.1). CIDR ile eski A, B, C sınıf sistemi terk edildi (§3, §5): ağın boyutu adresin ilk bitlerinden değil, yazılan önekten anlaşılır. /8, /16 ve /24 eski sınıfların boyutlarıdır; aralarındaki her uzunluk da geçerlidir.

Örnek: /26, 26 tane 1 ve ardından 6 tane 0 demektir. Son sekizli 11000000 = 128 + 64 = 192 olduğu için maske 255.255.255.192 olur.

11111111.11111111.11111111.11000000

Maskenin 1'leri soldan başlayıp kesintisiz sürmelidir (RFC 4632 §5.1): 255.255.255.192 geçerli, 255.255.255.100 geçersizdir. Bir adresin ya da maskenin ikili, onaltılık ve tam sayı karşılığını IP dönüştürücüde görebilirsiniz.

/16'dan /30'a önek tablosu

Her satırın adres sayısı bir üstündekinin yarısıdır. Host sayısı, cihazlara verilebilen kullanılabilir adreslerin sayısıdır ve toplamdan iki eksiktir; nedenini ve /31 ile /32 istisnalarını küçük bloklar bölümünde bulursunuz. /16 eski B sınıfının, /24 eski C sınıfının boyutudur (RFC 4632 §3.1 tablosu).

ÖnekAlt ağ maskesiToplam adresHost sayısı
/16255.255.0.065.53665.534
/17255.255.128.032.76832.766
/18255.255.192.016.38416.382
/19255.255.224.08.1928.190
/20255.255.240.04.0964.094
/21255.255.248.02.0482.046
/22255.255.252.01.0241.022
/23255.255.254.0512510
/24255.255.255.0256254
/25255.255.255.128128126
/26255.255.255.1926462
/27255.255.255.2243230
/28255.255.255.2401614
/29255.255.255.24886
/30255.255.255.25242

Tabloyu Python ile üretip RFC 4632 §3.1'deki adres sayılarıyla karşılaştırdık. Elle hesaplamak için iki işlem yeter: host biti = 32 − önek; adres sayısı = 2 üzeri host biti.

Adım adım: 192.168.10.77/26

Soru: 192.168.10.77/26 adresi hangi ağdadır, o ağın sınırları nedir?

  1. Host biti: 32 − 26 = 6. Blokta 2 üzeri 6 = 64 adres vardır.
  2. Blok boyutu: Maskenin 255 olmayan tek sekizlisi sonuncusu: 192. Blok boyutu 256 − 192 = 64; bloklar son sekizlide 0, 64, 128 ve 192'den başlar.
  3. Ağ adresi: 77 ÷ 64'ün tam kısmı 1, 1 × 64 = 64. Ağ adresi 192.168.10.64.
  4. Yayın adresi: Sonraki blok 128'de başlar; yayın adresi bir öncesidir: 192.168.10.127.
  5. Kullanılabilir aralık: 192.168.10.65 ile 192.168.10.126 arası, yani 64 − 2 = 62 host.

Sınama: adres ile maskenin bit bit VE (AND) işlemi ağ adresini verir. Maskenin ilk üç sekizlisi 255 (hepsi 1) olduğu için adres orada aynen kalır; yalnızca son sekizliye bakmak yeter.

77  = 01001101   adres, son sekizli
192 = 11000000   maske, son sekizli
64  = 01000000   VE sonucu

Aynı hesabı Python'un ipaddress modülüyle de sınadık. Çıktılar 26 Ekim 2026'da Python 3.14.4 ile alındı. Komutları, Python yorumlayıcısını (komut satırında python3) açıp >>> işaretinden sonrasını yazarak çalıştırabilirsiniz.

>>> import ipaddress
>>> n = ipaddress.ip_network('192.168.10.77/26', strict=False)
>>> print(n.network_address, n.broadcast_address)
192.168.10.64 192.168.10.127
>>> print(n.netmask, n.hostmask)
255.255.255.192 0.0.0.63
>>> h = list(n.hosts())
>>> print(h[0], h[-1], len(h), n.num_addresses)
192.168.10.65 192.168.10.126 62 64
>>> print(ipaddress.ip_address('192.168.10.80') in n)
True
>>> ipaddress.ip_network('192.168.10.77/26')
Traceback (most recent call last):
  ...
ValueError: 192.168.10.77/26 has host bits set

Son komut, strict=False olmadan Python'un neden hata verdiğini gösterir: 192.168.10.77/26 bir cihaz adresidir, ağ tanımı değildir. Ağ 192.168.10.64/26'dır.

Hesaplayıcıda 192.168.10.77/26 bağlantısını açın: sonuç kartı aynı değerleri verir ve ikili gösterimde ağ bitlerini kalın, host bitlerini soluk işaretler. Ağ adresi yerine cihaz adresi yazarsanız hesaplayıcı da adresin içinde bulunduğu bloğu gösterir. "Bir adres bu blokta mı?" denetimi, Python'daki in sorgusuyla aynı işi yapar. Hesap tarayıcınızda yapılır; yazdığınız adres sunucuya gönderilmez.

Bir IP raporunda "Servis sağlayıcı ve kayıt" kartındaki "IP bloğu" satırı CIDR olarak biliniyorsa, yanındaki "Hesapla" bağlantısı o bloğu aynı hesaplayıcıda açar.

/30, /31 ve /32: ağ ve yayın adresi neden kullanılamaz

Bloğun ilk adresinde host bitlerinin hepsi 0'dır; bu adres ağın kendisini adlandırır. Son adresinde hepsi 1'dir; bloktaki tüm cihazlara yayın için kullanılır. İkisi de cihaza verilmediği için bir /30 bloğu dört adresten yalnızca ikisini cihazlara verebilir (RFC 3021 §1). İki yönlendiriciyi bağlayan bir hat için bu, adreslerin yarısını harcamak demektir.

/31 bu yüzden RFC 3021 ile tanımlandı. Noktadan noktaya bir bağlantıda iki adresin ikisi de cihaza verilir; ağ ve yayın adresi yoktur (§2.1). Yalnızca iki ucu olan hatlarda kullanılır ve iki uç da desteklemelidir: yalnızca bir ucun desteklediği hat düzgün çalışmayabilir (§5). /32 tek bir adrestir; RFC 4632 tablosu bunu "host route" diye adlandırır.

>>> import ipaddress
>>> for p in (30, 31, 32):
...     n = ipaddress.ip_network('192.168.10.8/%d' % p, strict=False)
...     print(n, n.num_addresses, [str(a) for a in n.hosts()])
...
192.168.10.8/30 4 ['192.168.10.9', '192.168.10.10']
192.168.10.8/31 2 ['192.168.10.8', '192.168.10.9']
192.168.10.8/32 1 ['192.168.10.8']

Python da bu kuralı izler (hosts() açıklaması): /30'da 2, /31'de 2, /32'de 1 kullanılabilir adres. Hesaplayıcı aynı sayıları gösterir.

Bloğu bölmek ve birleştirmek: 10.0.0.0/22

Bir bloğu bölmek için önek uzunluğunu artırırsınız; çıkan her parçaya alt ağ (subnet) denir. Her ek bit blok sayısını ikiye katlar: /22'den /24'e 2 bit eklenir, 2 üzeri 2 = 4 alt ağ çıkar. Her biri 256 adrestir; dördü 1.024 eder, yani /22'nin tamamı.

>>> import ipaddress
>>> blok = ipaddress.ip_network('10.0.0.0/22')
>>> print(*blok.subnets(new_prefix=24))
10.0.0.0/24 10.0.1.0/24 10.0.2.0/24 10.0.3.0/24
>>> print(*ipaddress.collapse_addresses(blok.subnets(new_prefix=24)))
10.0.0.0/22

Alt ağlar 10.0.0.x'ten 10.0.3.x'e gider, çünkü /22'nin maskesi 255.255.252.0: üçüncü sekizlide 256 − 252 = 4 değer (0, 1, 2, 3) kapsar.

İkinci komut ters yönü gösterir: ardışık ve hizalı bloklar tek blokta toplanır (yönlendirme tablolarında özetleme, aggregation; RFC 4632 §4.1). Birleşmek için bloklar yalnızca ardışık olmaz, birleşik bloğun boyutuna da hizalı olmalıdır. 10.0.2.0/24 ile 10.0.3.0/24 birleşip 10.0.2.0/23 olur. 10.0.1.0/24 ile 10.0.2.0/24 ardışıktır ama birleşemez, çünkü bir /23 üçüncü sekizlide yalnızca çift sayıyla başlar.

10.0.0.0/22 bloğunu hesaplayıcıda açın, "Bloğu daha küçük alt ağlara böl" bölümüne 24 yazıp Böl düğmesine basın: dört bloğu kullanılabilir aralıkları ve yayın adresleriyle listeler.

VLSM: ihtiyaca göre farklı boyutlarda alt ağlar

VLSM (Variable Length Subnet Mask, değişken uzunluklu alt ağ maskesi), bir bloğu eşit parçalara değil, her ağın ihtiyacına göre farklı önek uzunluklu parçalara bölmektir. İki cihazlık bir yönlendirici hattına /24 vermek 252 adresi boşa harcar; VLSM ile o hatta /30 verirsiniz.

Örnek: 192.168.0.0/24 bloğundan 50, 20, 10 ve 2 hostluk dört ağ çıkarılacak.

  1. Her ağ için en küçük bloğu seçin. Kural: (2 üzeri host biti) − 2, gereken host sayısına eşit ya da ondan büyük olmalı. 50 host için 64 − 2 = 62 yeter (/26); 20 için 32 − 2 = 30 (/27); 10 için 16 − 2 = 14 (/28); 2 için 4 − 2 = 2 (/30).
  2. Büyükten küçüğe yerleştirin. Her blok kendi boyutuna hizalı bir adreste başlamalıdır: /26 için 64'ün, /27 için 32'nin katları. Büyük bloktan başlarsanız sonrakiler boşluk kalmadan arkasına gelir.

Sonuç:

  • A, 50 host: 192.168.0.0/26; kullanılabilir 192.168.0.1 – 192.168.0.62; yayın 192.168.0.63.
  • B, 20 host: 192.168.0.64/27; kullanılabilir 192.168.0.65 – 192.168.0.94; yayın 192.168.0.95.
  • C, 10 host: 192.168.0.96/28; kullanılabilir 192.168.0.97 – 192.168.0.110; yayın 192.168.0.111.
  • D, 2 host: 192.168.0.112/30; kullanılabilir 192.168.0.113 – 192.168.0.114; yayın 192.168.0.115.

192.168.0.116 ile 192.168.0.255 arasındaki 140 adres sonraki ağlar için boş kalır. Aynı yerleşimi Python ile hesapladık; çıktı sütunları sırasıyla istek, blok, ilk kullanılabilir adres, son kullanılabilir adres ve yayın adresidir.

>>> import ipaddress
>>> blok = ipaddress.ip_network('192.168.0.0/24')
>>> sonraki = int(blok.network_address)
>>> for ihtiyac in sorted([50, 20, 10, 2], reverse=True):
...     bit = 2
...     while 2**bit - 2 < ihtiyac: bit += 1
...     ag = ipaddress.ip_network((sonraki, 32 - bit))
...     print(ihtiyac, ag, ag[1], ag[-2], ag[-1])
...     sonraki = int(ag.broadcast_address) + 1
...
50 192.168.0.0/26 192.168.0.1 192.168.0.62 192.168.0.63
20 192.168.0.64/27 192.168.0.65 192.168.0.94 192.168.0.95
10 192.168.0.96/28 192.168.0.97 192.168.0.110 192.168.0.111
2 192.168.0.112/30 192.168.0.113 192.168.0.114 192.168.0.115
>>> print(ipaddress.ip_address(sonraki), int(blok.broadcast_address) - sonraki + 1)
192.168.0.116 140
>>> ipaddress.ip_network('192.168.0.4/26')
Traceback (most recent call last):
  ...
ValueError: 192.168.0.4/26 has host bits set

Son komut sırayı bozmanın bedelini gösterir. /30'u önce 192.168.0.0'a koyarsanız sıradaki adres .4 olur; bir /26 bloğu .4'ten başlayamaz, .64'e atlamanız gerekir ve 60 adres boşa gider.

VLSM'in çalışması için yönlendirme protokolünün önek uzunluğunu taşıması gerekir. OSPF, IS-IS, RIPv2, EIGRP ve BGP-4 taşır; RFC 1058'deki eski RIP taşımaz (RFC 4632 §5).

Hesaplayıcıda 192.168.0.0/24 yazın, "İhtiyaca göre dağıt (VLSM, yalnızca IPv4)" bölümünü açın ve her satıra bir sayı yazın: 50, 20, 10, 2. Aynı dört bloğu verir. Hesaplayıcı VLSM'de /31 ve /32 kullanmaz; iki hostluk hatta /30 verir. İki uç da RFC 3021'i destekliyorsa o hat /31 olabilir.

İki adres arasındaki aralığı CIDR bloklarına çevirmek

Güvenlik duvarı kuralı, bulut güvenlik grubu ya da erişim listesi yazarken elinizde 192.168.1.10 - 192.168.1.200 gibi bir aralık olabilir. Bir CIDR bloğu kendi boyutuna hizalı bir adreste başlar; bu aralık hizalı başlamadığı için tek blok olmaz.

>>> import ipaddress
>>> ilk = ipaddress.ip_address('192.168.1.10')
>>> son = ipaddress.ip_address('192.168.1.200')
>>> bloklar = list(ipaddress.summarize_address_range(ilk, son))
>>> for b in bloklar: print(b, b.num_addresses)
...
192.168.1.10/31 2
192.168.1.12/30 4
192.168.1.16/28 16
192.168.1.32/27 32
192.168.1.64/26 64
192.168.1.128/26 64
192.168.1.192/29 8
192.168.1.200/32 1
>>> print(len(bloklar), sum(b.num_addresses for b in bloklar), int(son) - int(ilk) + 1)
8 191 191

Sekiz blok çıkar; adres sayılarının toplamı aralıktaki 191 adrese eşittir. Bloklar önce büyür, aralığın sonuna doğru küçülür. Kuralınız fazladan adres kapsayabiliyorsa aralığı genişletip tek blok kullanabilirsiniz (192.168.1.0/24 gibi).

IP aralığı → CIDR aracı aynı sekiz bloğu listeler; "Hepsini kopyala" düğmesi blokları satır satır panoya alır.

Joker (wildcard) maske

Cisco IOS erişim listelerinde (ACL) adres, alt ağ maskesiyle değil joker maskeyle (wildcard mask) yazılır. Joker maske alt ağ maskesinin tersidir: 255.255.255.255'ten maskeyi çıkarırsınız. 255.255.255.192 için sonuç 0.0.0.63'tür; yukarıdaki Python komutunda hostmask ile alınan değer budur.

Bitlerin anlamı da tersine döner: joker maskede 0, "bu bit adresle aynı olmalı"; 1, "bu biti yoksay" demektir. 192.168.10.64 0.0.0.63 çifti bu yüzden ilk üç sekizlisi 192.168.10 olan ve son sekizlisi 64 ile 127 arasında kalan adresleri, yani 192.168.10.64/26 bloğunu eşler. Hesaplayıcının sonuç kartında "Joker (wildcard) maske" satırı vardır.

Özel ve paylaşılan adres blokları

RFC 1918 kurum içi kullanım için üç blok ayırır. Bu adresler internete yönlendirilmez ve kullanmak için bir kayıt kuruluşundan izin gerekmez (§3).

  • 10.0.0.0/8: 10.0.0.0 – 10.255.255.255, 16.777.216 adres
  • 172.16.0.0/12: 172.16.0.0 – 172.31.255.255, 1.048.576 adres
  • 192.168.0.0/16: 192.168.0.0 – 192.168.255.255, 65.536 adres

RFC 6598'in ayırdığı 100.64.0.0/10 (100.64.0.0 – 100.127.255.255, 4.194.304 adres) ise özel değil, paylaşılan adres alanıdır. Sağlayıcının CGN (Carrier-Grade NAT) cihazı ile müşteri modemi arasındaki bağlantıları numaralandırmak için ayrılmıştır (§1, §7) ve sağlayıcı sınırlarının ötesine iletilmez (§4). Modeminizin internet (WAN) tarafında bu blokta bir adres görüyorsanız sağlayıcınız CGN kullanıyor olabilir. Hesaplayıcı bu blokları "Özel ağ (RFC 1918)" ve "Paylaşılan adres alanı, CGNAT (RFC 6598)" olarak etiketler.

IPv6'da aynı mantık

IPv6 adresi 128 bittir ve önek aynı biçimde yazılır: 2001:db8:abcd:1::/64 (RFC 4291 §2.3; 2001:db8::/32 belgeleme için ayrılmış bloktur, RFC 3849). Host biti sayısı 128 − önek uzunluğudur. Üç fark önemlidir.

  • Yayın adresi yoktur. İşlevini çok noktaya yayın (multicast) üstlenir (RFC 4291 §2); bu yüzden "iki eksik" kuralı geçerli değildir. Ancak her alt ağın ilk adresi (arabirim kimliği sıfır), yönlendiricilerin Subnet-Router anycast adresi olarak ayrılmıştır (§2.6.1); bir cihaza vermeyin. Python'un hosts() işlevi de bu adresi atlar.
  • Yerel ağ için önek /64'tür. RFC 4291 §2.5.4, 000 ile başlamayan genel adreslerde arabirim kimliğini 64 bit yapar. Otomatik adres yapılandırma (SLAAC), önek uzunluğu ile arabirim kimliği uzunluğunun toplamı 128 etmiyorsa duyurulan öneki yok sayar (RFC 4862 §5.5.3). Yani yönlendirici duyurusunda /64 dışında bir önek verirseniz cihazlar SLAAC ile adres oluşturamaz.
  • Yönlendirici hatları istisnadır. Yalnızca iki yönlendiricinin bulunduğu noktadan noktaya hatlarda /127 kullanılabilir (RFC 6164); IPv4'teki /31'in karşılığıdır.

RFC 6177, bir siteye en az bir /64 ve çoğu durumda çok daha fazlasının verilmesini ister; kesin boyutu sağlayıcı politikalarına bırakır. Elinize /48 geçtiyse içinde 65.536 tane /64 vardır.

>>> import ipaddress
>>> site = ipaddress.ip_network('2001:db8:abcd::/48')
>>> lan = ipaddress.ip_network('2001:db8:abcd:1::/64')
>>> print(lan.num_addresses, site.num_addresses // lan.num_addresses)
18446744073709551616 65536
>>> print(lan[0], next(lan.hosts()))
2001:db8:abcd:1:: 2001:db8:abcd:1::1

Hesaplayıcı IPv6 bloklarını da çözer; yayın adresi satırı göstermez, ilk ve son adresi verir.

Sık yapılan hatalar

  • Son sekizliye bakıp ağ ya da yayın adresi saymak. Yayın adresi her zaman .255 ile bitmez: 192.168.10.64/26 bloğunda .127'dir. Tersine, blok /24'ten büyükse .0 ya da .255 ile biten bazı adresler cihaza verilebilir: 10.0.0.0/22 içinde 10.0.0.255 ve 10.0.1.0 sıradan cihaz adresleridir.
  • Cihaz adresini ağ adresi diye yazmak. 192.168.10.77/26 bir ağ tanımı değildir; ağ 192.168.10.64/26'dır. Kural ve yönlendirme girdilerinde ağ adresini yazın.
  • Bloğu hizasız başlatmak. 192.168.0.100/27 geçerli bir ağ değildir. /27 blokları 32'nin katlarında başlar; 100'ün bulunduğu blok 192.168.0.96/27'dir.
  • 172.16.0.0/12'yi "172 ile başlayan her şey" sanmak. Özel aralık yalnızca 172.16.x.x ile 172.31.x.x arasıdır; 172.15.x.x ve 172.32.x.x özel değildir.
  • Alt ağ maskesini joker maske yerine yazmak. Erişim listesine 255.255.255.192 yazarsanız 255'ler "yoksay" anlamına gelir ve kural istediğinizden çok daha fazla adresi eşler. Doğrusu 0.0.0.63'tür.
  • Aynı özel bloğu iki ağda kullanmak. RFC 1918 adresleri yalnızca kurum içinde benzersizdir (§3). İki ağı VPN ile bağladığınızda ikisi de 192.168.1.0/24 kullanıyorsa adresler çakışır; bağlamadan önce birinin bloğunu değiştirin.
  • Baştaki sıfır. 010.1.1.1 sekizlik (octal) gösterimle karışabilir. Python 3.9.5'ten beri böyle adresleri hata sayar; hesaplayıcı da reddeder.

Kaynaklar

  1. RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan (BCP 122) · IETF · Erişim 26.10.2026
  2. RFC 3021: Using 31-Bit Prefixes on IPv4 Point-to-Point Links · IETF · Erişim 26.10.2026
  3. RFC 1918: Address Allocation for Private Internets (BCP 5) · IETF · Erişim 26.10.2026
  4. RFC 6598: IANA-Reserved IPv4 Prefix for Shared Address Space (BCP 153) · IETF · Erişim 26.10.2026
  5. RFC 4291: IP Version 6 Addressing Architecture · IETF · Erişim 26.10.2026
  6. RFC 4862: IPv6 Stateless Address Autoconfiguration · IETF · Erişim 26.10.2026
  7. RFC 6164: Using 127-Bit IPv6 Prefixes on Inter-Router Links · IETF · Erişim 26.10.2026
  8. RFC 6177: IPv6 Address Assignment to End Sites (BCP 157) · IETF · Erişim 26.10.2026
  9. RFC 3849: IPv6 Address Prefix Reserved for Documentation · IETF · Erişim 26.10.2026
  10. Configure IP Access Lists (bölüm: ACL Concepts, Masks) · Cisco · Erişim 26.10.2026
  11. ipaddress: IPv4/IPv6 manipulation library · Python Software Foundation · Erişim 26.10.2026

Yazıdaki teknik bilgiler yukarıdaki kaynaklardan alınmış, komutlar ve örnekler çalıştırılarak denetlenmiştir. Bir hata görürseniz bize yazın; düzeltmeyi tarihiyle birlikte ekleriz.

İlgili araçlar