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
# 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
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
# 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
GROUP=netdev ile sudo gerektirmeden yönetim yapılabilir.ap_scan=0 kernel sürücüsüne bırakır.PSK hash üretimi
# 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
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
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
# 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
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.
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:
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
# 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)
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
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ı)
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!)
}
Ü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.
# 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ı
# 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
# 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
# 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
# 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
# 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
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)
# 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
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
# 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)
[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
# 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
}
#!/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
# 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"
Ö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.