Browsed by
Etiket: TURN

coTURN Kurulum ve Yapılandırma Adımları

coTURN Kurulum ve Yapılandırma Adımları

Bu blog sayfası, SIP veya WebRTC projeleriniz (Jitsi Meet gibi) için güvenlik duvarlarının veya proxy’lerin arkasındaki kullanıcıların bağlanmasına izin vermek için coTURN sunucusunun kurulum ve yapılandırma adımları kapsar.

TURN Nedir?

TURN, Traversal Using Relays around NAT‘ın kısaltmasıdır. STUN’a benzer şekilde, Internet’teki eşler arasında iletişim kurmak için olası yolların keşfedilmesine yardımcı olmak için kullanılan bir ağ protokolü / paket biçimidir (IETF RFC 5766). Paketleri eşler arasında aktarmak için ortak bir röle sunucusu kullanması nedeniyle STUN’dan farklıdır. TURN, başka bir seçenek olmadığında medya paketlerini eşler arasında ulaştırmak için bir ara sunucu olarak kullanılır. TURN’ün kullanılması durumunda artık bağlantı p2p olmayacağından sunucu kaynakları tüketilir ve eşler arası bağlantıda fazladan bir hop eklenmesi nedeniyle gecikme süresi (latency) artar.

TURN’ü eşlerden birinin simetrik bir NAT’ın arkasında, diğeri ise simetrik bir NAT’ın veya port tabanlı NAT’ın arkasında olduğunda kullanmanız gerekir. Bu durum genelde toplam bağlantıların %10’unda karşımıza çıkar. Geri kalan bağlantıların çoğunda STUN tek başına yeterlidir.

CoTURN Sunucusunu Yüklemek

Ses / Video tabanlı servisler, WebRTC için kullanılan çeşitli UDP portlarını kullanır. NAT arkasındaki ya da sunucunuza doğru UDP bağlantılarını kısıtlayan bir güvenlik duvarı kullanımının olduğu bazı ağlarda kullanıcılar medya sunucunuzla UDP üzerinden bağlantı kuramayabilir.

TURN protokolü, istemciyi TURN sunucusuna bağlanmaya zorlayarak UDP iletişim akışlarının NAT veya güvenlik duvarlarını atlamasına izin vermek ve ardından TURN sunucusunun hedeflerine kendi adına bağlanması için tasarlanmıştır.

Kontrolünüz altında bir TURN sunucusu kullanmak, multimedya uygulamanızla olan bağlantıların başarısını ve aynı zamanda bir proxy gibi davrandığından kullanıcı gizliliğini artırır; böylece eşlerin IP adres bilgilerini artık halka açık bir STUN sunucusuna göndermemiş olursunuz.

Gerekli Donanım

TURN protokolü çok fazla CPU veya RAM’e ihtiyaç duymaz. Buna ek olarak, yalnızca bağlantı kurulumu sırasında (STUN için) kullanıldığında bant genişliği gereksinimleri yüksek değildir. TURN sunucunuz bir medya proxy olarak kullanıldığında eşlerin gönderdiği akışlar kadar giriş ve çıkış bant genişliği ihtiyacı olacaktır. Orta sayıda bağlantı için, tek bir küçük VPS yapılandırması genellikle yeterlidir. CoTURN kurulum için kaynak önerilerimi aşağıda bulabilirsiniz:

  • En az iki vCPU
  • 4GB RAM.
  • 20GB HDD. SSD kullanılabilir, ancak zorunlu değildir.
  • Ağ performansı:
    • Düşük jitter (30ms’den az)
    • Düşük gecikme süresi (latency) (150ms’den az)
    • Her iki yöndeki medya akışlarını karşılayabilmek için yeterli bant genişliği.

Sunucunun NAT arkasında olmasında (Amazon EC2’de olduğu gibi) bir sorun yoktur, ancak herhangi bir porta (TCP 80 & 443, UDP 3478, 10000-20000) gelen tüm UDP ve TCP bağlantılarının coTURN sunucusuna iletilmesi gerekmektedir.

coTURN Gerekli Yazılım ve Kurulum Adımları

coTURN için Debian Netinst veya Ubuntu ile minimal bir sunucu kurulumu işinizi görecektir. CoTURN yazılımı TCP 443 portunu kullandığından, coTURN’ün yükleneceği sunucuda çalışan başka bir web uygulaması olamaz. (farklı bir portta olabilir tabi :))

coTURN, Debian ve Ubuntu repolarında mevcuttur ve apt-get ile kurulabilir:

$ sudo apt-get update
$ sudo apt-get install coturn

coTURN konfigürasyonu tamamlanıncaya kadar coTURN’un otomatik olarak başlamayacağını lütfen unutmayın. Konfigürasyon adımlarını aşağıda bulabilirsiniz.

CoTURN İçin DNS Girişi

CoTURN sunucunuzun harici IP adresini çözen tam bir alanı adı (FQDN) ayarlamanız gerekir. Aynı zamanda bir TLS sertifikası oluşturmak için de bu alanı adını kullanacaksınız.

TLS Sertifikaları Üretmek

Ücretsiz bir TLS sertifikası oluşturmak için Let’s Encrypt’i kullanan certbot‘u kullanabilirsiniz. Certbot’u kurmak için coTURN sunucunuzda aşağıdaki komutları girin:

$ sudo add-apt-repository ppa:certbot/certbot 
$ sudo apt-get update 
$ sudo apt-get install certbot

Daha sonra, TURN sunucunuza sertifikayı oluşturmak için alan adı adresinizi kullanarak aşağıdaki gibi bir certbot komutu çalıştırabilirsiniz:

$ sudo certbot certonly --standalone --preferred-challenges http \
    --deploy-hook "systemctl restart coturn" \
    -d turn.fatiherikci.com

Certbot komutunun mevcut sürümleri varsayılan olarak sertifikalarınızı otomatik olarak yeniler. Certbot sertifikayı yenilediğinde, coTURN servisini yeniden başlatacağını, böylece coTURN’nin güncellenmiş sertifika dosyalarını kullanmaya başlayacağını unutmayın. Bu işlem, sunucunuzun aktif olarak üzerinden geçirdiği TURN bağlantılarında kesintiye neden olacaktır. Bu durumu engellemek için isterseniz, sertifika yenileme zamanlamasını değiştirebilir veya otomatik yenilemeyi devre dışı bırakabilirsiniz.

CoTURN’ü Yapılandırmak

coTURN yapılandırması /etc/turnserver.conf dosyasında depolanır. Bu dosya için çok fazla seçenek mevcuttur ve bu seçenekler ile ilgili açıklamaları yorum satırlarında bulmanız mümkündür. Aşağıdaki örnekte, önerilen ayarlar olarak yorumların yanı sıra, özelleştirmenin gerekli olduğu yerlerde notların bulunduğu örnek bir yapılandırmayı bulabilirsiniz.

/etc/turnserver.conf dosyasının içeriğini aşağıdaki dosyayla değiştirebilir ve aşağıdaki değişiklikleri yapabilirsiniz:

  • turn.fatiherikci.com adresini TURN sunucunuzun ana bilgisayar adıyla değiştirin.
  • Diğer kalın harfler ile belirtilen satırları kendi sunucunuza göre değiştirin.

Aşağıda bir örnek yapılandırma dosyası görebilirsiniz:

server-name=turn.fatiherikci.com
realm=turn.fatiherikci.com
cert=/etc/letsencrypt/live/turn.fatiherikci.com/cert.pem
pkey=/etc/letsencrypt/live/turn.fatiherikci.com/privkey.pem
fingerprint 
listening-ip=0.0.0.0 
external-ip= 1.2.3.4/192.168.0.1 #ya da sadece dış IP yazın
listening-port=3478 
min-port=10000 
max-port=20000 
log-file=/var/log/turnserver.log 
verbose 
user=myusername:mypassword 
lt-cred-mech

Konfigürasyonu tamamladıktan sonra coTURN’ü çalıştırmak için aşağıdaki komutu kullanabilirsiniz:

$ systemctl start ​​coturn

CoTURN’u Servis Olarak Çalıştırmak

Debian / Ubuntu için olan coTURN paketini başlangıçta etkinleştirmek için /etc/default/coturn dosyasını açarak aşağıdaki satırın commentini açın:

TURNSERVER_ENABLED = 1

Bu kadar! coTURN kurulum adımlarımız tamamlandı. Artık çalışır durumda bir TURN sunucunuz var!

TURN Sunucunuzu Test Etmek

CoTURN sunucunuzu test etmek için Trickle-Ice test aracını kullanabilirsiniz. Trickle ICE’ın web sayfasına gidin ve aşağıdakileri girin:

  • STUN veya TURN URI: turn:PublicIPAdresiniz:3478
  • TURN username: kullanıcıadı
  • TURN password: şifre

Ardından Add Server düğmesini ve ardından Gather Candidates düğmesini tıklayın. Her şey yolunda giderse, sonuç olarak Done görmelisiniz.

WebRTC Nedir?

WebRTC Nedir?

WebRTC adını son zamanlarda oldukça fazla duymaya başladık. Aslında çok da yeni bir teknoloji değil, 2011 yılından beri kullanıma açık olan WebRTC, eş zamanlı olarak medya iletişimi (sesli ve/veya görüntülü) sağlayan bir teknolojidir. Pek çok avantaja sahip olan WebRTC’nin en büyük özelliği ise ek bir yazılım gerektirmeden bir çok popüler tarayıcı üzerinde doğrudan çalışabilmesidir.

WebRTC’nin açılımı Web Based Real Time Communication‘dır.  HTML5 ve Javascript API’leri kullanarak multimedya uygulamaları tasarlanabilir.

WebRTC’de kullanılan iletişim biçimini eşler arası (peer-to-peer) olarak tanımlayabiliriz. Bu iletişim doğrudan eşler arasında olduğundan her hangi bir medya sunucusuna ihtiyaç duymazsınız. WebRTC ücretsizdir ve BSD lisansına sahiptir, yani ücretsiz olarak WebRTC uygulamaları geliştirebilirsiniz. (Örneğin bu adreste WebRTC ile yapılmış bir video konferans sanal odasına girip görüşme yapabilirsiniz)

WebRTC Destekleyen Tarayıcılar

Günümüzde aşağıdaki tarayıcılar WebRTC desteklemektedir:

  • PC & MAC
    • Microsoft Edge 12+
    • Google Chrome 28+
    • Mozilla Firefox 22+
    • Safari 11+
    • Opera 18+
    • Vivaldi 1.9+
  • Android
    • Google Chrome 28+
    • Mozilla Firefox 24+
    • Opera Mobile 12+
  • iOS
    • MobileSafari/WebKit (iOS 11+)
  • Chrome OS
  • Firefox OS
  • BlackBerry 10
  • Tizen 3.0

WebRTC Bileşenleri

WebRTC’de 3 ana bileşen vardır:

1. MediaStream API

MediaStream API, javascript kullanarak kullanıcıdaki kamera, mikrofon veya ekrana erişim fonksiyonunlarını sağlar.

2. RTCPeerConnection API

RTCPeerConnection API, NAT traversal, Codec işleme, karşılıklı SDP anlaşması, medya iletimi ve eşler arasındaki güvenli bağlantı fonksiyonlarını sağlar.

3. RTCDataChannel API

RTCDataChannel API, eşler arasında çift yönlü veri aktarım kanalları kurulması fonksiyonlarını sağlar.

Eşler Arası Bağlantının Kurulması

Sinyaleşme, eşler arasındaki bağlantıyı oluşturan bir süreçtir. WebSocket, XMPP, SIP veya herhangi bir mekanizmayla elde edilebilir. WebRTC teknolojisi, RTP, STUN, SIP ve ICE gibi önemli protokollerden yararlanır.

WebRTC Sinyalleşme Süreci

Session Description Protocol (SDP)

SDP olarak da bilinir, Bir bağlantı kurmadan önce eşler arasındaki medya yeteneklerini (ses kodekleri, IP ve port bilgileri vs.) birbirlerini iletmek ve karşılıklı ortak noktada buluşmak için kullanılan bir protokoldür.

Interactive Connectivity Establishment (ICE)

ICE, NAT traversal mekanizması için kullanılan bir frameworktür. ICE mevcut tüm adayları toplar (yerel IP adresleri, dönüş IP adresleri STUN ve iletilen IP adresleri – TURN). Toplanan tüm adresler daha sonra SDP aracılığıyla uzak eşlere gönderilir.

STUN Sunucusu

STUN sunucusu, eşlerin genel (public) IP adreslerini, kullandıkları NAT türlerini ve NAT tarafından belirlenen yerel port bilgisi ile ilişkilendirilen Internet tarafı port bilgisi arasındaki ilişkiyi bulmalarını sağlar.

TURN Sunucusu

TURN sunucusu STUN kullanımı mümkün olmadığında, medya akışlarını bir TURN sunucusu üzerinden iletmek için (proxy gibi düşünebilirsiniz) kullanılır.

WebRTC her zaman eşler arası (P2P) değildir, çoklu iletişim durumlarında ise (ör. video konferans) farklı çözümler mevcuttur. Şimdi bunlara bir göz atalım.

Çoklu Nokta İletişim Türleri

1. Mesh

Mesh ağında, tüm eşler akışlarını doğrudan ağdaki diğer bağlı eşlere ayrı ayrı gönderir.

Mesh Topolojisinde Tüm Eşler Birbirleri İle İletişim Halindedir

Bu yapı tamamen dağıtık bir yapı olduğundan merkezde her hangi bir medya sunucusu bulunmasına gerek yoktur. Mesh yapısının dezavantajı ise yüksek bant genişliği kullanımıdır. Mesh yapısı kullanılan bir çoklu video görüşmesinde her kullanıcı 1 Mbps lik bir akış ürettiiği taktirde kullanıcı başına alınan ve gönderilen veri miktarı 4 er Mbps olacaktır.

2. SFU

SFU, Selective Forwarding Unit (Seçici İletme Birimi) anlamına gelir. Bir SFU gelen medya akışlarını tüm kullanıcılardan alır ve daha sonra hangi kullanıcılara gönderileceğine karar vererek iletimini sağlar.

SFU Merkezden Tüm Eşlere Ayrı Ayrı Aktarım Yapar

Bu yapıda her kullanıcı kendi ürettiği medya akışını SFU sunucusuna iletir. SFU sunucusu kim hangi akışı istiyorsa ona gönderebilir. Bu sayede bant genişliği daha efektif kullanılmış olur. Mesh örneğinde olduğu gibi burada da her kullanıcı 1 Mbps lik bir akış üretirse kullanıcı başına toplam gönderim miktarı 1 Mbps, toplam alım miktarı ise maksimum 4 Mbps olacaktır.

3. MCU

MCU, Multipoint Conferencing Unit (Çok Noktalı Konferans Birimi) anlamına gelir. Bir MCU gelen medya akışlarını tüm kullanıcılardan alır, hepsini çözer (decode), yeni bir düzen oluşturur ve tüm kullanıcılara tek bir akış olarak gönderir.

MCU Tüm Eşlerin Medyalarını Birleştirerek Eşlere Tek Bir Akış Gönderir

Bu yapının SFU dan farkı ise her kullanıcıya kombine tek bir akış gönderileceği için kullanıcı başı toplam gönderim ve alım miktarı 1 er Mbps olacaktır. Bu yapının da dezavantajı tahmin edebileceğiniz üzere merkezde bulunan yüksek işlem gücüne sahip olan MCU maliyetidir.