Netrix, Android üzerinde DPI/SNI tabanlı filtreleme davranışlarını incelemek için geliştirdiğim açık kaynaklı bir ağ aracı. Bu yazıyı, projenin README dosyasındaki kurulum veya özellik listesinin tekrarından çok, “Bu projeyi neden yaptım, hangi teknik kararlarla ilerledim, geliştirirken ne öğrendim?” sorularına cevap veren bir case study olarak düşünüyorum.
Bu yazı, Netrix’i teknik ve eğitsel bir proje olarak anlatır. Amacım ağ filtreleme mekanizmalarının nasıl çalıştığını anlamak, Android ağ katmanını daha yakından incelemek ve geliştirme sürecinden öğrendiklerimi kaydetmek.
Neden Netrix?
İnternette erişim engelleri her zaman yalnızca DNS veya IP seviyesinde çalışmaz. Bazı sistemler, ağ trafiğinin belirli bölümlerini analiz ederek hangi bağlantının kurulmak istendiğini anlamaya çalışır. Bu noktada DPI, yani Deep Packet Inspection kavramı devreye girer.
Netrix’i geliştirmeye başlarken merak ettiğim temel soru şuydu:
Android üzerinde, ağ trafiğini kullanıcı dostu bir uygulama içinden gözlemlemek ve farklı paket işleme stratejilerinin etkisini deneysel olarak incelemek mümkün mü?
Bu soru beni Kotlin, Jetpack Compose, Android VpnService, root gerektiren ağ yaklaşımları ve native C entegrasyonu gibi birden fazla teknik alanın kesiştiği bir proje yapmaya götürdü.
DPI ve SNI’yi Nasıl Düşünüyorum?
DPI, ağ paketlerinin yalnızca IP ve port bilgisine değil, paketin taşıdığı içeriğe veya protokol davranışına da bakarak analiz edilmesi anlamına gelir. HTTPS tarafında ise TLS bağlantı sürecinin erken aşamalarında hedef alan adı hakkında ipucu verebilen SNI alanı önemli hale gelir.
Netrix tarafında ilgilendiğim konu, bu davranışları bir Android uygulaması içinden nasıl modelleyebileceğimdi. Burada odak noktam, hazır bir “bypass tarifi” yazmak değil; Android’in izin modeli, ağ trafiği yönetimi ve düşük seviyeli paket davranışları arasındaki ilişkiyi anlamaktı.
Android Tarafı Neden İlginç?
Android’de ağ trafiğine dokunmak masaüstü ortamlara göre daha sınırlı ve daha kontrollü bir alan. Bir yandan kullanıcının güvenliği için izin modeli var, diğer yandan uygulama seviyesinde ağ davranışını yönetmek için VpnService gibi resmi API’ler bulunuyor.
Netrix’te iki farklı çalışma modelini ayrı düşündüm:
- VPN modu: Root gerektirmeden, Android’in VpnService API’si üzerinden ağ trafiğini ele alma fikrine dayanır.
- Root/NFQUEUE modu: Daha düşük seviyeli ve sistem geneline daha yakın bir yaklaşım sunar, ancak root ve native tarafla ilgili daha fazla sorumluluk getirir.
Bu ayrım, projeyi geliştirirken en çok düşündüğüm mimari konulardan biriydi. Root gerektirmeyen yaklaşım daha erişilebilir, root tabanlı yaklaşım ise daha teknik ve düşük seviyeli bir deney alanı sunuyor.
Netrix’in Teknik İskeleti
Projeyi üç ana katman gibi düşünüyorum:
- Arayüz katmanı: Kotlin ve Jetpack Compose ile hazırlanan ekranlar, ayarlar, loglar ve durum göstergeleri.
- Android ağ katmanı: VpnService, bağlantı yönetimi, DNS davranışları ve uygulama izinleri.
- Düşük seviye katman: Root/NFQUEUE yaklaşımı, native C kodu ve sistem seviyesine daha yakın paket işleme mantığı.
Bu ayrım, projeyi okurken de geliştirirken de zihinsel olarak temiz kalmamı sağladı. Arayüz tarafında kullanıcının ne gördüğünü ve hangi ayarı değiştirdiğini düşünürken, ağ katmanında bu seçimin sistem davranışına nasıl yansıdığını ayrı takip edebildim.
Arayüzde Ne Hedefledim?
Bu tür teknik araçlarda en büyük sorunlardan biri, arayüzün konu kadar karmaşık hale gelmesi. Netrix’te ayarları mümkün olduğunca anlaşılır bölümlere ayırmaya çalıştım:
- Çalışma modu
- Ağ ayarları
- DNS/QUIC gibi destekleyici seçenekler
- Gerçek zamanlı loglar
- Tema ve dil desteği
Buradaki hedefim, teknik bir aracı sadece “çalışıyor” seviyesinde bırakmamak, aynı zamanda kullanıcının ne olup bittiğini takip edebileceği bir deneyim oluşturmaktı.
Geliştirirken Ne Öğrendim?
Netrix bana özellikle şu alanlarda iyi bir pratik sağladı:
- Android’de VpnService mantığını daha iyi anlamak
- Kotlin ile sistem seviyesine yakın bir araç geliştirirken durum yönetimini sade tutmak
- Jetpack Compose ile teknik ayar ekranlarını okunabilir hale getirmek
- Native C tarafını Android projesine entegre etmenin getirdiği build ve mimari kararlarını görmek
- TLS/SNI gibi kavramları yalnızca teorik değil, uygulama davranışı üzerinden düşünmek
En önemli kazanımlardan biri de şu oldu: Teknik olarak güçlü bir özellik, kullanıcıya iyi anlatılmazsa ürün gibi hissettirmiyor. Bu yüzden Netrix’te loglar, ayar isimleri ve mod ayrımları benim için en az ağ katmanı kadar önemliydi.
Zorlandığım Noktalar
Bu projede beni en çok zorlayan kısım, farklı Android cihazlarda ve farklı sistem izinlerinde tutarlı davranış elde etme fikriydi. Root gerektirmeyen bir yolla ilerlemek kullanıcı için daha rahat, ama teknik olarak daha sınırlı. Root/NFQUEUE tarafı ise daha esnek, fakat kurulum ve sorumluluk olarak daha ağır.
Bir diğer zorluk da teknik dili dengelemekti. DPI, SNI, TLS, paket parçalama, VpnService ve NFQUEUE gibi kavramları anlatırken hem doğru kalmak hem de yazıyı sadece dar bir uzman grubuna hitap eden bir doküman haline getirmemek gerekiyor.
Etik Çerçeve
Netrix’i anlatırken bu bölümü özellikle ayrı tutmak istiyorum. Proje, ağ filtreleme davranışlarını anlamaya ve Android üzerinde deneysel ağ uygulaması geliştirmeye odaklanan teknik bir çalışma. Bu tür araçlar kullanılırken yerel yasalar, kurum kuralları ve kullanılan ağın politikaları dikkate alınmalı.
Benim için Netrix’in değeri, “şu ayarı aç, şu engeli geç” gibi bir tariften ziyade; Android ağ geliştirme, DPI mantığı ve sistem seviyesine yakın uygulama tasarımı hakkında öğrendiklerimi somut bir proje üzerinden göstermesi.
Sonraki Adımlar
Bu yazıyı zamanla şu başlıklarla genişletmeyi planlıyorum:
- Netrix mimarisinin diyagramla anlatımı
- VPN modu ve root modu arasındaki farklar
- Compose arayüz kararlarının ekran görüntüleriyle açıklanması
- Release süreci ve APK dağıtımı
- Test ederken kullandığım senaryolar
Kaynak Kod
Projenin kaynak koduna GitHub üzerinden ulaşılabilir:
Netrix benim için yalnızca bir Android uygulaması değil; ağ davranışlarını, sistem izinlerini, düşük seviyeli paket işleme fikirlerini ve teknik bir aracı kullanıcıya anlatma becerisini bir araya getiren bir öğrenme projesi oldu.