Doğru zamanı elde etmenin ilk şartı, güvenilir olmayan zaman kaynaklarını ayırt edebilmektir.
netio.ntp-relay, birden fazla üst zaman kaynağını sürekli olarak izler ve ölçer. Elde ettiği verileri karşılaştırarak çoğunluk esasına göre güvenilir kaynakları belirler ve yerel sistem saatini yalnızca bu kaynaklardan aldığı bilgilerle disipline eder.
Sistem, üst kaynaklardan aldığı NTP paketlerini doğrudan istemcilere iletmez. Bunun yerine, kendi ölçüm ve hesaplamalarıyla oluşturduğu zamanı, belirlediği hata sınırları ve doğruluk bilgileriyle birlikte sunar.
State: Synchronized Stratum: 2 Reference: time.google.com (216.239.35.4) Serving as: 216.239.35.4 Its reference: GOOG Leap: none Offset: +21.0us Jitter: 7.0us Frequency: -13.529 ppm Stability: 0.031 ppm Root Distance: 1.01ms Clock: linux-adjtimex (precision 25ns) Sources: 4 configured, 4 reachable, 3 contributing, 1 falsetickers
Her yanıt, yerel olarak disipline edilen saatten üretilir
Bu yazılım bir aktarıcı değildir. Üst kaynaklardan gelen paketler istemcilere iletilmez, bu paketlerdeki zaman damgaları yanıtlara kopyalanmaz. Süreç dört aşamadan oluşur.
Ölçüm
Her üst kaynak, kendisine ayrılmış bağlı bir UDP soketi üzerinden bağımsız olarak yoklanır. Gönderilen istek, sunucunun yanıtında aynen geri döndürmesi gereken 64 bitlik rastgele bir değer taşır. Bu sayede, iletim yolu üzerinde bulunmayan bir saldırganın geçerli bir yanıt üretebilmesi için söz konusu 64 biti tahmin etmesi gerekir.
Süzme
Her kaynak için sekiz kademeli bir kaydırmalı yazmaç tutulur. Kuyruk gecikmesi ölçüme yalnızca ek süre bindirebildiğinden, son sekiz ölçüm içinde gidiş-dönüş süresi en kısa olan, ağ koşullarından en az etkilenmiş ölçümdür. Bu nedenle süzgeç ölçümlerin ortalamasını almaz; aralarından en güvenilir olanı seçer.
Seçim
Her kaynak tek bir değer olarak değil, sapması ile hata sınırının belirlediği bir aralık olarak değerlendirilir. Doğru zamanın, en fazla sayıda aralığın kesiştiği bölgede bulunduğu kabul edilir; aralığı bu bölgeyle kesişmeyen kaynaklar çoğunlukla çeliştiği için devre dışı bırakılır. Böylece n kaynağın (n−1)/2 tanesi hatalı olsa dahi sonuç doğru kalır.
Disiplin
Faz hatası ani bir sıçramayla değil, saat bir süre boyunca çok az hızlı veya yavaş çalıştırılarak giderilir. Böylece sistem saati geriye gitmez ve atlama yapmaz. Sıçrama yalnızca 128 ms'yi aşan bir sapmanın 15 dakika boyunca sürmesi durumunda uygulanır; istenirse tamamen devre dışı bırakılabilir.
Değerler beyan değil, ölçüm sonucudur
RFC'ye uygun paket üretmek, bir sunucunun doğru zaman tuttuğunu göstermez. Aşağıdaki değerler, ürünün kendi kodunun — gerçek ölçüm süzgeçleri, gerçek kaynak seçimi ve gerçek disiplin döngüsüyle — denetimli bir ağ benzetimi altında çalıştırılmasıyla elde edilmiştir. RMS, sistemin kararlı duruma geçmesinden sonraki saat hatasının karesel ortalamasıdır.
| Koşul | RMS hata | En kötü an |
|---|---|---|
| Yerel ağ, 4 kaynak, milisaniye altı gecikme | 79 µs | 87 µs |
| İnternet, 4 kaynak, 2–60 ms gecikme, %1–3 paket kaybı | 314 µs | 365 µs |
| 3 doğru kaynak ve 500 ms sapma gösteren 1 hatalı kaynak | 92 µs | 96 µs |
| Çalışma sırasında bir üst kaynağın saatinde 300 ms sıçrama | 57 µs | 59 µs |
| Dört kaynağın tamamı iki saat boyunca erişilemez | 42 µs | 52 µs |
| Tüm yollarda %40 paket kaybı | 258 µs | 298 µs |
| Kristal osilatörde 6 saatlik ısıl çevrimle ±3 ppm salınım | 593 µs | 877 µs |
Tablodaki üçüncü satır tasarımın temel iddiasını ortaya koymaktadır: kaynaklardan biri 500 ms sapma gösterirken sistem saati 92 µs hata payında kalmıştır, çünkü bu kaynak hesaplamaya hiç dahil edilmemiştir. Aynı testte doğru çalışan kaynakların hiçbiri yanlışlıkla devre dışı bırakılmamıştır.
gecikme = (t4 − t1) − (t3 − t2)
Bu dört zaman damgasına dayanan hesaplama tek bir varsayım içerir: gidiş ve dönüş sürelerinin eşit olduğu. Süreler eşit değilse aradaki farkın yarısı doğrudan sapma değerine yansır ve bu hata hiçbir algoritmayla giderilemez. Yazılım bu sınırı gizlemez; hesapladığı hata sınırını her yanıtta istemciye bildirir.
Yansıtma saldırılarında kullanılamaz
NTP protokolünün yansıtma saldırılarındaki olumsuz ünü, kısa bir isteğe karşılık uzun yanıtlar üreten yönetim modlarından kaynaklanır. Bu modlar uygulanmamıştır ve ilgili paketler yanıtsız bırakılır; bir hata yanıtı üretmek dahi, kaynak adresi taklit edilmiş bir hedefe trafik göndermek anlamına gelirdi.
- mod 6 / mod 7
- Uygulanmamıştır, yanıt verilmez. monlist desteği bulunmaz.
- amplifikasyon
- Her yanıt tam 48 bayt, her istek en az 48 bayttır. Çarpan 1'i geçemez.
- hız sınırı
- Kotasını aşan istemciye yanıt verilmez. IPv6 istemcileri /64 blok başına sınırlanır; tek bir makineye 2⁶⁴ adres tahsis edilebildiğinden adres başına sınırlama koruma sağlamaz.
- bellek
- İstemci tablosu sınırlı boyuttadır ve kuşak esaslı olarak geri dönüştürülür. Kaynak adresi taklit edilmiş yoğun trafik bellek kullanımını artıramaz; etkin istemciler geri dönüşüm sırasında korunur.
- kontrol arayüzü
- Salt okunur bir Unix soketidir. Loopback dışındaki adreslere bağlanmayı reddeder; ağa açık kalabilecek bir yönetim portu bulunmaz.
- yetki
- systemd birimi yalnızca CAP_NET_BIND_SERVICE ve CAP_SYS_TIME yetkilerini tanır; dosya sistemi salt okunur, seccomp süzgeci dardır.
- bozulma davranışı
- Hata sınırı büyüdükçe bildirilen dispersiyon değeri de büyür; sınır aşıldığında sunucu stratum 16 bildirerek kendini kullanım dışı bırakır. Doğruluğundan emin olmadığı bir zamanı istemcilere sunmaz.
Tek komut, tek dosya, sıfır bağımlılık
Kurulum betiği sistem mimarisini algılar, statik çalıştırılabilir
dosyayı indirir ve SHA256SUMS ile doğrular; sistem
kullanıcısını ve servis birimini oluşturur; saati yöneten diğer
servisleri durdurup maskeler (systemd-timesyncd Ubuntu'da
öntanımlı olarak etkindir); servisi başlatmadan önce yapılandırmayı
denetler ve son olarak servisin gerçekten yanıt verdiğini doğrular.
Betik tekrar çalıştırılabilir; mevcut yapılandırmanızın üzerine yazmaz.
# kurulum ve yükseltme curl -fsSL https://ntp.netio.com.tr/install.sh | sudo bash # çalıştırmadan önce içeriğini incelemek için curl -fsSL https://ntp.netio.com.tr/install.sh -o install.sh less install.sh && sudo bash install.sh # kaldırma (yapılandırma ve drift dosyası korunur) curl -fsSL https://ntp.netio.com.tr/install.sh | sudo bash -s -- --uninstall
Betiği doğrudan root kabuğuna aktarmak
Bu yöntem konusunda temkinli olmak yerinde bir yaklaşımdır. Betiğin söz konusu riske karşı aldığı önlemler şunlardır:
- doğrulanmadan kurmaz
- Çalıştırılabilir dosyanın sağlama değeri SHA256SUMS ile karşılaştırılır; değerler uyuşmazsa sisteme hiçbir dosya yazılmadan işlem durdurulur.
- kısmi çalışmaz
- Dosya baştan sona fonksiyon tanımlarından oluşur ve yalnızca son satırda çağrılır. İndirme yarıda kesilirse bash betiğin hiçbir bölümünü çalıştırmaz; bu davranış altı farklı kesme noktasında sınanmıştır.
- düz http reddedilir
- İndirilen dosya root yetkisiyle çalışacak ve sistem saatini değiştirecektir; aktarım kanalının yol üzerinde değiştirilebilir olmasına sessizce izin verilmez.
- ELF denetimi
- İndirilen dosyanın geçerli bir Linux çalıştırılabilir dosyası olduğu denetlenir; 200 durum koduyla dönen bir HTML hata sayfası bu aşamada yakalanır.
Güvenlik duvarı
Yalnızca gelen UDP 123 portunun açılması yeterlidir. Protokol TCP kullanmaz; giden yoklamalar bağlı soket üzerinden yapıldığından bağlantı takibi yanıtları kendiliğinden geçirir ve ayrı bir kural gerektirmez.
sudo ufw allow 123/udp comment 'NTP'
Bir sorun oluştuğunda nedenini bildirir
Bir kaynak devre dışı bırakıldığında bunun gerekçesi çıktıda yer alır; sistem yöneticisinin seçim algoritmasının işleyişini ayrıca yorumlaması gerekmez.
sudo ntp-relay sources S SOURCE STRATUM OFFSET DELAY JITTER DIST REACH POLL STATE * time.google.com 1 +21.0us 1.80ms 4.0us 2.10ms 377 17m4s reachable + time.cloudflare.com 1 +24.0us 2.10ms 5.0us 2.40ms 377 17m4s reachable + 0.pool.ntp.org 2 -91.0us 12.00ms 82.0us 14.20ms 377 17m4s reachable x 1.pool.ntp.org 2 +1.203s 14.00ms 91.0us 16.10ms 377 17m4s reachable * system peer + contributing x falseticker - outlier ? rejected or unusable Notes: 1.pool.ntp.org: offset 1.203s outside agreed interval [-2.4ms, 2.6ms]
Baştaki işaretler kaynağın seçimdeki durumunu gösterir:
* sistem referansı, + hesaba katılan kaynak,
x çoğunlukla çelişen kaynak, - gürültüsü
nedeniyle elenen kaynak, ? kullanılamaz kaynak. Yukarıdaki
örnekte dördüncü kaynak 1,2 saniyelik sapması nedeniyle devre dışı
bırakılmış ve gerekçesi Notes bölümünde belirtilmiştir.
status, sources, stats ve
config alt komutları çalışan servisi yerel soket üzerinden
sorgular; tümü -json seçeneğini destekler. Yapılandırma
değişiklikleri systemctl reload ile servis durdurulmadan
uygulanır.