pfSense Entegrasyonu
pfSense Captive Portal ile Captivo entegrasyonu
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.
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.
| Alan | Değer |
|---|---|
| Descriptive name | Captivo |
| Type | RADIUS |
| Protocol | MS-CHAPv2 (önerilen). PAP da çalışır, ama MS-CHAPv2 şifreyi hat üzerine koymaz. |
| Hostname or IP address | radius.captivo.io |
| Shared Secret | 1. adımdaki değer |
| Services offered | Authentication and Accounting |
| Authentication / Accounting port | 1812 / 1813 |
| RADIUS NAS IP Attribute | misafir tarafındaki arayüzünüz (ör. LAN) |
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.
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.
4Portal sayfasını yükle
- 1. Aynı zone sayfasında HTML Page Contents → Portal page contents alanına inin ve 1. adımda indirdiğiniz şablonu yükleyin.
- 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. Henüz kaydetmeyin — sayfada aşağı, Authentication ve Accounting'e devam edin; en altta bir kez kaydedeceksiniz.
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.
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:
InterimCaptivo 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.
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'sicaptivo.ioradius.captivo.io
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.
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)
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.
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