- Wag, WireGuard'a çok faktörlü kimlik doğrulama, rota kısıtlamaları ve cihaz kaydı ekleyen bir proje olup MFA gerektiren rotalar ile her zaman erişilebilen genel rotaları ayırabiliyor
- Yeni istemci kaydı API'si, yüksek erişilebilirlik, gerçek zamanlı kullanıcı güncellemeleri ve bildirimler ile Security Key, SSO, PAM, TOTP gibi çeşitli MFA entegrasyonları sunuyor
- Sunucuyu çalıştırmak için IP yönlendirmesinin etkinleştirilmesi gerekiyor; elle çalıştırmada
iptablesvelibpamkurulumu ileiptablesve WireGuard cihazlarını yönetmek için root olarak çalıştırma gerekli - Yönetim web UI ve CLI ile yapılabiliyor; CLI, kayıt token'ları, cihaz kilitleme, MFA sıfırlama ve web yönetici hesaplarını
start,registration,devices,users,webadminalt komutlarıyla ele alıyor - Kısıtlamalar arasında istemci başına yalnızca bir
AllowedIPdesteği bulunuyor; esas olarak Linux'a yönelik ve Windows bazı ek işlemlerle çalışabiliyor
Wag'in WireGuard'a eklediği özellikler
- Wag, WireGuard'a MFA, rota kısıtlamaları ve cihaz kaydı ekler
- Rotalar, MFA doğrulaması gerektiren yollar ile her zaman erişilebilen genel rotalar olarak ayrılıp tanımlanabilir
- Yeni istemci kaydı için kolay bir API sunar
- Yüksek erişilebilirlik, gerçek zamanlı kullanıcı güncellemeleri ve bildirimleri destekler
- MFA entegrasyonları şu yöntemleri içerir
- Security Key
- SSO
- PAM
- TOTP
- Dokümantasyon Documentation adresinde sunulmaktadır
Kurulum ve çalıştırma koşulları
- Sunucuda forwarding etkin olmalıdır
- IPv4 için
net.ipv4.ip_forward=1ayarı kullanılır - IPv6 için
net.ipv6.conf.all.forwarding=1gibi ilgilisysctlayarları kullanılır
- IPv4 için
- Docker Compose çalıştırma örneği
wagvpn/wag:latestimajını kullanır- Yönetim sayfası port örneği
4433/tcp - Genel kayıt sayfası port örneği
8081/tcp - WireGuard port örneği
53230/udp /dev/net/tuncihazı konteynere bağlanır
- Yönetim sayfası port örneği
- Elle kurulum için
iptablesvelibpamgerekir - Wag,
iptablesve WireGuard cihazlarını yönetmek için root olarak çalıştırılmalıdır - İkili sürümler için
glibc 2.31+gerekir - Kaynaktan derleme için
go1.23.1venpmgerekir
Yönetim yöntemleri
- Yönetim UI etkinleştirilip Wag yapılandırıldıktan sonra ilk yönetici oluşturulur ve parola STDOUT'a yazdırılır
- Ardından web UI'ye giriş yaparak kullanıcılar yönetilebilir
- Root kullanıcı CLI ile Wag sunucusunu yönetebilir
- CLI biçimi
wag subcommand [-options]şeklindedir - Desteklenen alt komutlar şunlardır
start: Wag sunucusunu başlatır, daemon moduna geçmezregistration: kayıt token'ı oluşturma, silme ve listelemeyi işlerdevices: WireGuard cihazlarını listeleme, silme, kilitleme, kilit açma ve etkin MFA oturumlarını görüntülemeyi işlerusers: kullanıcı MFA yönetimi, kullanıcı silme, hesap kilitleme ve MFA sıfırlamayı işlerwebadmin: web UI yönetici kullanıcısı ekleme, silme, listeleme, hesap kilitleme ve kilit açmayı işlerversion,firewallda desteklenen komutlar arasındadır
Kayıt token'ı ve MFA akışı
- Yeni cihaz kaydı için önce
wag registration -add -username testergibi bir komutla kayıt token'ı oluşturulur - Oluşturulan token genel kayıt endpoint'ine gönderildiğinde WireGuard yapılandırma yanıtı alınabilir
- Döndürülen yapılandırma
Interface,PrivateKey,Address,Peer,Endpoint,PublicKey,AllowedIPs,PersistentKeepAlivegibi öğeleri içerir - Kullanıcı sunucunun VPN adresine bağlanarak 2FA kodunu girer
- Oturumun sona ermeden önce ne kadar süreceği yapılandırma dosyasında belirtilir
Web yönetim konsolu
- Yönetim konsoluna giriş yapabilmek için
Webserver.Management.Enableddeğeritrueolarak ayarlanmalıdır - Konsolda
sudo ./wag webadmin -add -username <your_username> -password <your-password-here>komutuyla web yöneticisi hesabı eklenir - Ardından yönetim dinleme adresine gidilip kimlik bilgileri girilir
- Web arayüzünün kendisi yönetici kullanıcı ekleyemez
- Yönetim portalının dışarıya açılmaması önerilir;
ListenAddressdeğerinin127.0.0.1veyalocalhostolarak ayarlanması ve SSH forwarding ile erişime açılması tavsiye edilir
Başlıca yapılandırma öğeleri
NumberProxies, istemcinin önündeki güvenilir reverse proxy sayısını belirtir ve Wag'inX-Forward-Forbilgisini dikkate alarak istemci IP'sini ayrıştırmasını sağlarSocket, Wag kontrol soketidir; değiştirilirse aynı makinede birden fazla Wag instance'ı çalıştırılabilirNAT, masquerading'i açıp kapatır; etkinleştirildiğinde tüm trafik VPN sunucusundan çıkıyormuş gibi görünürNATExcludeRanges,NAT=trueolduğunda NAT dışında bırakılacak CIDR aralıklarını belirtirExposePorts, VPN sunucusunun portlarını istemcilere açar veiptableskuralları eklerCheckUpdatesvarsayılan olarak kapalıdır; etkinleştirildiğinde yönetim UI yeni Wag sürümleri için bildirim gösterir veapi.github.comadresine erişirAcls, grupları ve politikaları tanımlar ancak yalnızca ilk çalıştırmada uygulanır; çalışma zamanında web UI üzerinden düzenlenirWebserver, genel kayıt endpoint'i, tünel MFA portalı ve yönetim portalı ayarlarını içerirWireguard, cihaz adı, dinleme portu, özel anahtar, VPN'in yöneteceği alt ağ, MTU ve DNS sunucularını ayarlarClustering, küme adı, etcd küme durumu, log seviyesi, witness node, veritabanı konumu ve küme sertifikalarıyla ilgili ayarları içerir
ACL politika davranışı
Policies, VPN'in yakalayacağı rotaları ve Wag üzerinden geçecek port/protokolleri tanımlar- Kural uygulaması subnet prefix length kullanır ve en spesifik eşleşme rota erişim seviyesini belirler
- Örneğin
/16MFA olarak tanımlanıp bunun içindeki belirli bir/32Allow olarak tanımlanırsa, daha spesifik olan/32öncelik kazanır ve MFA olmadan erişilebilir - Bu davranış
v6.0.0sürümünde değişmiştir; önceden MFA rotaları her zaman öncelikliydi - Tek bir rota için birden fazla politika tanımlanırsa politikalar birleştirilir ve MFA kuralı öncelikli olur
- Henüz yayınlanmamış sürümlerden itibaren
Denykurallarıyla rota erişimi engellenebilir - En spesifik kural yeni bir kural “bucket”ı oluşturduğundan,
/32bucket'ında yalnızca deny varsa aynı/32üzerindeki diğer portlara erişim de mümkün olmayabilir
Port ve protokol kuralları
- Servis erişimi port ve protokol kurallarıyla tanımlanabilir
- Desteklenen kural türleri 3 tanedir
- Any: ayrı bir kural yoksa veya
anyanahtar sözcüğü kullanılırsa tüm servis ve port kombinasyonlarına izin verir - Single Service:
192.168.1.1 22/tcp 53/udpgibi, bir host üzerindeki belirli TCP/UDP portlarına izin verir - Ranges:
192.168.1.1 22-1024/tcp 23-53/anygibi, port aralıkları tanımlanabilir
- Any: ayrı bir kural yoksa veya
- Port aralıklarında önce düşük port yazılmalıdır
- ICMP'nin portu olmadığından
1.1.1.1 icmpgibi portsuz belirtilebilir
Sınırlamalar ve geliştirme
- Wag istemci başına yalnızca bir
AllowedIPdestekler - Bu sınırlama, istemciden sunucuya uzanan yapılar için uygundur
- Esas olarak Linux odaklıdır; Windows bazı ek işlemlerle çalışabilir
- Geliştirme modunda, tünele gelen isteklerin IP'sini istemci IP'si olarak ayarlamak için bir ortam değişkeni kullanılabilir
- Test örneği olarak
internal/routeriçindesudo go test -v .çalıştırılır - Dış katkılar için, özellik ekleme veya hata düzeltme durumunda mümkünse test yazılması ve ardından Pull Request açılması istenir
1 yorum
Hacker News yorumları
Görünüşte iyi duruyor ama birkaç şey aklıma takıldı
curl [http://public.server.address:8080/register_device?key=e83253...](<http://public.server.address/register_device/…;)örneği ve “servis tamamen şablonlanmış bir yanıt döndürür” açıklamasına bakınca, kayıt sürecinde istemcinin özel anahtar oluşturup açık anahtarı sunucuya göndermesinden ziyade sunucunun özel anahtarı oluşturup istemciye gönderdiği anlaşılıyorÜstelik örnek HTTP olduğu için, insanların HTTP’nin de uygun bir seçenek olduğunu düşünmemesi adına en azından bu kısmın değiştirilmesi iyi olur
Oturum süresi dolduğunda istemcinin bunu fark etmesinin bir yolu var mı, onu da merak ediyorum. Yoksa SSH oturumu gibi bir şey öylece takılı mı kalıyor?
Bazen Wi-Fi’daki captive portal algılaması gibi çalışan bir WireGuard istemcisi aradım; idealde yapılandırma dosyasına
persistentkeepalivebenzeri tek bir satır ekleyip bir URL’yi çekmesi ve düzenli olarak kontrol etmesi güzel olurdu.OKgelirse normal, yanıt yoksa ağ sorunu,Locationbaşlığı gelirse tarayıcıyı o konuma açıp oturumu yeniden doğrulatmak vb.Henüz böyle bir istemci bulamadım
pubkeyparametresini de alabiliyor; yani sunucunun özel anahtar üretmesine bağlı kalmak gerekmiyor. Dokümantasyon eksik olduğu için kafa karıştırması normalSon soruya yanıt olarak, kullandığım eBPF XDP yalnızca
PASS,DROP,REDIRECTyapabiliyor. Bu yüzden en kolay sonuç olanPASS/DROPile ele alınıyor ve bağlantı öylece takılı kalıyorAncak captive portal algılama sayfasını wag MFA listesine eklerseniz algılamayı kendiniz yapılandırabilirsiniz; sonrasını tarayıcı halleder
wag’de araya girme veya proxy gibi davranan bir işlev uygulamayı düşünmüyorum. Bunu yapmak kimlik doğrulama süresinin dolması ya da çıkış işlemini biraz kolaylaştırırdı ama hedefim bu değil
Mac için bir Go istemcisi yazdım ve Brew’in komut satırı
wgaracını kullanarak anahtar üretimini de hallettim; ama kaba saba çalışıyordu vesudogerekiyorduAğ izinlerini kullanan düzgün bir yerel uygulama iyi olurdu, fakat bu benim kapasitemin dışında
Oturum yönetimi meselesini hâlihazırda ele alıp almadığınızı ya da ele almayı planlayıp planlamadığınızı merak ediyorum
Özünde WireGuard anahtarı sonsuz ömürlü bir oturum anahtarı gibi
WireGuard taşıma katmanını uygulayan yazılım doğru düzgün bir VPN sunucu çözümüyse bence oturum yönetimini de uygulamalı. Yani sunucuyla ikinci bir kanal üzerinden oturum anahtarını düzenli olarak döndürmeli, oturumu sonlandırmalı, IP adresini değiştirmeli, yeni rotalar kurmalı ve gerekirse kimlik doğrulamayı tekrarlamalı
WireGuard anahtarı wag sunucusuyla iletişim kurmayı sağlar; ancak asıl oturum, kullanıcının doğrulanıp doğrulanmadığını tutan eBPF map ile korunur
Bu yüzden biri özel anahtar materyalini çalsa bile MFA ile sınırlandırılmış rotalara erişemez
TOTP kodu brute force denemelerini engelleyip engellemediğinizi merak ediyorum. Örneğin hız sınırlama veya deneme sayısı sınırı gibi
Koda hızlıca baktım ama buna dair bir şey bulamadım
Aklımdaki senaryo, birinin tarayıcıda TOTP giriş arayüzünü açıp geliştirici araçlarını çalıştırdıktan sonra olası tüm TOTP kodlarını sırayla denemesi
Özellikle kullanıcının, cihazın neden kimlik doğrulamayı zorla denemeye çalıştığını düşünmesini sağlama amacı da var. Böyle bir durum uç noktanın ele geçirildiğine işaret edebilir
Headscale veya Tailscale’e çok benziyor gibi geliyor. WireGuard ağlarını yönetmek için alternatifler görmek güzel
Özelliklerin ne kadar örtüştüğünü, nelerin eklendiğini, nelerin farklı olduğunu ve ileride de nelerin uygulanmayacağını anlayabileceğimiz bir karşılaştırma var mı merak ediyorum
Dokümantasyona doğrudan bir karşılaştırma koymadım; şu anda gitmek istediğim yön bu değil. Bu proje benim ihtiyaçlarıma uyuyor ve oldukça eğlenceli
Wag, her şeyin birbirine ulaşabildiği ve kuralların overlay’i tanımladığı Tailscale tarzı mesh yapıdan ziyade, net sınırlar isteyen hub-and-spoke mimarisi için daha uygun
Hem wag hem Tailscale SSO entegrasyonu ve kullanıcıyı korumak için fiilen 2FA ekliyor
İkisinde de kayıt yöntemi ve yönetim için web UI var; ancak web geliştirmeyi sevmeyen tek kişilik bir geliştirici olduğum için Tailscale muhtemelen çok daha cilalıdır
Kesinlikle uygulamayacağım şey, oturum kapatıldıktan sonra kullanıcıyı yönlendirmek için araya girme veya TLS proxy tarafı. Bunun başlıca nedeni, bunu şu anda eBPF ile yapmak benim için biraz fazla zor ve çalıştırmak için muhtemelen yazmam gereken DNAT/SNAT bileşenlerini kullanmak istememem
Yalnızca IPv4 olması ilginç; WireGuard’ı seçen bir sitenin daha modern bir yapılandırmaya sahip olup kendi hizmet tipi ULA’larını bolca kullanması da mümkün gibi
ULA’dan söz ederken özellikle aklınızda olan bir nokta var mıydı merak ediyorum