UnrealIRCd 6'da WebSocket ve Reverse Proxy Yapılandırması
Web tabanlı IRC istemcileri, kullanıcıların ayrı bir program kurmadan tarayıcı üzerinden IRC ağına bağlanmasını sağlar. Ancak UnrealIRCd'nin önüne NGINX gibi bir reverse proxy yerleştirildiğinde sunucu bütün kullanıcıları proxy'nin IP adresinden bağlanmış gibi görebilir.
Bu durum yalnızca kayıtların doğruluğunu bozmaz. Aynı IP üzerinde görünen çok sayıda kullanıcı nedeniyle bağlantı limitleri, flood koruması, ban işlemleri ve olay incelemeleri de hatalı sonuç verebilir.
Bu rehberde UnrealIRCd 6.1.1 ve üzerindeki proxy bloğunu kullanarak güvenli WebSocket bağlantısı oluşturmayı, NGINX üzerinden wss:// erişimi sunmayı ve gerçek istemci IP adresini sahte başlıklara güvenmeden UnrealIRCd'ye aktarmayı ele alacağız.
1. WebSocket, Reverse Proxy ve WEBIRC Arasındaki Fark
Doğrudan WebSocket bağlantısı
Tarayıcı doğrudan UnrealIRCd'nin WebSocket portuna bağlanır:
CODE TERMINAL
Tarayıcı -> UnrealIRCd WebSocket portuArada başka bir sunucu bulunmadığı için UnrealIRCd istemcinin gerçek kaynak IP adresini görür. Bu yapıda proxy bloğu gerekmez.
Reverse proxy üzerinden WebSocket
NGINX bağlantıyı kabul eder ve UnrealIRCd'ye aktarır:
CODE TERMINAL
Tarayıcı -> NGINX -> UnrealIRCdUnrealIRCd açısından TCP bağlantısını kuran taraf NGINX'tir. Gerçek IP güvenilir bir HTTP başlığıyla ayrıca iletilmezse bütün kullanıcılar NGINX'in adresiyle görünür.
WEBIRC ağ geçidi
WEBIRC modelinde KiwiIRC Gateway gibi bir ağ geçidi kullanıcı adına normal IRC bağlantısı oluşturur:
CODE TERMINAL
Tarayıcı -> WEBIRC Gateway -> UnrealIRCdBu modelde type webirc ve ortak parola kullanılır. WebSocket reverse proxy yapılandırmasında ise forwarded veya x-forwarded türü tercih edilir. WEBIRC ile WebSocket'i aynı protokol gibi değerlendirmek, gerçek IP aktarımında yapılan en yaygın hatalardan biridir.
2. Güvenli Kurulum Mimarisi
Bu rehberde aşağıdaki mimariyi kullanacağız:
CODE TERMINAL
Kullanıcı
|
| wss://chat.example.net/websocket
v
NGINX :443
|
| ws://127.0.0.1:8000
v
UnrealIRCd WebSocket listenerTLS bağlantısı NGINX üzerinde sonlandırılır. UnrealIRCd'nin WebSocket portu yalnızca 127.0.0.1 üzerinde dinlediği için internete doğrudan açılmaz. Kullanıcı yalnızca NGINX'e bağlanabilir ve UnrealIRCd istemci IP bilgisini yalnızca yerel NGINX bağlantısından kabul eder.
3. UnrealIRCd WebSocket Modüllerini Yükleme
unrealircd.conf dosyasına gerekli modülleri ekleyin:
CODE TERMINAL
loadmodule "webserver";
loadmodule "websocket";Ardından yalnızca yerel bağlantıları kabul eden bir WebSocket listener oluşturun:
CODE TERMINAL
listen {
ip 127.0.0.1;
port 8000;
options {
websocket {
type text;
allow-origin {
chat.example.net;
}
}
}
};- ip 127.0.0.1: WebSocket portuna yalnızca aynı makinedeki NGINX erişebilir.
- port 8000: NGINX'in bağlantıyı yönlendireceği dahili porttur.
- type text: KiwiIRC gibi yaygın web istemcileriyle uyumlu WebSocket türüdür.
- allow-origin: Normal tarayıcı bağlantılarını belirtilen webchat alan adıyla sınırlar.
allow-origin tek başına kimlik doğrulama veya güvenlik duvarı değildir. Özel yazılmış istemciler Origin başlığını taklit edebilir. Bu nedenle dahili port ayrıca bind adresi ve güvenlik duvarıyla korunmalıdır.
4. Gerçek IP İçin Güvenilir Proxy Bloğu
NGINX üzerinden X-Forwarded-For ve X-Forwarded-Proto başlıklarını göndereceğimiz için UnrealIRCd tarafında x-forwarded türünü kullanacağız:
CODE TERMINAL
proxy webchat-nginx {
type x-forwarded;
match {
ip 127.0.0.1;
}
};match alanı, hangi sistemin istemci IP adresini değiştiren proxy başlıkları gönderebileceğini belirler. NGINX farklı bir sunucuda çalışıyorsa 127.0.0.1 yerine yalnızca o sunucunun sabit özel IP adresini yazın:
CODE TERMINAL
proxy webchat-nginx {
type x-forwarded;
match {
ip 10.20.30.40;
}
};Herkesi kapsayan joker maskeler kullanmayın. Aksi hâlde doğrudan UnrealIRCd'ye ulaşabilen bir saldırgan sahte proxy başlığı göndererek kaynak IP adresini değiştirmeye çalışabilir.
UnrealIRCd 6.1.8 ve üzeri sürümlerde forwarded, x-forwarded ve cloudflare türüyle eşleşen güvenilir proxy adresleri bağlantı flood ve blacklist kontrollerinden otomatik olarak muaf tutulur. Eski sürümlerde geniş kapsamlı istisnalar tanımlamak yerine desteklenen güncel UnrealIRCd sürümüne geçmek daha güvenlidir.
5. NGINX WebSocket Yapılandırması
Aşağıdaki örnek TLS bağlantısını NGINX üzerinde sonlandırır ve trafiği yerel UnrealIRCd portuna aktarır:
CODE TERMINAL
server {
listen 443 ssl http2;
server_name chat.example.net;
ssl_certificate /etc/letsencrypt/live/chat.example.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/chat.example.net/privkey.pem;
location /websocket {
proxy_pass http://127.0.0.1:8000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 10s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
proxy_buffering off;
}
}Buradaki en önemli satırlardan biri şudur:
CODE TERMINAL
proxy_set_header X-Forwarded-For $remote_addr;Yaygın web uygulamalarında kullanılan $proxy_add_x_forwarded_for değişkeni, istemciden gelen mevcut X-Forwarded-For başlığını zincire ekler. NGINX doğrudan internete açıksa istemci kendi sahte başlığını gönderebilir. Zincirin yanlış yorumlanması hâlinde sahte adresler erişim kontrollerine veya loglara taşınabilir.
Tek katmanlı yapıda başlığı gelen değerle birleştirmek yerine $remote_addr üzerinden yeniden oluşturmak daha güvenli ve öngörülebilir bir yöntemdir. Ön tarafta ayrıca güvenilir bir yük dengeleyici bulunuyorsa NGINX real_ip modülü yalnızca o yük dengeleyicinin bilinen adreslerine güvenecek şekilde yapılandırılmalıdır.
6. Backend Portunu Neden İnternete Açmamalısınız?
WebSocket listener'ını ip * ile tanımlamak portu bütün ağ arabirimlerinde dinlemeye açar. Bir saldırgan NGINX'i atlayarak dahili porta ulaşabiliyorsa reverse proxy üzerindeki hız sınırlarını aşabilir, NGINX erişim günlüklerinden kaçabilir ve tasarlanan güven sınırını bozabilir.
NGINX ve UnrealIRCd aynı makinedeyse 127.0.0.1 kullanın. Ayrı makinelerdeyse listener'ı özel ağ adresine bağlayın ve güvenlik duvarında yalnızca proxy sunucusuna izin verin.
7. Yapılandırmayı Devreye Alma
Önce UnrealIRCd yapılandırmasını test edin:
CODE TERMINAL
cd ~/unrealircd
./unrealircd configtestTest hatasız tamamlanırsa yapılandırmayı yeniden yükleyin:
CODE TERMINAL
./unrealircd rehashNGINX yapılandırmasını kontrol edin:
CODE TERMINAL
sudo nginx -tSözdizimi testi başarılıysa hizmeti kesmeden yeniden yükleyin:
CODE TERMINAL
sudo systemctl reload nginxconfigtest ve nginx -t çalıştırmadan iki hizmeti aynı anda yeniden başlatmak, küçük bir yazım hatasının hem webchat'i hem de IRC erişimini kesmesine neden olabilir.
8. Gerçek IP Aktarımını Doğrulama
Web istemcisini aşağıdaki adrese bağlayın:
CODE TERMINAL
wss://chat.example.net/websocketBağlantı kurulduktan sonra IRC operatör hesabıyla kullanıcı bilgisini kontrol edin:
CODE TERMINAL
/WHOIS kullaniciTest sırasında kullanıcının gerçek internet IP adresini, NGINX erişim günlüğündeki $remote_addr değerini ve UnrealIRCd'nin kullanıcı için gördüğü IP adresini karşılaştırın. Üç değer tutarlıysa proxy zinciri doğru çalışıyor demektir.
9. Sık Görülen Hatalar
Bütün kullanıcılar 127.0.0.1 olarak görünüyor
proxy bloğunun yüklendiğini, type x-forwarded kullanıldığını, NGINX'in X-Forwarded-For başlığını gönderdiğini ve match içindeki adresin UnrealIRCd'nin gördüğü gerçek NGINX adresiyle eşleştiğini kontrol edin.
Proxy did not send a valid forwarded header uyarısı
Proxy türüyle gönderilen başlık uyuşmuyor olabilir. UnrealIRCd'de type forwarded kullanılıyorsa NGINX standart Forwarded başlığı göndermelidir. NGINX X-Forwarded-For gönderiyorsa UnrealIRCd tarafında type x-forwarded kullanılmalıdır.
Tarayıcı bağlantıyı engelliyor
Webchat sayfası HTTPS üzerinden açılıyorsa bağlantı da wss:// olmalıdır. Güvenli bir HTTPS sayfasından şifresiz ws:// bağlantısı kurmaya çalışmak modern tarayıcılarda karma içerik politikası nedeniyle engellenir.
Bağlantı kısa süre sonra kopuyor
NGINX zaman aşımı değerleri uzun süreli IRC oturumları için yetersiz olabilir. proxy_send_timeout ve proxy_read_timeout değerlerini kontrol edin. IRC istemcisinin PING/PONG trafiğini düzgün işlediğinden de emin olun.
NGINX 502 Bad Gateway döndürüyor
UnrealIRCd'nin 8000 numaralı portta dinlediğini, proxy_pass adresinin doğru olduğunu, yerel güvenlik duvarının bağlantıyı engellemediğini ve WebSocket modüllerinin hatasız yüklendiğini kontrol edin.
10. WEBIRC Kullanılacaksa
KiwiIRC Gateway gibi gerçek bir WEBIRC ağ geçidi kullanıyorsanız x-forwarded yerine webirc türü ve ortak parola gerekir:
CODE TERMINAL
proxy kiwi-gateway {
type webirc;
mask 127.0.0.1;
password "UZUN_VE_RASTGELE_WEBIRC_PAROLASI";
};Ağ geçidi tarafında da aynı parola tanımlanmalıdır. WEBIRC parolası uzun, rastgele ve başka hesaplarda kullanılmayan bir değer olmalıdır. WEBIRC, gateway'e istemci IP adresini değiştirme yetkisi verdiği için mask alanını geniş tutmak ciddi bir güvenlik hatasıdır.
11. Üretim Kontrol Listesi
- UnrealIRCd'nin desteklenen güncel 6.x sürümü kullanılıyor.
- webserver ve websocket modülleri yüklü.
- Dahili WebSocket listener yalnızca localhost veya özel ağ adresinde dinliyor.
- İnternete yalnızca NGINX'in 443 numaralı portu açık.
- proxy bloğu yalnızca gerçek NGINX IP adresiyle eşleşiyor.
- NGINX, gelen X-Forwarded-For değerini doğrudan güvenilir kabul etmiyor.
- X-Forwarded-For başlığı $remote_addr üzerinden yeniden oluşturuluyor.
- Webchat HTTPS, bağlantı ise wss:// kullanıyor.
- TLS sertifika zinciri tarayıcılar tarafından güvenilir bulunuyor.
- allow-origin yalnızca gerekli webchat alan adlarını içeriyor.
- NGINX ve UnrealIRCd yapılandırma testleri hatasız tamamlanıyor.
- Gerçek IP, NGINX ve UnrealIRCd günlüklerinde karşılaştırılarak doğrulanıyor.
Sonuç
UnrealIRCd'yi reverse proxy arkasında çalıştırırken gerçek IP aktarımı yalnızca görünürlük özelliği değildir. Ban yönetimi, flood kontrolü, bağlantı limitleri ve olay incelemesi doğrudan bu bilginin doğruluğuna bağlıdır.
Güvenli yapılandırmanın temel prensibi şudur: İstemci IP adresini değiştirebilecek başlıklar yalnızca açıkça tanımlanmış ve güvenilir proxy sistemlerinden kabul edilmelidir.
NGINX ile UnrealIRCd aynı makinede çalışıyorsa WebSocket listener'ını 127.0.0.1 üzerinde tutmak, proxy bloğunu aynı adresle sınırlandırmak ve X-Forwarded-For başlığını $remote_addr üzerinden yeniden oluşturmak sade ve güvenli bir başlangıç mimarisi sağlar.
Resmî Kaynaklar
- UnrealIRCd Proxy Block belgesi
- UnrealIRCd WebSocket desteği
- UnrealIRCd WEBIRC desteği
- UnrealIRCd yapılandırma belgeleri
TR Siber Ekibi