DOKÜMANTASYON

pfSense Entegrasyonu

pfSense Captive Portal ile Captivo entegrasyonu

Gereksinimler: pfSense CE 2.7 veya üzeri ve misafirlerin bağlandığı bir arayüz. Aşağıdaki ekran görüntüleri çalışan bir kurulumdan alınmıştır. pfSense 2.4/2.5'te Authentication sekmesi farklıydı — RADIUS sunucusu doğrudan captive portal sayfasına giriliyordu; 2.6'dan itibaren User Manager altında bir kez tanımlanıp burada seçiliyor.
Captivo'nun doğru veri gösterip göstermeyeceğini iki ayar belirliyor ve ikisi de gözden kaçmaya müsait: Send accounting updates = Interim ve Accounting style = Invert Acct-Input-Octets and Acct-Output-Octets. İkisi de 6. adımda.

1Captivo tarafında hazırlık

Captivo yalnızca tanıdığı cihazlardan gelen RADIUS isteklerine cevap verir. Captivo panelinde Ayarlar → RADIUS sayfasını açın ve pfSense'inizi ekleyin:

  • NAS IP Adresi: pfSense'in bize ulaşırken kullandığı adres — WAN / genel IP'si, LAN adresi değil.
  • Paylaşılan Şifre: aynı değeri 2. adımda pfSense tarafına da gireceksiniz.
  • Auth Portu: 1812  ·  Accounting Portu: 1813

Buradayken portal sayfasını da indirin: Ayarlar → Portal, platform olarak pfSense seçip şablonu indirin. 4. adımda yükleyeceksiniz; hazır olması zone sayfasını tek geçişte doldurmanızı sağlar.

Uyuşmayan paylaşılan şifre en sık karşılaşılan arıza sebebidir ve işe yarar bir hata vermez: pfSense yalnızca girişin başarısız olduğunu söyler. Sonunda hiçbir şey çalışmıyorsa buraya dönüp şifreyi iki tarafa da yeniden girin.

2Captivo RADIUS sunucusunu tanımla

System → User Manager → Authentication Servers → Add. Burada bir kez tanımlanır, captive portal zone'u sonra bunu seçer.

AlanDeğer
Descriptive nameCaptivo
TypeRADIUS
ProtocolMS-CHAPv2 (önerilen). PAP da çalışır, ama MS-CHAPv2 şifreyi hat üzerine koymaz.
Hostname or IP addressradius.captivo.io
Shared Secret1. adımdaki değer
Services offeredAuthentication and Accounting
Authentication / Accounting port1812 / 1813
RADIUS NAS IP Attributemisafir tarafındaki arayüzünüz (ör. LAN)
User Manager → Authentication Servers: Captivo RADIUS sunucusu. Services offered mutlaka "Authentication and Accounting" olmalı — yalnız authentication seçilirse hiçbir oturum ve kullanım verisi üretilmez.
On-premise: radius.captivo.io yerine kendi sunucunuzun adresini veya IP'sini girin — Captivo RADIUS container'ının çalıştığı makine. 1812/1813 UDP portları pfSense'ten erişilebilir olmalı.

3Captive Portal zone'unu oluştur

Services → Captive Portal → Add. Zone'a bir ad verin (ekran görüntülerinde captivo), sonra Configuration sekmesinde:

  • Enable Captive Portal — işaretli
  • Interfaces — misafirlerin bağlandığı arayüz (ekranda LAN). Asla WAN değil: portalı WAN'da açmak kendi internet bağlantınızın önüne giriş sayfası koyar.
  • Idle timeout / Hard timeout — isteğe bağlı. Captivo profilleri zaten oturum süresi veriyorsa boş bırakın; yoksa pfSense hangi limit önce dolarsa oturumu orada keser.
Services → Captive Portal → Configuration: portal açık ve misafir arayüzüne bağlı. Üstteki MACs sekmesi pfSense'in kendi bypass listesidir — bkz. 8. adım.

Aynı sekmede aşağıda önemli bir ayar daha var: Per-user bandwidth restriction. Enable per-user bandwidth restriction kutusunu işaretleyin, Default download ve Default upload alanlarını BOŞ bırakın.

Per-user bandwidth restriction: hız limitlerinin ana şalteri. pfSense'in kendi notu "RADIUS servers can override the default settings" diyor — yani bu kapalıyken Captivo profilindeki hızın uygulanacağı bir yer yok.
İki varsayılan kutuyu boş bırakmak bilinçli: Captivo profilinde hız limiti olmayan bir misafir, buraya yazılmış bir değere takılmak yerine limitsiz kalır. Captivo'dan gelen kullanıcı başına değerler yine geçerlidir. Bu işin ikinci yarısı 5. adımda — oradaki RADIUS attribute seçeneği de işaretli olmalı.

4Portal sayfasını yükle

  1. 1. Aynı zone sayfasında HTML Page Contents → Portal page contents alanına inin ve 1. adımda indirdiğiniz şablonu yükleyin.
  2. 2. Hata sayfasını da Auth error page contents alanına yükleyin. İsteğe bağlı değildir: RADIUS MAC doğrulaması açıkken, cihazı beyaz listede olmayan bir misafirin gördüğü İLK sayfa burasıdır — orada kayıt olamayan misafir hiçbir yere gidemez. İndirilen hata sayfası, portal sayfasındaki bütün giriş yöntemlerini taşır.
  3. 3. Henüz kaydetmeyin — sayfada aşağı, Authentication ve Accounting'e devam edin; en altta bir kez kaydedeceksiniz.
HTML Page Contents: Captivo'dan indirdiğiniz şablonu portal sayfası olarak yükleyin. "Live View" ile sonucu misafir cihazı bağlamadan kontrol edebilirsiniz.
Captivo'da portal ayarlarını değiştirdikten sonra (giriş yöntemleri, metinler, renkler, başlık biçimi) şablonu yeniden indirin. pfSense'teki dosya bir anlık görüntüdür; kendiliğinden güncellenmez. Panel, gerektiren bir değişiklik yaptığınızda sizi uyarır.

5Authentication

Aynı sayfada aşağı inip Authentication bloğuna gelin.

  • Authentication Method: Use an Authentication backend — giriş sayfasını gösteren ve RADIUS'a doğrulatan seçenek budur. ("None" tek tıkla herkesi geçirir; "RADIUS MAC Authentication" cihazları MAC ile doğrular ve giriş sayfasını yalnızca Login page Fallback işaretliyse gösterir — bkz. 8. adım.)
  • Authentication Server: Captivo
  • Secondary authentication Server: pfSense'in kendi yerel hesaplarının da çalışmasını istemiyorsanız boş bırakın; ikinci sunucu giriş sayfasına ikinci bir alan takımı ekler.
  • Session timeout: Use RADIUS Session-Timeout attributes — Captivo oturum sürelerinin geçerli olması için gerekli.
  • Traffic quota: Use RADIUS pfSense-Max-Total-Octets attribute — veri kotaları için gerekli.
  • Per-user bandwidth restrictions: Use RADIUS pfSense-Bandwidth-Max-Up / -Down attributes — hız limitleri için gerekli, 3. adımdaki ana şalterle birlikte. Captivo WISPr attribute'larını gönderir, bu seçenek onları da kabul eder. "Enable per-user bandwidth restriction" kapalıysa yalnız bunu işaretlemek hiçbir şey değiştirmez.
Authentication: backend = Captivo ve üç RADIUS attribute seçeneği işaretli. Bunlar olmadan Captivo'da atadığınız profil (hız, süre, kota) gönderilir ama sessizce yok sayılır.

NAS Identifier (opsiyonel, ek izolasyon)

Captivo, isteğin gerçekten sizin güvenlik duvarınızdan geldiğini ayrıca doğrulayabilir. Captivo panelinde Ayarlar → RADIUS → NAS-Identifier Doğrulaması kartından "Aktif et"e basın ve üretilen değeri (ör. captivo-otelinizadi-a8f9c2d1) buradaki NAS Identifier alanına yapıştırın.

Sıra önemli: önce pfSense'e yapıştırın, sonra Captivo'da doğrulamayı açın. Alan boşken doğrulama açıksa pfSense kendi varsayılanını (CaptivePortal-<zone>) gönderir, Captivo reddeder ve tüm girişler başarısız olur.

6Accounting — asıl önemli iki ayar

Authentication yalnızca kimin giriş yaptığını söyler. Diğer her şey — canlı oturumlar, süre, veri kullanımı, raporlar — accounting'den gelir.

  • Send RADIUS accounting packets: işaretli.
  • Accounting Server: Captivo
  • Send accounting updates: Interim
    Captivo bir oturumu, güvenlik duvarı sinyal göndermeye devam ettiği sürece canlı sayar. "Interim" her dakika bir güncelleme gönderir. "No updates" veya "Stop/Start" seçiliyse pfSense yalnızca başlangıcı ve bitişi bildirir — hâlâ bağlı olan misafir 10 dakika sonra Aktif Oturumlar'dan düşer, pfSense kendi ekranında göstermeye devam eder. Aktif Oturumlar listeniz neredeyse hep boşsa sebebi budur.
  • Accounting style: Invert Acct-Input-Octets and Acct-Output-Octets — işaretli.
    Bu işaretli değilken indirme ve yükleme ters geliyor ve misafir, indirdiğinden çok daha fazla yüklemiş gibi görünüyor. pfSense'in bu seçenek için yazdığı açıklama, sanki düzeltmek yerine tersine çevirecekmiş gibi okunuyor; burada gösterilen ayar, Captivo'da doğru değerleri ürettiği sahada doğrulanmış olandır.
  • MAC address format: Default — herhangi bir biçim çalışır; Captivo normalleştirir.
Accounting: "Interim" ve "Invert Acct-Input-Octets and Acct-Output-Octets". Bu ikisi, çalışan bir panelle boş bir panel arasındaki farktır. Sayfanın altındaki Save ile kaydedin.
Bu değişiklik yalnızca yeni oturumları etkiler. Kapanmış oturumlar o anki değerleriyle kalır.

7Walled garden (Allowed Hostnames)

Portal sayfası açıldığında misafir henüz internete çıkmış değildir; bu yüzden sayfanın ihtiyaç duyduğu birkaç adres giriş öncesinde erişilebilir olmalıdır. Bu yapılmazsa portal bozuk görünür: sayfa açılır ama SMS kodu göndermek veya formu göndermek hiçbir şey yapmaz.

Services → Captive Portal → zone'unuz → Allowed Hostnames → Add, her biri için Direction = Both:

  • app.captivo.io — sayfanın konuştuğu portal API'si
  • captivo.io
  • radius.captivo.io
Allowed Hostnames: portal sayfasının, misafir doğrulanmadan önce ihtiyaç duyduğu adresler.
Her kayıt Direction = Both ile eklenir. Bant genişliği kutularını boş bırakın.
On-premise: captivo.io adreslerini eklemeyin — kurulumunuz onları kullanmaz. Yerine kendi sunucunuzun adresini (panelin servis edildiği alan adı veya IP) ekleyin. Panele düz IP ile ulaşıyorsanız Allowed Hostnames yerine Allowed IP Addresses sekmesini kullanın.

Walled garden tek başına yetmez

Misafir ile Captivo sunucusu arasında birbirinden bağımsız iki katman vardır ve trafik ancak ikisi de izin verirse geçer. Walled garden, doğrulanmamış bir istemcinin o adrese giderken portal yönlendirmesine takılmamasını sağlar. Paketin o adrese ulaşıp ulaşamayacağına ise misafir arayüzündeki güvenlik duvarı kuralları karar verir.

Yalnız birinci katman varsa belirti yanıltıcıdır: giriş sayfası açılır — sayfa pfSense üzerinde barındırılır ve Captivo'ya erişim gerektirmez — ama form gönderildiğinde hiçbir şey olmaz, çünkü Captivo sunucusuna ulaşması gereken ilk istek odur. Sayfanın açılıyor olması erişimin var olduğunu göstermez.

Kural misafir arayüzüne, misafir trafiğini engelleyen kuralların üstüne konur:

  • Kaynak — misafir VLAN'ı
  • Hedef — Captivo sunucusunun adresi
  • Port — TCP 3000; kurulumunuzda Caddy varsa TCP 80 ve 443
  • Eylem — izin ver

Hangi portun geçerli olduğu kurulumunuza bağlıdır; yanlış olanı açmak işi garantiye almaz, yalnızca kuralı gereksiz yere genişletir. Gerçekte neyin dinlediğini şu komut gösterir:

docker compose -f docker-compose.onprem.yml --env-file .env.onprem ps

Çıktıda 80 ve 443 görünüyorsa Caddy kullanılıyordur ve 3000'i açmanıza gerek yoktur. Görünmüyorsa web servisi yalnız 3000'i dinliyordur ve 80/443 hiçbir servise ait değildir.

Birden fazla misafir VLAN'ı

Bir Captive Portal zone'u birden çok arayüzü kapsayabilir. Zone'a bir VLAN eklemek portalı o VLAN'da gösterir; o VLAN'a Captivo sunucusuna erişim vermez. pfSense'te güvenlik duvarı kuralları arayüz başınadır ve zone ayarı bunları oluşturmaz.

Yani yukarıdaki kuralın her misafir VLAN'ı için var olması gerekir. Tek tek yazmamak için Interfaces → Interface Groups altında misafir VLAN'larını içeren bir grup oluşturup kuralı bir kez gruba yazabilirsiniz; grup kuralı, üyesi olan bütün arayüzlerde geçerli olur.

Sık yapılan hata şu: yeni VLAN zone'a ekleniyor, portal o VLAN'da görünüyor ve iş bitmiş sanılıyor — ama oradaki misafirler sayfayı açıp formu geçemiyor, çünkü güvenlik duvarı kuralı yalnız ilk kurulan VLAN'da var. Portalın görünmesi, zaten kural gerektirmeyen kısımdır.

8Portalı atlaması gereken cihazlar

Yazıcılar, akıllı TV'ler, ödeme terminalleri ve kameralar giriş sayfası dolduramaz. pfSense'te bunlar için portalın kendi bypass listesini kullanın:

Services → Captive Portal → zone'unuz → MACs sekmesi → Add, action Pass ve cihazın MAC adresi.

Bu yolla geçirilen cihazlar Captivo'ya hiç doğrulanmaz; bu yüzden Aktif Oturumlar'da, misafir kayıtlarında ve raporlarda görünmezler. pfSense'in güvenlik duvarı kayıtlarını Log Sunucusu'na yönlendiriyorsanız trafikleri yine de kayıt altına alınır. Listeyi Captivo'dan yönetmek ve o cihazları oturumlarda/raporlarda görmek isterseniz aşağıdaki RADIUS yolunu kullanın.

Ya da: listeyi Captivo'dan yönetin (RADIUS MAC Authentication)

Not! Bu yol, zone'un Authentication Method'unu değiştirir. Üç ayarın birlikte doğru olması gerekir — biri eksikse hata mesajının açıklamadığı bir şekilde başarısız olur. 2026-09-04'te uçtan uca doğrulandı.

Services → Captive Portal → zone'unuz → Authentication:

  • Authentication Method: Use RADIUS MAC Authentication — cihazlar MAC adresiyle Captivo'daki MAC Whitelist'e doğrulanır.
  • Authentication Server: 2. adımda tanımladığınız Captivo sunucusu.
  • RADIUS MAC Secret: BOŞ BIRAKILMAMALI. pfSense, MAC adresini kullanıcı adı, buraya yazdığınız değeri parola olarak gönderir. Captivo parolayı hiç kontrol etmez — ne yazarsanız yazın çalışır — ama alan boşken pfSense isteği hiç göndermez ve loguna yalnızca "RADIUS MAC Authentication Failed" yazar. "Beyaz liste çalışmıyor" şikâyetinin açık ara en sık sebebi budur.
  • Login page Fallback: işaretleyin. İşaretli değilse, cihazı beyaz listede olmayan misafir tamamen bloke olur ve portalı hiç görmez — MAC'li cihazlarla portal misafirleri aynı zone'da bulunamazdı. İşaretliyken bulunabilirler.
  • MAC address format: Default — Captivo bütün yaygın yazım biçimlerini tanır, olduğu gibi kalabilir.
Önemli üç ayar çerçeveli: yöntemin kendisi, boş olmayan RADIUS MAC Secret ve Login page Fallback. Reauthenticate Users KAPALI kalsın — aşağıdaki nota bakın.
Bu yöntemde hata sayfası, cihazı beyaz listede olmayan misafirin gördüğü ilk sayfa hâline gelir. İndirdiğiniz şablonu portal sayfasının yanı sıra Auth error page contents alanına da yükleyin (4. adım) — yoksa o misafir kayıt olamayacağı bir sayfaya düşer.
Reauthenticate Users işaretsiz kalsın. Bağlı her cihazı dakikada bir yeniden doğrular; misafir profilinde cihaz sınırı varsa bu yeniden doğrulama ikinci eşzamanlı oturum sayılıp reddedilir ve her misafir bağlandıktan bir dakika sonra düşer. Bu ölçüldü, varsayılmadı.

Yine de çalışmıyorsa: testten hemen sonra Captivo sunucusunda docker exec captivo-postgres psql -U captivo -d captivo -c "SELECT authdate, username, reply FROM radpostauth ORDER BY authdate DESC LIMIT 20;" komutunu çalıştırın. Çıktıda MAC biçiminde bir kullanıcı adı yoksa pfSense hiç sormamış demektir — önce RADIUS MAC Secret alanına bakın.

Sorun Giderme

Misafirler bağlıyken Aktif Oturumlar listesi boş
  • Send accounting updates mutlaka Interim olmalı (6. adım). Açık ara en sık sebep budur.
  • Send RADIUS accounting packets işaretli mi ve Accounting Server Captivo mu, kontrol edin.
  • RADIUS sunucusundaki Services offered Authentication and Accounting olmalı, yalnız authentication değil.
  • pfSense'ten Captivo RADIUS sunucusuna giden yolda UDP 1813 açık olmalı.
İndirme ve yükleme ters görünüyor
  • Accounting style altındaki Invert Acct-Input-Octets and Acct-Output-Octets seçeneğini işaretleyin (6. adım).
  • Yalnız değişiklikten sonra başlayan oturumlar etkilenir; kapanmış oturumlar kayıtlı değerleriyle kalır.
Portal sayfası açılıyor ama giriş hep başarısız
  • Captivo (Ayarlar → RADIUS) ile pfSense (User Manager) arasında paylaşılan şifre uyuşmuyor olabilir. İki tarafa da yeniden girin.
  • Captivo'ya kaydedilen NAS IP, pfSense'in bize gerçekten ulaştığı adres olmalı — WAN/genel IP'si, LAN adresi değil.
  • Captivo'da NAS-Identifier doğrulaması açıksa, pfSense'teki NAS Identifier alanı tam olarak üretilen değeri içermelidir.
  • Yolda UDP 1812 açık olmalı.
Sayfa açılıyor ama SMS kodu gelmiyor / form hiçbir şey yapmıyor
  • Bu walled garden konusudur (7. adım). Misafir henüz internete çıkmadığı için sayfanın çağırdığı adresler giriş öncesi izinli olmalıdır.
  • Allowed Hostnames kayıtlarını ve Direction'ın Both olduğunu kontrol edin.
  • On-premise: captivo.io değil, kendi sunucu adresinizi izinli yapın.
  • Walled garden iki katmandan yalnızca biridir. Adres orada izinli olsa bile, misafir arayüzünde o VLAN'ın Captivo sunucusuna ulaşmasına izin veren bir güvenlik duvarı kuralı gerekir — bkz. 7. adım. Bu kural olmadan da sayfa açılır (pfSense üzerinde barındırıldığı için); yalnızca form gönderimi başarısız olur.
  • Birden fazla misafir VLAN'ı varsa, kuralın misafirin gerçekten bulunduğu VLAN'da olup olmadığına bakın. Zone'a VLAN eklemek o VLAN'ın güvenlik duvarı kuralını oluşturmaz.
Hız limiti / oturum süresi / kota uygulanmıyor
  • 5. adımdaki üç attribute seçeneği işaretli olmalı; aksi halde pfSense değerleri alır ve yok sayar.
  • Süre Captivo profilinden gelecekse zone'un kendi Idle/Hard timeout alanlarını boş bırakın — pfSense hangi limit kısaysa onu uygular.

Ürün geneli sorunlar için: Portal açılmıyor · Giriş reddediliyor · Oturumlar görünmüyor

Bu yazı yardımcı oldu mu?