Tuesday, May 27, 2025

Statik IP ve DHCP IP Çakışmaları: Neden Olur, Nasıl Önlenir?

Ağ yöneticileri ve teknik kullanıcılar için "IP çakışması" sinir bozucu bir sorundur. Özellikle aynı yerel ağda hem statik IP atanmış cihazlar hem de DHCP sunucusu tarafından IP dağıtılan cihazlar varsa bu risk daha da büyür. Bu yazıda şu sorunun cevabını detaylıca ele alacağız:

"Statik IP verdim ama modem başka bir cihaza da aynı IP'yi verdi, nasıl olur?"


DHCP Sunucusu Statik IP'yi Nasıl Görür?

❗ Görmez.

Evet, DHCP sunucusu yalnızca kendi üzerinden IP talep eden cihazları tanır. Bir cihaza manuel olarak (statik) 192.168.1.102 verildiğinde bu cihaz DHCP'den IP istemediyse, DHCP sunucusunun ondan haberi yoktur.

Bu durumda DHCP sunucusu 192.168.1.102 adresini "boşta" sanabilir ve başka bir cihaza da aynı IP'yi kiralayabilir.


IP Çakışması Nasıl Oluşur?

Senaryo:

  • PC'ye manuel olarak 192.168.1.102 atanır

  • PC kapanır veya ağdan çıkar

  • DHCP havuzunda 192.168.1.100–192.168.1.150 arası aktif

  • DHCP, boşta zannettiği 192.168.1.102'yi başka bir cihaza verir

  • PC yeniden açılır → IP çakışması oluşur

DHCP sunucusu bu IP'nin zaten başka bir cihaza verildiğini bilemez çünkü ona hiç sorulmadı.


DHCP Lease Süresi de Etkili midir?

Evet. IP adresleri belirli bir "kiralama süresi (lease time)" ile dağıtılır.

  • Eğer cihaz bu süre boyunca yeniden bağlanmazsa,

  • DHCP sunucusu bu IP'yi tekrar kullanılabilir sayar.

Ancak bu yalnızca DHCP üzerinden IP almış cihazlar için geçerlidir. Statik IP alanlar lease tablosuna hiç girmez.


Statik IP Kullanırken Yapılmaması Gerekenler

  • DHCP havuzu içinden rastgele bir IP seçip statik vermek ❌

  • Statik IP verdikten sonra modem DHCP'sine haber vermemek ❌

  • Aynı IP'yi birden fazla cihazda statik olarak kullanmak ❌


Doğru Yaklaşım Nedir?

✅ Yöntem 1: DHCP Rezervasyonu (Önerilen)

  • Modem arayüzüne girilir

  • Cihaza ait MAC adresini seçilir

  • "IP Rezervasyonu" tanımlanır (örneğin: 192.168.1.113)

  • Artık cihaz her bağlandığında otomatik olarak bu IP’yi alır

  • Ağ içinde çakışma riski sıfırlanır

✅ Yöntem 2: DHCP aralığı dışından Statik IP vermek

  • Örneğin DHCP aralığı 192.168.1.100–192.168.1.150 olsun

  • 192.168.1.200 gibi bir IP'yi elle verince DHCP o IP'ye karışmaz.


DHCP Sunucusu IP Pingleyerek Tespit Eder mi?

Bazı gelişmiş DHCP sunucuları IP’yi atamadan önce "bu IP kullanılıyor mu?" diye ping atabilir:

arping 192.168.1.102

Ancak:

  • Bu çoğu modem/router’da yoktur

  • Cihaz kapalıysa veya ICMP yanıtı vermiyorsa yine işe yaramaz


Sonuç

DurumSonuç
Statik IP verildi,                             DHCP bilmezÇakışma olabilir
Lease süresi dolduIP tekrar kullanılabilir
DHCP rezervasyonu yapıldıGüvenli, çakışma yaşanmaz

DHCP'nin doğası gereği sadece istekte bulunan cihazları takip etmesi, ağda statik IP kullanımında dikkatli olunmasını zorunlu kılar.

En güvenli yol: IP'yi elle değil, DHCP rezervasyonu ile sabitlemek.


Ekstra Not: Windows Ağ Ayarında

Statik IP yerine DHCP seçip modemde rezervasyon yapılırsa:

  • IP otomatik gelir

  • DNS ve gateway otomatik doğru olur

  • Manüel girişe gerek kalmaz

Modern ağlarda bu yöntem en sağlam ve sürdürülebilir çözümdür. 🧠🔐

Monday, May 26, 2025

Windows + Nginx: Sade ve Guvenli Firewall Yapilandirmasi

1. Başlangıç Durumu

Windows'un varsayılan güvenlik duvarı:

  • Profil tabanlı (Private/Public/Domain) çalışır.
  • Gelen bağlantılar Block, giden bağlantılar Allow şeklindedir.
  • Yüzlerce "Network Discovery", "Remote Assistance" vb. kural aktif olabilir.

Bu karmaşa dış dünyaya açık kalan portların gözden kaçmasına neden olabilir.

2. Amacımız Nedir?

Servis Durum Açıklama
HTTP (port 80) ✅ Açık Her IP'den erişilsin
SMB (445/139) ✅ Sadece LAN 192.168.1.0/24 ağından erişilsin
UPnP, SSDP, mDNS ❌ Kapalı Güvenlik zaafiyetleri nedeniyle
Diğer tüm servisler ❌ Kapalı Tanımlanmadıkça bloklanacak

3. Kuralları Script ile Tanımlama

firewall_rule_set.ps1 Scripti

# 1. HTTP (80) tüm profillerde açık
New-NetFirewallRule -DisplayName "Allow HTTP on All" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 80 `
    -Profile Any `
    -Action Allow

# 2. SMB sadece LAN'dan
New-NetFirewallRule -DisplayName "Allow SMB from LAN only" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 445,139 `
    -RemoteAddress 192.168.1.0/24 `
    -Action Allow

# 3. SMB dış IP'lere kapalı
New-NetFirewallRule -DisplayName "Block SMB from Others" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 445,139 `
    -RemoteAddress Any `
    -Action Block

# 4. UPnP ve SSDP kapalı
New-NetFirewallRule -DisplayName "Block UPnP" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 2869 `
    -Action Block

New-NetFirewallRule -DisplayName "Block SSDP" `
    -Direction Inbound `
    -Protocol UDP `
    -LocalPort 1900 `
    -Action Block

Scripti Çalıştırma

  1. PowerShell'i Yönetici olarak açın.
  2. Güvenlik politikasını geçerli kılmak için:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
  1. Scripti çalıştırın:
powershell -ExecutionPolicy Bypass -File "firewall_rule_set.ps1"

4. Nginx Loglarını Temizleme ve Takip Etme

Logları sıfırla:

Clear-Content "C:\nginx\logs\access.log"
Clear-Content "C:\nginx\logs\error.log"

Anlık log takibi:

Get-Content "C:\nginx\logs\access.log" -Wait

Gelen istekleri, IP adreslerini ve durum kodlarını gerçek zamanlı izleyebilirsiniz.

5. Kötü Niyetli IP'leri Engelleme

Loglarda aşağıdakiler görülürse:

  • GET /login.rsp gibi zaafiyet denemeleri
  • User-Agent: sqlmap, Hello World, curl vb. bot imzaları
  • Kara liste IP'lerden gelen bağlantılar

Engellemek için:

New-NetFirewallRule -DisplayName "Block malicious IP 196.251.81.93" `
  -Direction Inbound `
  -RemoteAddress 196.251.81.93 `
  -Action Block

(Opsiyonel) Nginx'te engelleme:

server {
    deny 196.251.81.93;
}

6. Otomatik IP Analizi (PowerShell)

$log = "C:\nginx\logs\access.log"
$loglines = Get-Content $log -Tail 100

$blocklist = @()
foreach ($line in $loglines) {
    if ($line -match "login\.rsp" -or $line -match "Hello World" -or $line -match "sqlmap" -or $line -match "curl") {
        if ($line -match "^(\d+\.\d+\.\d+\.\d+)") {
            $ip = $matches[1]
            if (-not ($blocklist -contains $ip)) {
                $blocklist += $ip
                Write-Host "Engelleniyor: $ip"
                New-NetFirewallRule -DisplayName "AutoBlock $ip" -Direction Inbound -RemoteAddress $ip -Action Block
            }
        }
    }
}
Bu script tekrar çalıştırıldığında sadece yeni IP’leri ekler. Görev Zamanlayıcı ile otomatikleştirilebilir.

7. Durum Kontrolleri

Aktif ağ profili:

Get-NetConnectionProfile | Format-Table Name, InterfaceAlias, NetworkCategory

Aktif kurallar özeti:

Get-NetFirewallRule -Enabled True | Format-Table DisplayName, Direction, Action, Profile, LocalPort, Protocol -AutoSize

Dinlenen portlar:

Get-NetTCPConnection -State Listen | Sort-Object LocalPort | Format-Table LocalAddress, LocalPort, OwningProcess

8. Sonuç

  • Sadece tanımlı servisler aktif olur
  • Minimum port dışa açıktır
  • Loglar temiz ve okunabilirdir
  • Profil bazlı karmaşa ortadan kalkar
  • Saldırgan IP'ler anında engellenebilir
  • Otomatik analiz ile sürekli güvenlik sağlanır

Güvenli, sade ve kontrollü bir Windows + nginx ortamı! 🛡️

Monday, May 19, 2025

Windows'ta Kayıp "New → Text Document" Sorunu ve Çözümü

Bazı Windows sistemlerinde sağ tık → New (Yeni) menüsünde "Text Document" (Metin Belgesi) seçeneği kaybolabiliyor. Bu sorun, özellikle Notepad++ gibi üçüncü parti yazılımlar yüklendikten sonra veya yanlış registry düzenlemeleri sonrasında ortaya çıkabiliyor. Bu yazıda bu problemi nasıl teşhis edip, sistemsel olarak kalıcı bir şekilde çözebileceğinizi anlatıyorum.

Sorunun Belirtileri

  • Sağ tık menüsünde "New → Text Document" seçeneği görünmüyor.

  • .txt dosyasına çift tıklayınca "yetki hatası" veya "uygulama ilişkilendirme" hatası geliyor.

  • assoc ve ftype komutları boş veya bozulmuş çıkıyor.

Adım Adım Çözüm

1. Komut Satırıyla File Association'ı Düzeltme

Admin haklarıyla CMD açıp aşağıdaki komutları girin:

assoc .txt=txtfile
ftype txtfile="%SystemRoot%\system32\NOTEPAD.EXE" "%1"

Bu komutlar .txt uzantısını "txtfile" sınıfına bağlar ve bu sınıfın Notepad ile açılmasını sağlar.

2. Registry Anahtarını Temizle ve Düzelt

regedit ile şu konuma gidin:

HKEY_CLASSES_ROOT\.txt

Bu anahtarın içinde şu şekilde görünmelidir:

  • (Default) değeri: txtfile

Eğer alt klasörler varsa (ShellNew, OpenWithProgids, vs) ve bozuklarsa, tamamını silin. Sadece yukarıdaki (Default) anahtarı kalmalı.

Not: Bozulmuş ShellNew anahtarı, "New → Text Document" menüsünün görünmemesine neden olur.

3. Yeniden Başlat

Registry düzenlemelerinin ardından sisteminizi yeniden başlatın. Artık:

  • .txt dosyaları Notepad ile açılır.

  • Sağ tık → New menüsünde "Text Document" seçeneği geri gelir.

Sonuç

Bu işlem, bozuk file association durumlarında %100 çalışan bir çözümdür. assoc, ftype ve registry düzeltmeleri birlikte ele alındığında, Windows'taki tüm metin dosyası işleyişi normale döner.

İlgili .reg Yedeği (Opsiyonel)

Aşağıdaki gibi bir .reg dosyası oluşturup saklayabilirsiniz:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.txt]
@="txtfile"

Friday, February 28, 2025

DungeonCrawlers.

DungeonCrawlers.org, birinci şahıs, ızgara tabanlı dungeon crawler oyunlarına adanmış kapsamlı bir çevrimiçi veritabanıdır. Sitede hem klasik hem de modern yapımların detaylı listeleri, geliştirici ve yayıncı bilgileri, platformlara göre filtreleme seçenekleri ve çeşitli oyun serileri hakkında bilgiler bulunmaktadır.

Site, her yıl düzenlediği "Dungeon Crawler Jam" etkinlikleriyle de tanınmaktadır. Bu etkinliklerde, katılımcılar belirli bir süre içinde kendi dungeon crawler oyunlarını geliştirerek sunarlar. Örneğin, 2023 yılında düzenlenen etkinlikte 1800'den fazla katılımcı ve yaklaşık 200 oyun başvurusu alınmıştır. Bu etkinlikler, türün gelişimine katkıda bulunmakta ve yeni yeteneklerin ortaya çıkmasına olanak tanımaktadır.

DungeonCrawlers.org, ayrıca Discord sunucusu üzerinden topluluk üyelerinin bir araya gelerek deneyimlerini paylaştığı, önerilerde bulunduğu ve oyun geliştirme süreçleri hakkında tartışmalar yürüttüğü aktif bir platform sunmaktadır. Site, kullanıcı geri bildirimlerine önem vererek sürekli güncellenmekte ve genişlemektedir.

Eğer dungeon crawler türüne ilgi duyuyorsanız, DungeonCrawlers.org sizin için vazgeçilmez bir kaynak olacaktır.

https://www.dungeoncrawlers.org/


Thursday, November 14, 2024

Ayaktakımı.

Ayaktakımının hepsi sosyal insanlardır. Çünkü, sosyallik insan sevgisine değil yalnızlık korkusuna dayanır. - Arthur Schopenhauer.

Monday, November 11, 2024

Powerful, free open source software to do the thing you want to do.

3D Modeling/Animation (Complex) - Blender.org
3D Modeling (Simple) - SketchUp
3D Modeling (Voxel/Brix) - MagicaVoxel
3D Modeling (Digital Clay Sculpting) - Sculptris
3D Modeling (In VR) - Google Blocks
Human 3D Model/Armature Generator - MakeHuman
Photo Editing/Manipulation - GIMP
Digital Painting/Comics - Krita
Vector Art (Like Illustrator) - Inkscape
Storyboarding - Storyboarder
Video Game Engine - Unity
Visual Novel Maker (No Code) - Fungus + Unity
Text-Based Game - Twine (Twineery.org)
Audio/Sound Recording/Editing - Audacity
Sheet Music Notation - MuseScore
Retro Game Music Maker - Bosca Ceoil
Retro Video Game Effects Generator - Bfxr
Screen & Webcam Recording - OBS Studio
Live Streaming (with Chat Overlays) - Streamlabs OBS
Video and Audio Converter - HandBrake
2D Animation (Cutout) - DragonBones Pro, Synfig
2D Animation (Drawn) - Blender 2.8, OpenToonz
Stick Figure Animation - Pivot Animator
Stop Motion/Claymation - Stop Motion Studio (Mobile Only)
Video Editing - Blender (Only if you're desperate)
Flashcards/Spaced Repetition Learning - Anki


Awesome Websites:

Distraction-Free Writing - Writer (Bighugelabs)
Script/Playwriting - Amazon Storywriter
Sound Effects Database - Freesound.org
Music for Film/Games - Incompetech.com/music
Pixel Art & Animation - Piskel
Textures and HDRIs for 3D - HDRI Haven
Fonts - Google Fonts, 1001FreeFonts.com
Learn Coding - Codecademy
Simple Android App Maker - App Inventor (MIT)
Color Palette Generator - Coolors.co
Rhyme Dictionary - RhymeZone.com


Compiled with love, for you, by Cullen. Now go make some art! <3

Mutlu olabilmek için...

"Mutlu olabilmek için iki şeyi ortadan kaldırmak gerekir; kötü bir gelecek korkusunu, ve kötü geçmişin anılarını." Sigmund Freud.

Monday, November 4, 2024

Top 10 Hacking Books

1. Web Application Hacker's Handbook
2. The Hackers Playbook 2
3. Hacking: The Art of Exploitation
4. Ghost in the Wires
5. Social Engineering: The Art of Human Hacking
6. Computer Hacking Beginners Guide
7. Kali Linux Revealed : Mastering Pen Testing Distribution
8. The Basics of Hacking and Penetration Testing
9. Nmap Network Scanning
10. Practical Malware Analysis: The Hands-on

Friday, October 25, 2024

Oled takvim projesi.

Esin kaynağım Pinterest'te rastlayıp aratınca en fazla şu kadarını bulabildiğim proje. Kod paylaşılmamış, ben de kendim yazdım.

Takvim şimdilik statik ve GUI tasarımından ibaret, yani aslında güncel tarihe göre çalışmıyor, sadece görsel kısmı kodladım ve bariz cool göründüğünü düşündüğüm için şimdiden buraya taşımak istedim. Yani her gün aynı güne uyanacağınız bir takvim bu😎 Tarihi RTC modülünden alıp gerçek zamanlı çalışan dinamik kısmı yakında geliştirip bu posta ekleyeceğim... 


Bağlantı şeması:
Arduino kodu:

/*
MIT License

You are free to use, copy, modify, and distribute this software.
The software is provided "as is," without any warranties.
No liability for any claims.

(c) 2024 Kadir Doğan
*/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels

// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI   9
#define OLED_CLK    10
#define OLED_DC     11
#define OLED_CS     12
#define OLED_RESET  13

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// Haftanın günleri
const char *daysOfWeek[] = {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"};

void setup() {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC);
  display.display();
  delay(1000);
}

void loop() {
  int year = 2024;   // Sabit yıl
  int month = 10;    // Sabit ay (Ekim)
  int today = 15;    // Sabit gün (15 Ekim 2024)
  
  drawCalendar(year, month, today);  // Sabit tarih ile takvim çiziliyor
  delay(10000);      // 10 saniyede bir takvimi güncelle
}

// Takvim çizme fonksiyonu
void drawCalendar(int year, int month, int today) {
  display.clearDisplay();
  
  // Takvim başlığı (günler)
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  
  for (int i = 0; i < 7; i++) {
    display.setCursor(5 + i * 18, 0);  // Günlerin başlangıç koordinatları
    display.print(daysOfWeek[i]);
  }

  // Takvim günlerini çizme
  int dayOffset = dayOfWeekOffset(year, month);  // Ayın ilk günü hangi günden başlıyor?
  int dayCounter = 1;
  
  for (int row = 0; row < 6; row++) {  // 6 satır, bazı aylar için gerekebilir
    for (int col = 0; col < 7; col++) {
      int x = 5 + col * 18;  // Sütunlar arası boşluk
      int y = 16 + row * 10;  // Satırlar arası boşluk
      
      if (row == 0 && col < dayOffset) {
        continue;  // İlk haftanın boş günleri
      }
      
      if (dayCounter <= daysInMonth(month, year)) {
        // Bugünü sabit olarak vurgulama
        if (dayCounter == today) {
          display.fillRect(x + 1, y - 2, 13, 11, SSD1306_WHITE);  // Bugünü vurgulamak için geniş kutu
          display.setTextColor(SSD1306_BLACK);  // Ters renk
        } else {
          display.setTextColor(SSD1306_WHITE);
        }
        
        display.setCursor(x + 2, y);  // Metni ortalamak için sağa kaydırma
        display.print(dayCounter);
        dayCounter++;
      }
    }
  }
  display.display();
}

// Ayın kaç gün olduğunu belirlemek için bir fonksiyon
int daysInMonth(int month, int year) {
  if (month == 2) {
    // Artık yıl kontrolü
    if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
      return 29;
    } else {
      return 28;
    }
  }
  if (month == 4 || month == 6 || month == 9 || month == 11) {
    return 30;
  }
  return 31;
}

// Haftanın ilk gününün yerini belirleyen fonksiyon (Zeller's Congruence)
int dayOfWeekOffset(int year, int month) {
  if (month < 3) {
    year--;
    month += 12;
  }
  int K = year % 100;
  int J = year / 100;
  int f = 1 + ((13 * (month + 1)) / 5) + K + (K / 4) + (J / 4) - 2 * J;
  return (f % 7 + 7) % 7;  // Haftanın günlerini sıfırdan başlatıyoruz
}