Bedrud Belgeler

Bedrud, kısıtlayıcı NAT’ler veya güvenlik duvarları arkasındaki istemciler için medyayı aktarmak üzere LiveKit aracılığıyla gömülü bir TURN sunucusu barındırır. Bu sayfa mimariyi, yapılandırmayı ve sorun gidermeyi kapsar.


TURN Nedir

TURN (Traversal Using Relays around NAT), iki uç nokta doğrudan bağlanamadığında medya paketlerini bir sunucu üzerinden ileten bir protokoldür.

İlgili protokoller:

ProtokolRolMaliyet
STUNGenel IP/port keşfi. Hafif.Yok (sunucu yalnızca küçük bağlama isteklerini görür)
ICETüm bağlantı seçeneklerini öncelik sırasıyla deneyen çerçeve.Yok (yalnızca koordinasyon)
TURNDoğrudan yol başarısız olduğunda tüm medyayı aktarır. Son çare.Yüksek (sunucu bant genişliği = tüm aktarılan medya)

Tam bağlantı yığını için bkz. WebRTC Bağlantısı.


Bedrud’da TURN

LiveKit gömülü bir TURN sunucusu içerir. Harici altyapı gerekmez.

Aktarma Mimarisi

flowchart LR
    subgraph Client["Client"]
        A[WebRTC Peer]
    end
 
    subgraph NAT["NAT / Firewall"]
        direction TB
        N{Direct P2P<br/>possible?}
    end
 
    subgraph Server["Bedrud Server"]
        STUN[STUN Server<br/>port 3478]
        TURN[TURN Relay<br/>port 3478 UDP<br/>port 5349 TLS]
        SFU[LiveKit SFU]
    end
 
    A -->|"ICE candidates"| N
    N -->|"Yes"| SFU
    N -->|"No"| TURN
    TURN -->|"relayed media"| SFU
    A -.->|"discover public IP"| STUN

Bağlantı Önceliği

LiveKit bağlantı türlerini sırayla dener. Her geri düşüş gecikme ve sunucu maliyeti ekler:

flowchart TD
    A[ICE over UDP<br/>port 50000-60000] -->|"~80% succeed"| S[Connected]
    A -->|"fail"| B[TURN over UDP<br/>port 3478]
    B -->|"succeed"| S
    B -->|"UDP blocked"| C[ICE over TCP<br/>port 7881]
    C -->|"succeed"| S
    C -->|"TCP blocked"| D[TURN over TLS<br/>port 5349 / 443]
    D -->|"succeed"| S
    D -->|"fail"| E[Connection failed]
ÖncelikTürPortTipik senaryo
1ICE/UDP (doğrudan)50000-60000Çoğu bağlantı. Aktarma yok.
2TURN/UDP3478Simetrik NAT, P2P engelli.
3ICE/TCP7881UDP engelli (VPN, bazı güvenlik duvarları).
4TURN/TLS5349 veya 443Kurumsal güvenlik duvarı, yalnızca HTTPS giden.

TURN Ne Zaman Aktifleşir

TURN, doğrudan medya yolu başarısız olduğunda aktifleşir. Yaygın nedenler:

  • Her iki uçta simetrik NAT - İstemci ve sunucunun ikisinin de Simetrik NAT’i vardır. NAT her hedef için farklı bir genel port atar, bu nedenle STUN ile keşfedilen adres erişilemez olur.
  • Kurumsal güvenlik duvarı - Giden UDP’yi tamamen engeller. Yalnızca TCP 443 portuna izin verilir.
  • VPN kısıtlamaları - Bazı VPN’ler WebRTC trafiğini yakalar veya engeller.
  • Genel IP’siz bulut VM’leri - Bazı bulut sağlayıcıları doğrudan ICE’yi bozan NAT kullanır.

Çoğu kullanıcı (~%80) hiçbir zaman TURN’e düşmez. Doğrudan UDP yolu çalışır.

Bant Genişliği Maliyeti

TURN aktardığında sunucu o katılımcının tüm medyasını taşır. Yaklaşık yayın başına bant genişliği:

Yayın türüBit hızıAktarılan katılımcı başına
Ses (Opus)~32 Kbps~32 Kbps
Video 720p (VP8)~1.5 MbpsAbone olunan kanal başına ~1.5 Mbps yükleme + 1.5 Mbps indirme
Ekran paylaşımı 1080p~2.5 Mbps~2.5 Mbps

Bir aktarılan katılımcının bulunduğu 5 kişilik bir toplantıda: sunucu o katılımcının video aktarma için ~1.5 Mbps fazladan işler. Toplam sunucu bant genişliğini tahmin etmek için bu değerleri aktarılan katılımcı sayısıyla çarpın.


Yapılandırma

Dosya: server/config/livekit.yaml (geliştirme) veya /etc/bedrud/livekit.yaml (üretim)

turn:
  enabled: true
  domain: "turn.example.com"
  udp_port: 3478
  tls_port: 5349
  cert_file: /etc/bedrud/turn.crt
  key_file: /etc/bedrud/turn.key
  relay_range_start: 30000
  relay_range_end: 40000
  external_tls: false

Anahtar Başvurusu

AnahtarVarsayılanAçıklama
enabledtrueGömülü TURN sunucusunu etkinleştir.
domainlocalhostİstemcilere duyurulan etki alanı. Sunucunun genel IP’sine çözümlenmelidir.
udp_port3478TURN/UDP portu. TURN etkinleştirildiğinde STUN bağlama isteklerini de sunar.
tls_port5349TURN/TLS portu. Yük dengeleyici TLS’yi sonlandırmıyorsa 443 olarak ayarlayın.
cert_file-TURN/TLS için TLS sertifikası. TURN/TLS istemcileri olduğunda gereklidir.
key_file-cert_file ile eşleşen TLS özel anahtarı.
relay_range_start30000Aktarılan medya paketleri için kullanılan UDP port aralığının başlangıcı.
relay_range_end40000Aktarma port aralığının sonu. Her aktarılan katılımcı bu aralıktan port tüketir.
external_tlsfalseBir Katman 4 yük dengeleyici TURN/TLS’yi sonlandırdığında true ayarlayın. LiveKit kendi TLS’sini TURN portunda atlar.

use_external_ip Etkileşimi

Aynı livekit.yaml dosyasında rtc: altında:

rtc:
  use_external_ip: true

TURN’ün doğru çalışması için true olmalıdır. false olduğunda ICE adayları internet üzerindeki istemcilerin erişemeyeceği iç (özel) IP adresleri içerir.


Üretim TLS Kurulumu

TURN/TLS kendi TLS sertifikasını gerektirir. İki yaklaşım:

Tek Etki Alanı (Yük Dengeleyici Yok)

Sunucunun TLS sertifikasını yeniden kullanın. tls_port değerini 443 olarak ayarlayın:

turn:
  enabled: true
  domain: "meet.example.com"
  tls_port: 443
  cert_file: /etc/bedrud/meet.example.com.crt
  key_file: /etc/bedrud/meet.example.com.key

TURN etki alanı ve sunucu etki alanı aynıdır. 443 portu hem HTTPS API hem de TURN/TLS’yi işler - LiveKit protokole göre ayırt eder.

Özel TURN Etki Alanı (Yük Dengeleyici İle)

flowchart LR
    C[Client] --> LB[Layer 4<br/>Load Balancer]
    LB -->|"HTTPS :443"| API[Bedrud API<br/>:8090]
    LB -->|"TURN/TLS :5349"| LK1[LiveKit Node 1<br/>:7880]
    LB -->|"TURN/TLS :5349"| LK2[LiveKit Node 2<br/>:7880]
 
    C -.->|"TURN/UDP :3478"| LK1
turn:
  enabled: true
  domain: "turn.example.com"
  tls_port: 5349
  external_tls: true

Yük dengeleyici TLS’yi sonlandırır. external_tls: true LiveKit’e zaten şifresi çözülmüş trafik beklemesini söyler.


Port ve Güvenlik Duvarı Başvurusu

flowchart TB
    subgraph Internet["Internet"]
        C[Client]
    end
 
    subgraph FW["Firewall"]
        direction LR
        P443["443/TCP<br/>HTTPS + TURN/TLS"]
        P3478["3478/UDP<br/>TURN/UDP + STUN"]
        P7881["7881/TCP<br/>ICE/TCP"]
        P5349["5349/TCP<br/>TURN/TLS"]
        PRANGE["50000-60000/UDP<br/>RTC Media"]
    end
 
    subgraph Bedrud["Bedrud Server"]
        API[API Server]
        LK[LiveKit SFU]
    end
 
    C --> P443 --> API
    C --> P3478 --> LK
    C --> P7881 --> LK
    C --> P5349 --> LK
    C --> PRANGE --> LK
PortProtokolHizmetGerekliNotlar
443TCPHTTPS + TURN/TLSEvetAPI + web arayüzü. tls_port: 443 ise TURN/TLS de.
3478UDPTURN/UDP + STUNÖnerilirÇift amaçlı: STUN bağlama + TURN aktarma.
5349TCPTURN/TLSLB yoksaÖzel TURN/TLS portu. 443 portu kullanılıyorsa atlayın.
7881TCPICE/TCPÖnerilirUDP engellendiğinde ancak TLS gerekmediğinde geri dönüş.
50000-60000UDPRTC medyaEvetICE aday portları. Her katılımcı 2 port kullanır.
7880TCPLiveKit APIİçWebSocket sinyalleşme. Üretimde doğrudan açılmaz.

Minimum Güvenlik Duvarı Kuralları

Temel bağlantı için:

Allow TCP 443    (HTTPS + TURN/TLS)
Allow UDP 3478   (TURN/UDP + STUN)
Allow UDP 50000-60000  (RTC medya)

Maksimum uyumluluk için (kurumsal ağlar):

Also allow TCP 7881  (ICE/TCP)
Also allow TCP 5349  (TURN/TLS, 443 portu kullanılmıyorsa)

Test ve Hata Ayıklama

Tarayıcı: chrome://webrtc-internals

  1. Toplantıya katılmadan önce Chrome/Edge’de chrome://webrtc-internals sayfasını açın.
  2. Bir döküm oluşturun.
  3. Stats sekmesinde ICE candidate pairs arayın.
  4. Aday türleri bağlantı yolunu gösterir:
Aday türüAnlamı
hostYerel IP. Doğrudan arayüz.
srflx (sunucu yansımalı)STUN ile keşfedilen genel IP. Doğrudan P2P çalışıyor.
relayTURN aktarma aktif. Medya sunucudan geçiyor.

Aktif çift olarak relay adayları görürseniz TURN o bağlantıyı yönetiyor demektir.

LiveKit Client SDK Olayları

Tüm LiveKit SDK’ları bağlantı durumu olayları yayınlar:

room.on(RoomEvent.Connected, () => {
  console.log("Connected");
});
 
room.on(RoomEvent.Reconnecting, () => {
  console.log("Connection lost, reconnecting...");
});

Bağlantı istatistikleri için room.localParticipant.connectionQuality değerini denetleyin.

LiveKit Sunucu Günlükleri

livekit.yaml dosyasında günlük seviyesini hata ayıklamaya yükseltin:

logging:
  level: debug

Şu ifadeleri içeren günlük girdilerini arayın:

  • ICE - aday toplama durumu
  • TURN - aktarma ayırma olayları
  • relay - aktif aktarma bağlantıları

turnutils ile Manuel TURN Testi

coturn-utils paketini kurun, ardından TURN bağlantısını test edin:

turnutils_uclient -t -p 3478 -W devkey -u devkey turn.example.com
  • -t - TCP kullan
  • -p - TURN portu
  • Kimlik bilgilerini üretim değerleriyle değiştirin

Başarılı çıktı ayrılan aktarma adreslerini gösterir.


Sorun Giderme

BelirtiOlası NedenÇözüm
İstemciler bağlanamıyor, zaman aşımıTURN portları güvenlik duvarı tarafından engelliUDP 3478, TCP 5349, UDP 50000-60000 portlarını açın
TURN/TLS başarısızEksik veya uyuşmayan TLS sertifikasıcert_file/key_file yollarını doğrulayın. Sertifikanın domain ile eşleştiğini denetleyin.
TURN/TLS LB ile başarısızexternal_tls ayarlanmamışYapılandırmada external_tls: true ayarlayın.
Tek yönlü ses/videoAktarma port aralığı engellirelay_range_start ile relay_range_end arası UDP’yi açın.
Yüksek sunucu bant genişliğiNAT arkasında birçok istemci aktarma kullanıyorBeklenir. Sunucuyu ölçeklendirin veya aktarma kullanıcılarını azaltın.
relay adayları ama srflx bekleniyoruse_external_ip: falsertc.use_external_ip: true ayarlayın.
TURN etki alanı çözümlenmiyorDNS yanlış yapılandırılmışdig +short turn.example.com sunucunun genel IP’sini döndürmeli.
İstemciler kurumsal güvenlik duvarı arkasındaYalnızca 443 portuna izin veriliyorturn.tls_port: 443 ayarlayın. Sertifikanın geçerli olduğundan emin olun.
turn.enabled: true ama aktarma yokDoğrudan yol çalışıyor (iyi)TURN geri düşüştür. Aktarma yok = daha iyi. chrome://webrtc-internals ile doğrulayın.

Hızlı Tanı Kontrol Listesi

  1. dig +short <turn.domain> doğru genel IP’yi döndürüyor mu?
  2. Güvenlik duvarı UDP 3478, TCP 5349, UDP 50000-60000’e izin veriyor mu?
  3. tls_port: 443 veya 5349 güvenlik duvarı kurallarıyla eşleşiyor mu?
  4. cert_file ve key_file var ve okunabilir mi?
  5. Sertifika CN/SAN turn.domain ile eşleşiyor mu?
  6. rtc.use_external_ip: true ayarlanmış mı?
  7. LiveKit günlüklerinde TURN ile ilgili hata yok mu?

Ayrıca bakınız