12.06.2025

Powershell betiklerinde günlük tutma

Düzenli olarak çalışan bir betik ile ilgili günlük tutmak faydalı oluyor. Günlüğün ilk başında yyyy-aa-gg ss:dd:nn biçiminde bir tarih alanı olmalı, sonrasında da günlük kaydına sebep olan olayla ilgili bilgiler yer almalı. İlk bulduğum yöntem şuydu:

$suan = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$log = "D:\log.txt"
... 
Add-Content -Path $log -Value "$suan beklenmeyen hata"

Sonra her seferinde tarih değişkeni ile uğraşmamak için fonksiyon oluşturmak istedim.

function gunluk {
    param (
        [string]$mesaj
    )
    $suan = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $log = D:\log.txt
    Add-Content -Path $log -Value "$suan - $mesaj"
}
...
gunluk "beklenen hata"

Bu gayet pratik bir yöntem oldu, benim için. Sonrasında yürütme işlecini (&) keşfettim.

$log = "D:\log.txt"
$suan=Get-Date -Format "yyyy-MM-dd HH:mm:ss"; 
$gunluk = {param($mesaj);Add-Content -Path $log -Value "$suan - $mesaj"}
...
& $gunluk "baska bir hata daha"

Fonksiyonu çağırmak mı daha etkilidir, yoksa bir değişkenin içeriğini çalıştırmak mı, bilemedim ama bu da güzel.

Duruma göre, $suan değişkeni de bloğun içine alınabilir.

30.05.2025

Linux güvenlik duvarı ve logları

Debian sunucu üzerinde ufw güvenlik duvarını etkinleştirmiş, 

sudo ufw enable

bazı hizmetler için port açma kuralları oluşturmuştum.

sudo ufw allow to <hizmet|port>

Ara sıra güvenlik kayıtlarını incelemek için

sudo journalctl -u <hizmet> --since "1 week ago"

gibi bir komut ile son 1 hafta içinde gerçekleşen olaylara ait kayıtları inceliyordum. Şüpheli/ısrarcı bir IP adresinden gelen istekler ile ilgili engelleme kuralları koyuyordum.

sudo ufw deny from 192.168.5.0/24 to any

Normalde /var/log/ufw.log dosyasında engellenen IP adreslerine ait kayıtlarının olması gerekir.

sudo tail /var/log/ufw.log

Bir süre sonra farkettim ki ufw ile önce istediğim hizmeti etkinleştirip altında da ufw deny komutu ile eklediğim IP engellemeleri aslında engellenmiyor. Bunun sebebi de genel olarak güvenlik duvarı kuralları içinde işlemin üstteki kuraldan başlaması ve aşağıya doğru inmesi. Trafiğe uyan bir kural bulunduktan sonra alttaki diğer kurallar işletilmiyor. Yani üstte hizmete izin veren bir kural varsa attaki engellemeler çalışmıyor. Bunun için engelleme kurallarını izin verme kurallarının üstüne koymaya başladım, aşağıdaki gibi

sudo ufw insert 1 deny from 192.168.5.0/24 to any

Bunun sonucunda da /var/log/ufw.log dosyasına artık kayıtlar düşmemeye başladı. Acaba engellemeler çalışmıyor mu diye düşündüm ama

sudo iptables -L ufw-user-input -v -n

komutuyla baktığımda ilgili engelleme kurallarının yanıdaki sayaçların arttığını gördüm. Yani engelleme kuralları çalışıyor ama log kayıtları oluşmuyordu. Arka planda iptables altyapısını kullanan ufw, izin, engelleme ve log işlemleri için karmaşık bir kural yapısına sahip. insert ile üst sıraya eklediğim kurallar log yapısını bozuyor. Buna çözüm olarak önce ufw-user-input zincirine iptables komutu ile yeni LOG kuralı eklemeyi (her IP için ayrı kural) denedim.

sudo iptables -I ufw-user-input 1 -s 192.168.5.0/24 -j LOG --log-prefix "[UFW BLOCK] "

Ama her yeni IP adresi engelleme kurallı eklediğimde ufw, iptables kurallarını sıfırlayıp kuralları tekrar baştan yazdığı için log kuralım da siliniyordu. Bu duruma çözüm olarak LOG kurallarını ufw-user-input zincirine değil de ufw-before-input zincirine eklemeyi, ekleme işlemini de /etc/ufw/before.rules dosyası aracılığıyla yapmayı buldum. Bu şekilde kuralları değiştirdiğimde eski LOG silinmiyor. before.rules dosyasında *filter anahtar kelimesi ile başlayan ve # End required lines ile biten bölümden hemen sonra

-A ufw-before-input -s 192.168.5.0/24 -j LOG --log-prefix "[UFW BLOCK] " --log-level 4

ekliyorum. Bunu da engellediğim her IP adresi için ayrı ayrı yapıyorum.

iptables altyapısı aslında /var/log/ufw.log gibi bir dosyaya log yazmıyor. ufw nasıl oluyor da buraya yazabiliyor, merak ettim. Loglar aslında

/var/log/syslog
/var/log/messages
/var/log/kern.log

yazılıyor. Bu loglar üzerinden de

grep "UFW BLOCK" /var/log/kern.log

gibi sorgular ile ufw engellemeleri görülebiliyor. Bunların ufw.log dosyasında da görünmesini sağlayan ise rsyslog sistemi. /etc/rsyslog.d/20-ufw.conf dosyasında aşağıdaki gibi bir satır var.

:msg,contains,"[UFW " /var/log/ufw.log

Bu satır sayesinde syslog kayıtlarında içinde "[UFW " geçen logların /var/log/ufw.log dosyasına yönlendirilmesi sağlanmış.

Dahası, bir süredir iptables altyapısı yerine nftables'ın kullanıldığı farkettim.

sudo iptables -V

komutu sonucunda parantez içinde nf_tables yazıyorsa evet, iptables yerine nftables kullanıyoruz demek. Bunun yerine parantez içinde legacy yazıyor veya olabilir ya da parantez içinde bir ifade olmayabilir. Bu, iptables olduğunun göstergesi. Bir süre daha uyumluluk modunda iptables komutları ile çalışabiliriz. Ama bu uyumluluk modu uzun sürmeyecek. Sistemde nftables'ın izlerini aramak için önce kurulu paketlerin içinde nftables arayabilirim. Debian tabanlı sistemlerde

dpkg -l | grep -E "(iptables|nftables|ufw)"
veya Fedora türevlerinde
rpm -qa | grep -E "(iptables|nftables|firewalld)"

Yüklü modüllerde nf_tables olup olmadığına bakabilirim

lsmod | grep nf_tables

systemd birimlerine bakabilirim

systemctl list-units --type=service | grep -E "(iptables|nftables|firewall)">

Son olarak nftables kullanan bir sistemde

nft list ruleset

ile json formatında bir çıktı kural kümesini gösterir. Diğer bazı kontroller:

update-alternatives --display iptables
ls -l /etc/alternatives/iptables


28.04.2025

Enlem boylam bilgisinden adres sorgulama

Bir ara lazım oldu, enlem boylam bilgisinden adresleri çıkarabilir miyim diye bir baktım. Coğrafi adres bilgisinin enlem boylama dönüştürülmesine geocoding, tam tersi işleme (yani enlem boylam bilgisinin coğrafi adres bilgisine dönüştürülmesine) de reverse geocoding deniyormuş. Çevrim içi hizmetlerden geoapify.com'u buldum. Bir API anahtarı alınması karşılığında bu hizmetleri veriyorlar. Günlük az bir miktar sorgu (3000 kredi denmiş) için ücretsiz API anantarı elde edilebiliyor.

Daha önce şu yazımda da IP adresinden coğrafi adres bilgisinin coğrafi adrese dönüştürülmesi için ipstack.com'un API'lerini kullanan bir örnek hakkında yazmıştım. Mantık aynı, bir çevrim içi hizmet var, bu hizmeti kullanmak için bir hesap açarak API anahtarı ediniyoruz. Daha sonra bir adreste REST sorgusu gönderip JSON alıyoruz.

$enlem ve $boylam değişkenlerinde koordinatlarımızın, $api_key değişkeninde de edindiğimiz anahtarın olduğunu varsayalım. REST sorgusunun gönderileceği adresimiz şöyle yapılandırılacak:

$url="https://api.geoapify.com/v1/geocode/reverse?lat=$enlem&lon=$boylam&apiKey=$api_key"

Powershell kullanarak bir REST sorgusu ile göndermek için Invoke-RestMethod kullanabiliriz:

$response = Invoke-RestMethod -Uri $url -method get

$response nesnesinin içinde features[0].properties nesnesinin altında adres bilgisi gelecek. Örnek olarak

$baz = $response.features[0].properties

$baz nesnesinin altında dönen alanları görebiliriz. Şehir bilgisi için

$baz.City

Ülke bilgisi için

$baz.Country

kullanılabilir. 

20.04.2025

Windows 11 için tarifeli bağlantı

Bilgisayarımı kısıtlama olmadan bir kablosuz ağa bağlamak güzel bir şey. Ama bazı durumlarda kısıtlı paketi olan cep telefonu veya başka mobil bağlantılar üzerinden internete bağlanmam gerektiğinde Windows'un bütün güncellemelerini başlatıp kotayı doldurmasını istemiyorum. Bunun için Ayarlar > Ağ ve İnternet > Wi-Fi bölümünden istediğim kablosuz ağı seçip özelliklerinden "Tarifeli bağlantı" ayarını "Açık" konuma getirdim.


 Ya da bunun eşdeğerini komut satırından yapmak için önce mevcut kablosuz ağları bir sorgulayayım.
netsh wlan show profiles

Bu komutun çıktısında en alta doğru "Cost settings" bölümünde Cost kısmında "Unrestricted" yazıyorsa tarifeli değildir. Burada "Fixed" görmek gerek. Onun için aşağıdaki komutla bunu yapabilirim.

netsh wlan set profileparameter name="POCO X3 Pro" cost=Fixed

Bu şekilde Windows'un arka planda güncellemeler, OneDrive dosya yükleme ve indirmeleri gibi yüklerden kurtulabiliriz. Ama bazı üçüncü parti uygulamalar bu kurallara uymayabilir, kontrol etmekte fayda var.

10.04.2025

Powershell ile symbolic ve hard link oluşturma ve sorgulama

C: sürücümüzün kökünde büyük bir dosya oluşturalım.

fsutil file createnew buyuk-dosya.txt (5GB)

Şimdi de profil klasörümüze gelip bu dosyaya bir sembolik link oluşturalım. mklink komutu ile ve Powershell ile bunu aşağıdaki gibi yapabiliriz.

mklink sembolik-link.txt C:\buyuk-dosya.txt

New-Item -ItemType SymbolicLink -Name sembolik-link.txt -Target C:\buyuk-dosya.txt

Sembolik link yaratılacak nesne bir dosya değil de bir klasör olsaydı

mklink /D sembolik-klasor C:\hedefklasor

New-Item -ItemType SymbolicLink -Name sembolik-klasor -Target C:\hedefklasor 

Bir dosyaya hard link oluşturmak için ise

mklink /H sembolik-link2.txt C:\buyuk-dosya.txt

New-Item -ItemType HardLink -Name sembolik-dosya2.txt -Target C:\buyuk-dosya.txt

Hedefimiz bir klasör olsaydı hardlink yerine junction kullanmamız gerekecekti.

mklink /J junction-klasor C:\hedefklasor

New-Item -ItemType Junction -Name junction-klasor -Target C:\hedefklasor

Sembolik link durumunda orijinal dosyayı sildiğimizde sembolik link öksüz kalır, veriler gitmiş olur. Hardlink durumunda ise orijinal dosya silinse bile veriler silinmez, hardlink aracılığıyla erişilebilir.

Peki bu yöntemlerin herhangi biriyle oluşturulan linkler diskte ayrıca her kaplar mı? Cevap hayır. Gerek Sembolik gerekse hardlink diskte orijinal dosyadan başka yer kaplamaz. Linkler üzerinden dosya içeriği değiştiği zaman hardlink'lerin LastWriteTime özniteliği değişir, ama symbolik link'in değişmez.

Bu işlemlerin hepsi için yönetici yetkileri gerekir.

Ama aşağıdaki gibi var olan dosyaların özelliklerini sorgulamak için yönetici yetkileri gerekmez.

dir | select Name, LinkType, Target, Attributes


9.04.2025

Web Tarayıcılar

Ladybird tarayıcısının da görünmeye başlamasıyla elimizdeki tarayıcılara bir bakmak istedim. Özellikle Windows dünyasındaki web tarayıcıların çoğu iki tarayıcı moturundan türediler: Gecko ve Blink. Gecko, Firefox'un da kullandığı, Mozilla Vakfı tarafından geliştirilmiş bir motor. Blink ise Chromium tarafından kullanılan bir motor. Bunun dışında bir de Webkit var ama sadece Safari tarafından kullanılıyor. Bir de eskiden Presto vardı, sadece Opera tarafından kullanılan ama sanıyorum şu anda yok.

Gecko tarayıcı motorunu kullanan tarayıcılar:

1. Firefox

 

Netscape'in misyonunu devam ettiren tarayıcı. Açık kaynak kodlu. Özgür. Linux'ta varsayılan olarak gelmeye devam ediyor. Son dönemlerde kullanıcı verilerini satma olayı ile gündeme geldi.

2. LibreWolf


"Firefox'un kapalı kaynak kodlu bileşenleri çıkarıldıktan sonra geriye kalan" şeklinde anlatılıyor. Pocket gibi gereksiz bileşenler yok, uBO yüklü geliyor. Gizlilik ve güvenlik ayarları yapılmış gelen bir Firefox gibi (Ayarlar>Gizlilik ve Güvenlik>Gelişmiş izleme koruması=Sıkı olarka geliyor). Çevrim dışı çeviri var. Firefox sync varsayılan olarak kapalı geliyor, ama açılabiliyor. Firefox containers varsayılan etkin geliyor.

3. Waterfox

Firefox'un eski bir sürümünden türediği yazılmış ama yeni Firefox özelliği çevrim içi çeviri var. Firefox ve LibreWolf'a göre daha hızlı. Firefox containers varsayılan etkin geliyor ama uBO yüklü değil. Pocket de yok çok şükür.

4. Tor

 

Onion routing denen protokolü destekleyen 2 tarayıcıdan biri olmasının dışında yüksek hassasiyetle kullanıcı tarafındaki bazı "parmak izi" olarak nitelenen kullanıcıya özgü verilerin alınmasını engelleyen/zorlaştıran bir tarayıcı. Her gün kullanım için uygun mudur, bilemiyorum. Ama yüksek güvenlikli işler için uygun.

5. Floorp

 

Piyasada Firefox türevi yeni bir tarayıcı olduğunu öğrendiğimde atladığım bir tarayıcı. Benchmark puanı Waterfox'tan da yüksek. Japonya merkezli bir geliştirme ekibinin ürünü. uBO yüklü değil ama containers özelliği etkin geldi. Firefox sync özelliği var.

6. Zen

 

Son dönemlerin favori tarayıcısı. Reddit'te en çok bahsedilen. En önemli özelliği henüz Firefox'a bile gelmemişken dikey tarayıcı sekmesini desteklemesi oldu. Galiba Firefox'tan sıkılanların seçimi. Containers varsayılan olarak geliyor, uBO da. Firefox sync var.
 

7. Pale Moon

Firefox'un çok eski görünümüne sahip. Biraz sıkıcı olabilir. Günlük ihtiyaçlar için kullanılabilir mi?

8. Sea Monkey

 


Firefox'un daha da eski bir görünümü; hatta Mozilla suite gibi bir görünüşe sahip. Çağdaş bir tarayıcı olarak tercih edilir mi, bilemiyorum.

Blink tarayıcı motorunu kullanan tarayıcılar

1. Chromium

 

 
Google Chrome'un tabanı olarak vazife yapan tarayıcı. Windows dünyasında çaba sarfetmeden bulmak zor. Bulduktan sonra da niye bu çaba demek olası. Bir ara Google hizmetlerinin Chromium'dan kaldırılması gündemdeydi, ama radarımın dışında bir tarayıcı olduğu için denemedim, bilmiyorum.

2. Google Chrome

 

Temelde bir reklam şirketi olan Google'ın kullanıcı verilerine bir şekilde erişmek ve kullanabilmek için çıkardığı ve nedense çok popüler olan tarayıcı. Piyasada bu kadar tarayıcı varken kullanmak için herhangi bir neden göremiyorum. Özellikle de manifest v3 sonrası.

3. Brave


Chrome türevi olarak piyasaya çıkan ve güvenlik ve gizlilik endişeleri olan kişiler için uygun olduğu vurgusu yapılan tarayıcıların içinde benim gözüme en çok çarpan. Kendi reklam engelleyicisi var ama bu da "kabul edilebilir reklamları" kapsam dışı bırakıyor. Chrome tabanlı tarayıcılardan Tor ağına bağlanabilen tek türev.

4. Vivaldi

 

"Chrome tabanlı tarayıcılarından biri" etiketinden sıyrılmak ve z kuşağının gözüne girebilmek için renkli dikkat çeken özellikler edinmeye çalışan bir tarayıcı. Neden bilmem, uBO'ya güvenmeyip "Duckduckgo Tracker  Radar" özelliğini eklemiş. Gereksiz. ChatGPT'den uBO ile DuckDuckGo Tracker Radar'ı karşılaştırmasını istedim:

FeatureDuckDuckGo Tracker RadaruBlock Origin
Tracker BlockingYesYes
Ad BlockingLimitedFull
Custom FiltersLimitedExtensive
Element Hiding / Cosmetic FiltersNoYes
Firewall-like controlNoYes (Dynamic Filtering)
Advanced User SupportBasicPower user friendly
Speed/EfficiencyLightweightEfficient but more complex
Open-sourceYesYes

5. Opera

 

En eski tarayıcılardan. İlk çıktığı dönemlerde ücretsiz olmayan bir iş modeli benimsemişlerdi. O zamanlar Avrupa'da (Norveç?) geliştiriliyordu ve gayet saygın bir tarayıcıydı. Diğer tarayıcılarda olmayan özellikleri (gestures gibi) vardı. 2010'lardan sonra bir ara ne olduysa o da Chrome tabanlı bir tarayıcı olmaya karar verdi. Şu anda Çin merkezli bir firma tarafından geliştiriliyor. Kendi içinde ücretsiz VPN hizmeti sunduğunu iddia ediyor ama onun da basit bir proxy hizmeti olduğu söyleniyor. Yine de işe yarayabilir. 2 sene kullanmazsanız yolda görseniz tanımazsınız; hızlı değişiyor. Güvenli olduğuna dair bir izlenimim yok.

6. Arc

 

Sekme listesini dikey yapmak ve havalı olmak isteyen yeni tarayıcı. Zen varken kullanılmaz derdim ama yine de kendine bir kullanıcı kitlesi oluşturmuş. Ayırntılı bilgim yok.

7. Edge

 


Uzun süre direnen Internet Explorer'ın sancılı ölümü sonrasında ruhu Edge'de tekrar hayat buldu. Bazı kaynaklarda gizlilik ayarları yapılması şartıyla "güvenli" bir tarayıcı olduğuna dair bazı bilgiler bulduğumu hatırlıyorum ama alışkanlıklar herşeydir. Microsoft'tan beklenecek şekilde sıra dışı hiçbir özelliği yok; düz tarayıcı. Ama Copilot'un gelişi ile bir istisnası oldu.

Nisan 2025 itibarı ile bu listedeki tarayıcıların user agent string'leri aşağıdaki gibi

FirefoxMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
LibreWof
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0
Waterfox
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0
Tor
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0
Floorp
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0
Zen
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0
Pale Moon
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:115.0) Gecko/20100101 Goanna/6.7 Firefox/115.0 PaleMoon/33.6.1
Sea Monkey
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0 SeaMonkey/2.53.20
Chromium
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
Google Chrome
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
Brave
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
Vivaldi
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Opera
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 OPR/117.0.0.0
Arc
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Edge
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0

Bunlar tam bir liste değil, sık kullanılan ya da daha çok benim gözüme çok takılan tarayıcılar.

Son söz, Firefox istemeyen için Zen, Floorp veya Waterfox. Öteki taraftan birşey isteyen için Brave, Chromium veya Edge. Ama küçük projelere dikkat etmek gerek. Bir süre projeyi başarıyla yürüten geliştirici, reddedemeyeceği bir teklif gelmesi durumunda projeyi hiç güven vermeyen bir ticari şirkete satabilir.

7.04.2025

Son 20 yılda Perşembe gününe denk gelen 19 Aralık'lar

Bir ara 19 Aralık Perşembe olduğunu bildiğim bir tarihin hangi yıl olabileceğini merak etmiştim. Bunu bulmak için de aşağıdaki tek satırlık Powershell'i kullanmıştım. Bir tarih nesnesinin içinden "haftanın günü" verisini çekmek için DayOfWeek'in nasıl kullanıldığına dair de bir örnek olabilir.

2000..2020 | ? { (Get-Date -Day 19 -Month 12 -Year $_).DayOfWeek -eq "Thursday"}

2002
2013
2019

olarak 3 sene döndü, güzel.