Sinopsis
dnctl [-anqs] {list | show}
dnctl [-f | -q] flush
dnctl [-q] {delete} [number ...]
dnctl {pipe | queue} number config config-options
dnctl [-s [field]] {pipe | queue} {delete | list | show} [number ...]
dnctl [-nq] [-p preproc [preproc-flags]] pathname
Açıklama
dnctl yardımcı programı, dummynet(4) trafik şekillendiricisini kontrol etmek için kullanılan kullanıcı arayüzüdür.
dummynet, paketleri sınıflandırmak ve bunları akışlara (flows) bölmek için öncelikle bir paket filtresi kullanarak çalışır; bunu yaparken dnctl kurallarında kullanılabilecek herhangi bir eşleşme modelini (match pattern) kullanabilir. Yerel politikalara bağlı olarak bir akış; tek bir TCP bağlantısına ait paketleri, belirli bir ana bilgisayardan/bilgisayara giden paketleri, tüm bir alt ağı veya bir protokol türünü vb. içerebilir.
Aynı akışa ait paketler daha sonra, trafik düzenlemesini uygulayan aşağıdaki iki farklı nesneden birine aktarılır:
pipe Bir boru (pipe); verilen bant genişliği (bandwidth), yayılma gecikmesi (propagation delay), kuyruk boyutu (queue size) ve paket kaybı oranına (packet loss rate) sahip bir bağlantıyı (link) taklit eder. Paketler, sınıflandırıcıdan çıktıkça borunun önünde kuyruğa alınır ve ardından borunun parametrelerine göre boruya aktarılır.
queue Bir kuyruk (queue); WFQ politikasının verimli bir varyantı olan WF2Q+ (Worst-case Fair Weighted Fair Queueing - En Kötü Durumda Adil Ağırlıklı Adil Kuyruklama) politikasını uygulamak için kullanılan bir soyutlamadır. Kuyruk, her akışla bir ağırlık ve bir referans boru ilişkilendirir ve ardından aynı boruya bağlı tüm birikmiş (yani paketleri kuyruğa alınmış) akışlar, borunun bant genişliğini ağırlıklarıyla orantılı olarak paylaşır. Ağırlıkların öncelik olmadığını unutmayın; daha düşük ağırlığa sahip bir akışın, daha yüksek ağırlığa sahip bir akış kalıcı olarak birikmiş olsa bile bant genişliğinden kendi payını alması garanti edilir.
Pratikte borular (pipes), bir akışın kullanabileceği bant genişliğine kesin sınırlar koymak için kullanılabilirken; kuyruklar (queues), farklı akışların kullanılabilir bant genişliğini nasıl paylaşacağını belirlemek için kullanılabilir.
Boru (pipe) ve kuyruk (queue) yapılandırma komutları şunlardır:
pipe number config pipe-configuration
queue number config queue-configuration
Bir boru (pipe) için aşağıdaki parametreler yapılandırılabilir:
bw bandwidth | device Bant genişliği, [K|M]{bit/s|Byte/s} cinsinden ölçülür.
0 değeri (varsayılan) sınırsız bant genişliği anlamına gelir. Birim, şu örnekte olduğu gibi sayıyı hemen takip etmelidir:
dnctl pipe 1 config bw 300Kbit/s
Sayısal bir değer yerine bir aygıt adı belirtilirse, örneğin:
dnctl pipe 1 config bw tun0
bu durumda iletim saati (transmit clock) belirtilen aygıt tarafından sağlanır. Şu anda hiçbir aygıt bu işlevselliği desteklememektedir.
delay ms-delay Milisaniye cinsinden ölçülen yayılma gecikmesi. Değer, saat vuruşunun (clock tick) bir sonraki katına yuvarlanır (tipik olarak 10ms'dir, ancak çözünürlüğü 1ms veya daha azına düşürmek için çekirdekleri “options HZ=1000” ile çalıştırmak iyi bir uygulamadır). Varsayılan değer 0'dır, yani gecikme yoktur.
Bir kuyruk (queue) için aşağıdaki parametreler yapılandırılabilir:
pipe pipe_nr Bir kuyruğu belirtilen boruya (pipe) bağlar. Aynı boruya birden fazla kuyruk (aynı veya farklı ağırlıklarla) bağlanabilir ve bu boru, kuyruk kümesi için toplam (aggregate) hızı belirler.
weight weight Bu kuyrukla eşleşen akışlar için kullanılacak ağırlığı belirtir. Ağırlık 1..100 aralığında olmalıdır ve varsayılan değer 1'dir.
Son olarak, hem borular hem de kuyruklar için aşağıdaki parametreler yapılandırılabilir:
buckets hash-table-size Çeşitli kuyrukları depolamak için kullanılan karma tablosunun (hash table) boyutunu belirtir. Varsayılan değer, net.inet.ip.dummynet.hash_size sysctl(8) değişkeni tarafından kontrol edilen 64'tür; izin verilen aralık 16 ila 65536'dır.
mask mask-specifier Bir dnctl kuralı tarafından belirli bir boruya veya kuyruğa gönderilen paketler, her biri daha sonra farklı bir dinamik boruya veya kuyruğa gönderilen birden fazla akışa daha fazla sınıflandırılabilir. Boru veya kuyruğun yapılandırmasındaki mask seçenekleriyle belirtildiği gibi IP adresleri, bağlantı noktaları (ports) ve protokol türleri maskelenerek bir akış tanımlayıcısı oluşturulur. Her farklı akış tanımlayıcısı için, orijinal nesneyle aynı parametrelere sahip yeni bir boru veya kuyruk oluşturulur ve eşleşen paketler buraya gönderilir.
Böylece, dinamik borular kullanıldığında her akış boru tarafından tanımlanan bant genişliğinin aynısını alırken; dinamik kuyruklar kullanıldığında her akış ana borunun bant genişliğini aynı kuyruk tarafından oluşturulan diğer akışlarla eşit olarak paylaşır (farklı ağırlıklara sahip diğer kuyrukların aynı boruya bağlı olabileceğini unutmayın). Kullanılabilir maske belirteçleri, aşağıdakilerden birinin veya birkaçının birleşimidir:
dst-ip mask, dst-ip6 mask, src-ip mask, src-ip6 mask, dst-port mask, src-port mask, proto mask veya all,
burada ikincisi (all), tüm alanlardaki tüm bitlerin anlamlı olduğu anlamına gelir.
noerror Bir paket, bir dummynet kuyruğu veya borusu tarafından düşürüldüğünde, bir aygıt kuyruğu dolduğunda olduğu gibi hata normalde çekirdekteki çağıran rutine bildirilir. Bu seçeneğin ayarlanması, paketin başarıyla teslim edildiğini bildirir; bu durum, uzak bir yönlendiricide kayıp veya sıkışıklığı simüle etmek istediğiniz bazı deneysel kurulumlar için gerekli olabilir.
plr packet-loss-rate Paket kayıp oranı. packet-loss-rate argümanı 0 ile 1 arasında bir kayan noktalı sayıdır; 0 kayıp yok, 1 ise %100 kayıp anlamına gelir. Kayıp oranı dahili olarak 31 bit ile temsil edilir.
queue {slots | sizeKbytes} Kuyruk boyutu, slot (yuva) veya KByte cinsinden. Varsayılan değer, Ethernet aygıtları için tipik kuyruk boyutu olan 50 slottur. Yavaş hızlı bağlantılar için kuyruk boyutunu kısa tutmanız gerektiğini, aksi takdirde trafiğinizin önemli bir kuyruğa alınma gecikmesinden etkilenebileceğini unutmayın. Örneğin, en büyük boyutta 50 ethernet paketi (1500 bayt), 30Kbit/s'lik bir boruda 600Kbit veya 20 saniyelik bir kuyruk anlamına gelir. Çok daha büyük bir MTU'ya sahip bir arayüzden paket alırsanız, örneğin 16KB paketleriyle geri döngü (loopback) arayüzü, daha da kötü bir etki ortaya çıkabilir.
red | gred w_q/min_th/max_th/max_p RED (Random Early Detection - Rastgele Erken Algılama) kuyruk yönetimi algoritmasından yararlanın. w_q ve max_p 0 ile 1 arasında kayan noktalı sayılardır (0 dahil değildir); min_th ve max_th ise kuyruk yönetimi için eşik değerlerini belirten tam sayılardır (kuyruk bayt cinsinden tanımlanmışsa eşikler bayt cinsinden, aksi takdirde slot cinsinden hesaplanır). dummynet(4) ayrıca hafif RED varyantını (gred) da destekler.
RED davranışını kontrol etmek için üç sysctl(8) değişkeni kullanılabilir:
net.inet.ip.dummynet.red_lookup_depth bağlantı boşta olduğunda ortalama kuyruğu hesaplamadaki doğruluğu belirtir (varsayılan değer 256'dır, sıfırdan büyük olmalıdır)
net.inet.ip.dummynet.red_avg_pkt_size beklenen ortalama paket boyutunu belirtir (varsayılan değer 512'dir, sıfırdan büyük olmalıdır)
net.inet.ip.dummynet.red_max_pkt_size beklenen maksimum paket boyutunu belirtir, yalnızca kuyruk eşikleri bayt cinsinden olduğunda kullanılır (varsayılan değer 1500'dür, sıfırdan büyük olmalıdır).
Aşağıdaki seçenekler mevcuttur:
-a: Listeleme sırasında sayaç değerlerini gösterir. show komutu doğrudan bu seçeneği içerir.-f: Yanlış kullanıldığında sorunlara yol açabilecek komutlar (yani flush) için onay istemez. İşlemle ilişkili bir tty yoksa, bu durum doğrudan varsayılır.-h: Kısa bir yardım görüntüler.-n: Komut dizelerinin yalnızca sözdizimini kontrol eder, bunları gerçekten çekirdeğe iletmez.-q: Ekleme, sıfırlama, günlük sıfırlama veya temizleme işlemleri sırasında eylemler hakkında sessiz kalır (-f seçeneğini içerir). Bu, bir betik içinde birden fazla dnctl komutu yürüterek veya uzak bir oturumda birçok dnctl kuralından oluşan bir dosyayı işleyerek kuralları ayarlamak için yararlıdır. Normal (ayrıntılı) modda (varsayılan çekirdek yapılandırmasıyla) bir flush gerçekleştirilirse, bir mesaj yazdırır. Tüm kurallar temizlendiği için mesaj oturuma teslim edilemeyebilir, bu da uzak oturumun kapanmasına ve kural kümesinin geri kalanının işlenmemesine neden olabilir. Kurtarmak için konsola erişim gerekecektir.
-s [field] Boruları listelerken, dört sayaçtan birine göre sıralama yapar (toplam veya geçerli paketler ya da baytlar).
-v: Ayrıntılı çıktı verir.
Yapılandırmayı kolaylaştırmak için kurallar, son sinopsis satırında gösterildiği gibi dnctl kullanılarak işlenen bir dosyaya yerleştirilebilir. Mutlak bir yol adı kullanılmalıdır. Dosya satır satır okunacak ve dnctl yardımcı programına argüman olarak uygulanacaktır.
İsteğe bağlı olarak, dosya yolunun yönlendirileceği -p preproc kullanılarak bir önişlemci (preprocessor) belirtilebilir. Yararlı önişlemciler arasında cpp(1) ve m4(1) bulunur. preproc ilk karakteri olarak bir eğik çizgi (‘/’) ile başlamıyorsa, olağan PATH adı araması gerçekleştirilir. dnctl çalıştırılacağı sırada tüm dosya sistemlerinin (henüz) bağlanmamış olduğu ortamlarda (örneğin, NFS üzerinden bağlandıklarında) buna dikkat edilmelidir. -p belirtildikten sonra, ek argümanlar yorumlanmak üzere önişlemciye iletilir. Bu, esnek yapılandırma dosyalarına (bunları yerel ana bilgisayar adına göre koşullandırmak gibi) ve IP adresleri gibi sıkça gereken argümanları merkezileştirmek için makroların kullanılmasına olanak tanır.
Kontrol Listesi
Kurallarınızı tasarlarken göz önünde bulundurmanız gereken some önemli noktalar şunlardır:
• Hem giren hem de çıkan paketleri filtrelediğinizi unutmayın. Çoğu bağlantının her iki yönde de giden paketlere ihtiyacı vardır.
• Çok dikkatli test etmeyi unutmayın. Bunu yaparken konsolun yakınında olmak iyi bir fikirdir.
• Geri döngü (loopback) arayüzünü unutmayın.
Sysctl Değişkenleri
Bir dizi sysctl(8) değişkeni dummynet modülünün davranışını kontrol eder. Bunlar, varsayılan değerleri (ancak fiilen hangi değerin kullanımda olduğunu her zaman sysctl(8) komutuyla kontrol edin) ve anlamlarıyla birlikte aşağıda gösterilmiştir:
net.inet.ip.dummynet.expire: 1 Bekleyen trafiği kalmadığında dinamik boruları/kuyrukları yavaşça (lazily) siler. Değişkeni 0 olarak ayarlayarak bunu devre dışı bırakabilirsiniz; bu durumda borular/kuyruklar yalnızca eşik değerine ulaşıldığında silinecektir.
net.inet.ip.dummynet.hash_size: 64 Dinamik borular/kuyruklar için kullanılan karma tablosunun varsayılan boyutu. Bu değer, bir boru/kuyruk yapılandırılırken buckets seçeneği belirtilmediğinde kullanılır.
net.inet.ip.dummynet.max_chain_len: 16 Bir karma kutusundaki (hash bucket) maksimum boru/kuyruk sayısı için hedef değer. max_chain_len*hash_size ürünü, net.inet.ip.dummynet.expire=0 olduğunda bile boş boruların/kuyrukların süresinin dolacağı eşiği belirlemek için kullanılır.
net.inet.ip.dummynet.red_lookup_depth: 256
net.inet.ip.dummynet.red_avg_pkt_size: 512
net.inet.ip.dummynet.red_max_pkt_size: 1500 RED algoritması için düşürme olasılığının hesaplanmasında kullanılan parametreler.
Örnekler
Aşağıdaki kurallar, pf.conf(8) yapılandırma dosyalarındaki dummynet kurallarını kullanarak simülasyonlar ve benzerleri için bazı uygulamaları göstermektedir.
Rastgele gelen IPv4 ve IPv6 ICMP paketlerini %5 olasılıkla düşürmek için bir boru oluşturun:
dnctl pipe 10 config plr 0.05
ve pf.conf dosyanıza şu kuralları ekleyin:
dummynet in inet proto icmp all pipe 10
dummynet in inet6 proto ipv6-icmp all pipe 10
Bant genişliği sınırlamaları olan çift yönlü bir bağlantıyı simüle etmek istersek, doğru yol her yön için bir boru oluşturmaktır:
dnctl pipe 1 config bw 14Kbit/s queue 10Kbytes
dnctl pipe 2 config bw 1Kbit/s queue 10Kbytes
ve pf.conf dosyanıza şu kuralları ekleyin:
dummynet in all pipe 1
dummynet out all pipe 2
Yukarıdaki, örneğin süslü Web sayfanızın yalnızca yavaş bir bağlantı üzerinden bağlı olan bir ev kullanıcısı için nasıl görüneceğini görmek istiyorsanız çok yararlı olabilir. Yarım çift yönlü (half-duplex) bir ortamı (örneğin AppleTalk, Ethernet, IRDA) simüle etmek istemediğiniz sürece, her iki yön için tek bir boru kullanmamalısınız.
Yukarıdaki kurallarla boruların hem IPv4 hem de IPv6 protokolleri için trafik aldığını unutmayın.
RED kuyruk yönetimi algoritması ile ağ performansını doğrulamak istersek, bu boruyu oluşturun:
dnctl pipe 1 config bw 500Kbit/s queue 100 red 0.002/30/80/0.1
ve ardından pf.conf dosyanıza şu kuralları ekleyin:
dummynet all pipe 1
Trafik şekillendiricinin bir diğer tipik uygulaması da iletişime biraz gecikme getirmektir. Bu durum, çok fazla Uzak Prosedür Çağrısı (Remote Procedure Call) yapan ve bağlantının gidiş-dönüş süresinin (round-trip-time) genellikle bant genişliğinden çok daha fazla sınırlayıcı bir faktör haline geldiği uygulamaları önemli ölçüde etkileyebilir:
dnctl pipe 1 config delay 250ms bw 1Mbit/s
dnctl pipe 2 config delay 250ms bw 1Mbit/s
ve pf.conf dosyanıza şu kuralları ekleyin:
dummynet in all pipe 1
dummynet out all pipe 2
Akış başına kuyruklama (per-flow queueing) çeşitli amaçlar için yararlı olabilir. Çok basit bir tanesi trafiği saymaktır:
dnctl pipe 1 config mask all
ve pf.conf dosyanıza şu ifadeleri ekleyin:
dummynet in quick proto tcp all pipe 1
dummynet out quick proto tcp all pipe 1
dummynet in quick proto udp all pipe 1
dummynet out quick proto udp all pipe 1
dummynet in quick all pipe 1
dummynet out quick all pipe 1
Yukarıdaki kurallar kümesi, tüm trafik için kuyruklar oluşturacak (ve istatistik toplayacaktır). Boruların herhangi bir sınırlaması olmadığından, tek etki istatistik toplamaktır. Yalnızca son iki kurala değil, altı kurala ihtiyacımız olduğunu unutmayın, çünkü dnctl IP paketlerini eşleştirmeye çalıştığında bağlantı noktalarını (ports) dikkate almayacaktır, bu nedenle ayrı bağlantı noktalarındaki bağlantıları farklı bağlantılar olarak göremezdik.
Ayrıca Bakınız
cpp(1), dummynet(4), m4(1), ip(4), pfctl(8), pf.conf(5), protocols(5), services(5), sysctl(8)
Yazarlar
Ugen J. S. Antsilevich, Poul-Henning Kamp, Alex Nash, Archie Cobbs, Luigi Rizzo.
API, Daniel Boulet tarafından BSDI için yazılan koda dayanmaktadır.
Akamba Corp. tarafından desteklenen dummynet(4) trafik şekillendirici çalışması.
Geçmiş
dnctl yardımcı programı ilk olarak FreeBSD 2.0'da göründü. dummynet(4) FreeBSD 2.2.8'de tanıtıldı. Durumsal (stateful) uzantılar FreeBSD 4.0'da tanıtıldı.
Darwin 13 Ağustos 2002 Darwin