Kablosuz Yığını
TEKNİK REHBER KABLOSUZ YIĞINI WiFi İSTEMCİ 2026

wpa_supplicant
wifi istemci yönetimi.

WPA2-PSK'dan WPA3-SAE'ye, 802.1X/EAP kurumsal ağlara kadar — Linux'ta WiFi bağlantısının tüm katmanları.

00 wpa_supplicant mimarisi

wpa_supplicant, Linux'ta WPA/WPA2/WPA3 kimlik doğrulamasını yürüten kullanıcı alanı daemonu'dur. Kernel'daki nl80211/cfg80211 alt sistemiyle konuşur.

WiFi bağlantı yığını şu katmanlardan oluşur:

  Uygulama / NetworkManager / wpa_cli
          ↓  (control socket: /var/run/wpa_supplicant/wlan0)
  wpa_supplicant  →  kimlik doğrulama (WPA, EAP, SAE…)
          ↓  (nl80211 netlink)
  cfg80211        →  kernel wireless config framework
          ↓
  mac80211        →  IEEE 802.11 protokol yığını (SoftMAC sürücüler)
          ↓
  WiFi sürücüsü   →  ath9k, brcmfmac, mt76, rtl8xxxu …
          ↓
  WiFi donanımı
    

wpa_supplicant iki yöntemle başlatılır: doğrudan komut satırından veya systemd üzerinden. Kontrol soketi aracılığıyla wpa_cli veya wpa_gui ile anlık yönetim yapılır. NetworkManager arka planda wpa_supplicant'ı otomatik başlatır; bu yüzden ikisi birlikte çalışırken çakışma yaşanabilir.

Kurulum

bash
# Debian / Ubuntu / Raspberry Pi OS
apt-get install wpasupplicant

# Alpine Linux (lightweight embedded)
apk add wpa_supplicant

# Buildroot: menuconfig → Networking → wpa_supplicant

# Versiyon kontrol
wpa_supplicant -v
# wpa_supplicant v2.10
EMBEDDED NOT

Buildroot ve Yocto, wpa_supplicant'ı varsayılan olarak içermez. Buildroot'ta BR2_PACKAGE_WPA_SUPPLICANT=y seçilmeli; Yocto'da IMAGE_INSTALL += "wpa-supplicant" eklenmeli.

01 wpa_supplicant.conf yapısı

wpa_supplicant.conf, tüm ağ profillerini ve global ayarları barındıran ana yapılandırma dosyasıdır.

Dosya hiyerarşisi

wpa_supplicant.conf — genel yapı
# Global parametreler
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=TR

# Ağ bloğu 1 — ev ağı
network={
    ssid="EvAgi_2.4G"
    psk="gizli-sifre"
    priority=2
}

# Ağ bloğu 2 — ofis ağı (daha yüksek öncelik)
network={
    ssid="Ofis_Kablosuz"
    psk="ofis-sifre123"
    priority=10
}

# Ağ bloğu 3 — açık ağ (şifresiz)
network={
    ssid="FreeWifi"
    key_mgmt=NONE
    priority=1
}

Global parametreler

ctrl_interface
Kontrol soketinin yolu. GROUP=netdev ile sudo gerektirmeden yönetim yapılabilir.
update_config=1
wpa_cli aracılığıyla yapılan değişikliklerin conf dosyasına geri yazılmasına izin ver.
country=TR
Regulatory domain. Türkiye için TR. Yanlış ülke kodu kanal kısıtlamalarına yol açar.
ap_scan=1
wpa_supplicant ağı tarasın (varsayılan). ap_scan=0 kernel sürücüsüne bırakır.
fast_reauth=1
EAP fast re-authentication aktif et. Roaming sırasında yeniden kimlik doğrulama süresini düşürür.

PSK hash üretimi

bash
# wpa_passphrase ile şifreyi hash'e çevir (conf'a düz metin yazmaktan iyidir)
wpa_passphrase "EvAgi_2.4G" "gizli-sifre"
# network={
#     ssid="EvAgi_2.4G"
#     #psk="gizli-sifre"
#     psk=8d3b4f2a1c9e7f0a5b6d2e3f1a4c8b9d0e7f2a3c5b1d4e6f9a0b2c3d5e7f8a9b
# }

# Doğrudan conf dosyasına ekle
wpa_passphrase "EvAgi_2.4G" "gizli-sifre" >> /etc/wpa_supplicant/wpa_supplicant.conf
GÜVENLİK

conf dosyasına düz metin PSK yazmak mümkündür ancak dosyayı okuyan herkese şifreyi verir. wpa_passphrase ile üretilen 256-bit hash kullanmayı tercih et. Dosya izinlerini chmod 600 ile kısıtla.

02 WPA2-PSK bağlantı

En yaygın ev/ofis WiFi güvenlik modu. CCMP (AES) şifrelemesi ile 4-yollu el sıkışma.

Minimal yapılandırma

/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=TR

network={
    ssid="EvAgi_2.4G"
    psk="gizli-sifre"
    key_mgmt=WPA-PSK
    proto=RSN
    pairwise=CCMP
    group=CCMP
}

Manuel başlatma

bash
# wlan0'ı yukarı al
ip link set wlan0 up

# wpa_supplicant'ı arka planda başlat
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -D nl80211

# Bağlantı durumunu kontrol et
wpa_cli -i wlan0 status
# wpa_state=COMPLETED
# ip_address=192.168.1.105
# ssid=EvAgi_2.4G
# bssid=aa:bb:cc:dd:ee:ff

# DHCP ile IP al
dhclient wlan0
# veya
udhcpc -i wlan0   # BusyBox/musl ortamlarında
-B
Daemon modda (background) çalıştır.
-i wlan0
Kullanılacak wireless interface.
-c /path/conf
Yapılandırma dosyasının yolu.
-D nl80211
Sürücü backend. Modern kerneller için nl80211; eski için wext.
-d
Debug modu — verbose çıktı (daemon olmadan kullan).
RASPBERRY PI

Raspberry Pi OS'ta /etc/wpa_supplicant/wpa_supplicant.conf doğrudan önyüklemede okunur. SD kart üzerindeki boot partition'a bu dosyayı koyarsan, ilk açılışta otomatik WiFi bağlantısı kurulur (headless setup).

03 WPA3-SAE yapılandırması

WPA3-Personal, PSK yerine SAE (Simultaneous Authentication of Equals / Dragonfly) protokolünü kullanır. Sözlük saldırılarına karşı çok daha dirençlidir.

/etc/wpa_supplicant/wpa_supplicant.conf — WPA3-SAE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=TR
pmf=2   # Protected Management Frames: zorunlu (WPA3 gerektirir)

network={
    ssid="EvAgi_WPA3"
    psk="gizli-sifre"
    key_mgmt=SAE
    ieee80211w=2       # PMF zorunlu (WPA3 için şart)
    sae_password="gizli-sifre"
    proto=RSN
    pairwise=CCMP
    group=CCMP
}

WPA3-SAE / WPA2-PSK geçiş modu

Hem WPA3 hem WPA2 destekleyen AP'lere bağlanmak için transition mode kullan:

wpa_supplicant.conf — geçiş modu
network={
    ssid="EvAgi_Karma"
    key_mgmt=SAE WPA-PSK
    psk="gizli-sifre"
    sae_password="gizli-sifre"
    ieee80211w=1       # PMF isteğe bağlı (transition mode)
    proto=RSN
    pairwise=CCMP
    group=CCMP
}

Kernel ve wpa_supplicant gereksinimleri

bash
# wpa_supplicant SAE desteğini kontrol et
wpa_supplicant -v | grep -i sae
# WPA3-SAE için wpa_supplicant v2.7+ gerekir

# Kernel nl80211 SAE desteği
iw phy phy0 info | grep -i sae
# SAE destekli sürücü: brcmfmac (RPi 3/4), mt7921, ath11k

# Buildroot için wpa_supplicant derleme seçeneği
# BR2_PACKAGE_WPA_SUPPLICANT_SAE=y

04 802.1X/EAP Kurumsal — PEAP ve TTLS

Üniversite, hastane veya kurumsal ağlarda kullanıcı adı/şifre ile kimlik doğrulama. RADIUS sunucusu üzerinden EAP protokolü çalışır.

  Supplicant (wpa_supplicant)  ←→  Authenticator (AP)  ←→  RADIUS Server
        EAP over LAN (EAPOL)              RADIUS/UDP
    

PEAP/MSCHAPv2 (en yaygın kurumsal mod)

wpa_supplicant.conf — PEAP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=TR

network={
    ssid="KurumAgi"
    key_mgmt=WPA-EAP
    eap=PEAP
    identity="kullanici@kurum.edu.tr"
    password="kullanici-sifre"
    ca_cert="/etc/ssl/certs/kurum-ca.pem"   # Opsiyonel ama önerilir
    phase1="peaplabel=0"
    phase2="auth=MSCHAPV2"
    priority=5
}

EAP-TTLS/PAP

wpa_supplicant.conf — TTLS
network={
    ssid="KurumAgi_TTLS"
    key_mgmt=WPA-EAP
    eap=TTLS
    identity="kullanici@kurum.edu.tr"
    anonymous_identity="anonymous@kurum.edu.tr"  # Dış kimlik (gizlilik)
    password="kullanici-sifre"
    ca_cert="/etc/ssl/certs/kurum-ca.pem"
    phase2="auth=PAP"
    priority=5
}

Sertifika doğrulamayı atlamak (test ortamı)

wpa_supplicant.conf — sertifika kontrolsüz
network={
    ssid="TestAgi"
    key_mgmt=WPA-EAP
    eap=PEAP
    identity="test"
    password="test123"
    phase2="auth=MSCHAPV2"
    # ca_cert satırı yok = sertifika doğrulanmaz (MITM riski!)
}
GÜVENLİK UYARISI

Üretim ortamında ca_cert mutlaka belirtilmeli. Sertifikasız bağlantı, sahte AP (evil-twin) saldırısına kapı açar. CA sertifikasını kurumun IT departmanından al ve /etc/ssl/certs/ altına koy.

05 wpa_cli interaktif kullanım

wpa_cli, çalışan wpa_supplicant daemon'ına kontrol soketi üzerinden bağlanan komut satırı arayüzüdür.

bash — wpa_cli başlatma
# wlan0 için interaktif mod
wpa_cli -i wlan0

# Birden fazla interface varsa
wpa_cli -p /var/run/wpa_supplicant -i wlan0

Temel wpa_cli komutları

wpa_cli prompt
# Durum göster
> status
wpa_state=COMPLETED
ssid=EvAgi_2.4G
bssid=aa:bb:cc:dd:ee:ff
freq=2412
ip_address=192.168.1.105
id=0

# Mevcut ağları listele
> list_networks
network id / ssid / bssid / flags
0       EvAgi_2.4G    any   [CURRENT]
1       Ofis_Kablosuz any

# Yeni ağ ekle
> add_network
3
> set_network 3 ssid "YeniAg"
OK
> set_network 3 psk "yeni-sifre"
OK
> enable_network 3
OK
> save_config
OK

# Bağlantıyı kes / yeniden bağlan
> disconnect
OK
> reconnect
OK

# Ağı devre dışı bırak
> disable_network 1
OK

# wpa_supplicant'ı yeniden başlat
> reconfigure
OK

Event dinleme

bash
# wpa_cli ile event stream izle (-a: action script)
wpa_cli -i wlan0 -a /etc/wpa_supplicant/action.sh

# Tek seferlik komut (script'ten kullanım için)
wpa_cli -i wlan0 status | grep wpa_state
# wpa_state=COMPLETED

06 wpa_cli: status, scan, connect

Tarama, bağlanma ve ağ yönetiminin tüm adımları tek satır komutlarla.

Çevredeki ağları tara

bash
# Tarama başlat
wpa_cli -i wlan0 scan
OK

# Tarama sonuçlarını göster
wpa_cli -i wlan0 scan_results
bssid / frequency / signal level / flags / ssid
aa:bb:cc:dd:ee:01  2412  -45  [WPA2-PSK-CCMP][ESS]  EvAgi_2.4G
aa:bb:cc:dd:ee:02  5180  -60  [WPA3-SAE][ESS]         EvAgi_5G
aa:bb:cc:dd:ee:03  2437  -75  [WPA2-EAP-CCMP][ESS]    KurumAgi
aa:bb:cc:dd:ee:04  2462  -80  [OPEN][ESS]              FreeWifi

Bilinen ağa bağlan

bash
# Mevcut ağ listesini gör
wpa_cli -i wlan0 list_networks

# Belirli ağa bağlan (id ile)
wpa_cli -i wlan0 select_network 0

# Durum kontrol
wpa_cli -i wlan0 status
# wpa_state=COMPLETED

# Sinyal gücü ve bağlantı bilgisi
wpa_cli -i wlan0 signal_poll
RSSI=-52
LINKSPEED=72
NOISE=9999
FREQUENCY=2412

Sıfırdan yeni ağ ekle ve bağlan

bash — script tarzı (non-interaktif)
# Yeni ağ bloğu oluştur
ID=$(wpa_cli -i wlan0 add_network | tail -1)

# SSID ve şifre ata
wpa_cli -i wlan0 set_network $ID ssid '"YeniAg"'
wpa_cli -i wlan0 set_network $ID psk '"yeni-sifre"'
wpa_cli -i wlan0 set_network $ID key_mgmt WPA-PSK

# Diğer ağları devre dışı bırak ve bu ağa bağlan
wpa_cli -i wlan0 select_network $ID

# Konfigürasyonu kaydet (update_config=1 gerekir)
wpa_cli -i wlan0 save_config

07 Roaming — bssid_blacklist ve BSS expiration

Aynı SSID'ye sahip birden fazla AP arasında otomatik geçiş — özellikle geniş alanlı IoT kurulumlarında kritik.

Roaming davranışını etkileyen parametreler

wpa_supplicant.conf — roaming ayarları
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=TR

# BSS önbellek süresi (saniye) — eski AP'leri ne zaman unut
bss_expiration_age=180
# BSS önbellek max giriş sayısı
bss_max_count=200

network={
    ssid="GenisBina_WiFi"
    psk="bina-sifresi"
    key_mgmt=WPA-PSK
    proto=RSN
    pairwise=CCMP

    # Bağlantı kopunca agresif roaming yap (dBm)
    bgscan="simple:30:-70:300"
    # bgscan = "simple:arka_plan_tarama_araligi:sinyal_esigi:uzun_aralik"

    # Minimum sinyal gücü eşiği — altına düşünce roam yap
    bssid_ignore=aa:bb:cc:dd:ee:ff    # Bu BSSID'ye bağlanma (sorunlu AP)
}

bssid_blacklist (dinamik engelleme)

bash — runtime BSSID engelleme
# Sorunlu AP'yi blacklist'e ekle
wpa_cli -i wlan0 bssid_ignore aa:bb:cc:dd:ee:ff

# Blacklist'i göster
wpa_cli -i wlan0 bssid_ignore

# Blacklist'i temizle
wpa_cli -i wlan0 bssid_ignore clear

# Manuel roam — belirli BSSID'ye geç
wpa_cli -i wlan0 roam aa:bb:cc:dd:ee:02

802.11r Fast BSS Transition

wpa_supplicant.conf — 802.11r
network={
    ssid="EnterpriseWiFi"
    key_mgmt=WPA-EAP FT-EAP
    eap=PEAP
    identity="kullanici@kurum.com"
    password="sifre"
    phase2="auth=MSCHAPV2"
    # FT: Fast Transition — AP geçişini hızlandırır (VoIP için önemli)
}

08 systemd servisi ve embedded minimal kurulum

Üretim sistemlerinde wpa_supplicant systemd ile yönetilir. Embedded cihazlarda minimal konfigürasyon yeterlidir.

systemd wpa_supplicant@wlan0 servisi

bash
# Servis durumu
systemctl status wpa_supplicant@wlan0

# Servisi başlat ve önyüklemede otomatik başlasın
systemctl enable --now wpa_supplicant@wlan0

# Log izle
journalctl -u wpa_supplicant@wlan0 -f

# Conf dosyası konumu (template servis için)
# /etc/wpa_supplicant/wpa_supplicant-wlan0.conf

systemd servis dosyası (özel)

/etc/systemd/system/wpa_supplicant@.service
[Unit]
Description=WPA supplicant daemon (interface: %i)
Before=network.target
Wants=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=forking
PIDFile=/run/wpa_supplicant/%i.pid
ExecStart=/sbin/wpa_supplicant \
    -B -P /run/wpa_supplicant/%i.pid \
    -i %i \
    -c /etc/wpa_supplicant/wpa_supplicant-%i.conf \
    -D nl80211
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Embedded minimal konfigürasyon + udhcpc

/etc/wpa_supplicant.conf — embedded minimal
# Raspberry Pi Zero W / custom board için minimal conf
ctrl_interface=/var/run/wpa_supplicant
country=TR

network={
    ssid="IoT_Hub"
    psk="iot-hub-sifre"
    key_mgmt=WPA-PSK
}
/etc/init.d/S50wifi — BusyBox init scripti
#!/bin/sh
# BusyBox SysV init scripti — wpa_supplicant + udhcpc

case "$1" in
  start)
    echo "WiFi başlatılıyor..."
    ip link set wlan0 up
    wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf -D nl80211
    sleep 3
    udhcpc -i wlan0 -b -q
    ;;
  stop)
    echo "WiFi durduruluyor..."
    killall udhcpc 2>/dev/null
    killall wpa_supplicant 2>/dev/null
    ip link set wlan0 down
    ;;
  restart)
    $0 stop
    sleep 1
    $0 start
    ;;
  *)
    echo "Kullanım: $0 {start|stop|restart}"
    exit 1
esac

NetworkManager ile çakışma

bash — NetworkManager çakışma çözümü
# NetworkManager, wpa_supplicant'ı kendi yönetir — ikisi birden çalışırsa çakışır

# Yöntem 1: NetworkManager'ı durdur
systemctl stop NetworkManager
systemctl disable NetworkManager

# Yöntem 2: NM'den wlan0'ı hariç tut
# /etc/NetworkManager/conf.d/unmanaged.conf dosyası oluştur:
# [keyfile]
# unmanaged-devices=interface-name:wlan0

# Yöntem 3: wpa_supplicant plugin olarak NM altında çalıştır (önerilen)
# NM, backend olarak wpa_supplicant kullanır — /etc/wpa_supplicant.conf yazmaya gerek yok
nmcli dev wifi connect "EvAgi_2.4G" password "gizli-sifre"
EMBEDDED TAVSİYE

Özel gömülü sistemlerde NetworkManager yerine wpa_supplicant'ı doğrudan kullan. NetworkManager gereksiz bağımlılıklar ve RAM tüketimi ekler. BusyBox ortamlarında udhcpc ile birleşik çözüm yeterlidir.