თქვენი WebRTC აპლიკაცია თქვენს Wi-Fi-ზე მუშაობს და არ მუშაობს იმ ერთ კლიენტთან, რომელიც სასტუმროდან რეკავს. მედიას „წერტილი-წერტილი“ ორ მხარეს შორის გზა სჭირდება; როცა ორივე მკაცრი NAT-ის მიღმაა ან ფაიერვოლი UDP-ს ჭრის, გზა არ არის და ზარი უბრალოდ არ უკავშირდება. შეცდომას ვერავინ ხედავს — მხოლოდ დაუსრულებელ „დაკავშირება…“-ს.
TURN სერვერი სწორედ ასეთი ზარების სათადარიგო გზაა: ორივე მხარე მას მედიას უგზავნის, ის კი რეტრანსლირებს. თუ აპლიკაციაში ვიდეოს ან ხმას აშენებთ, გუნდისთვის Matrix-ს ან Jitsi-ს ინახავთ ან თამაშისთვის ხმოვან ჩატს აკეთებთ — ის გჭირდებათ. coturn სტანდარტული ღია რეალიზაციაა და მსუბუქია.
რომელი ტარიფი
TURN CPU-სა და მეხსიერებას თითქმის არ ტვირთავს. ის ტრაფიკს ხარჯავს: ყოველი რეტრანსლირებული ნაკადი სერვერზე ორჯერ გადის, შესვლისას და გასვლისას. ჩვენს ტარიფებზე ტრაფიკი 1 Gbit/s სიჩქარით ულიმიტოა, ასე რომ კითხვაა, რამდენი რეტრანსლირებული ზარი მიდის ერთდროულად, და არა ის, რამდენს გადაგახდევინებენ.
| ერთდროულად რეტრანსლირებული ზარები | ტარიფი |
|---|---|
| რამდენიმე — გუნდი, პატარა აპლიკაცია | Nano-IP: 2 vCPU, 1 GB, 15 GB ($8/თვე) |
| ათეულობით | Micro-IP: 2 vCPU, 2 GB, 25 GB ($10/თვე) |
| მეტი, ან TURN აპლიკაციის სერვერის გვერდით | Small-IP: 4 vCPU, 4 GB, 35 GB ($16/თვე) |
ტარიფი საკუთარი IPv4-ით უნდა იყოს — TURN მთლიანად შემომავალ კავშირებს ეხება ბევრ პორტზე, NAT ტარიფები კი გარედან მხოლოდ SSH-ს იღებენ. ჩვენს ტარიფებზე საკუთარი IP-ით საჯარო მისამართი პირდაპირ სერვერის ინტერფეისზეა, ამიტომ coturn მას external-ip ხაზის გარეშე პოულობს. სერვერი მომხმარებლებთან ახლოს დადგით: გერმანია ან ფინეთი, ხელმისაწვდომობა შეკვეთისას ჩანს. გადახდა კრიპტოთი, KYC-ის გარეშე, თუ ეს თქვენთვის მნიშვნელოვანია.
რომელი პორტები გახსნათ: 3478 UDP და TCP, 49152–65535 UDP რეტრანსლირებული მედიისთვის და 5349 TCP, თუ TLS-ს ამატებთ.
ინსტალაცია და გამართვა
root-ით Ubuntu 24.04-ზე ან Debian 12-ზე:
apt install -y coturn
ip -4 addr # თქვენი საჯარო IP ინტერფეისზე უნდა ჩანდეს
ჩაწერეთ კონფიგურაცია ახალი საერთო საიდუმლოთი:
SECRET=$(openssl rand -hex 32)
cat > /etc/turnserver.conf <<EOF
listening-port=3478
fingerprint
use-auth-secret
static-auth-secret=$SECRET
realm=turn.example.com
min-port=49152
max-port=65535
no-cli
no-multicast-peers
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.168.0.0-192.168.255.255
EOF
echo "$SECRET" # ეს მნიშვნელობა თქვენს ბექენდს სჭირდება
systemctl restart coturn
ufw allow 22/tcp && ufw allow 3478 && ufw allow 49152:65535/udp && ufw enable
ნუ გამოტოვებთ denied-peer-ip ხაზებს. მათ გარეშე ნებისმიერს, ვისაც ვალიდური მონაცემები აქვს, შეუძლია თქვენი რეტრანსლატორით კერძო მისამართებამდე მიაღწიოს — მათ შორის თავად სერვერის შიდა მხარეს არსებულ სერვისებამდე. შევამოწმეთ: ამ ხაზებით კერძო მისამართზე რეტრანსლაცია „403 Forbidden IP“-ით უარიყოფა.
ვადიანი მონაცემები
use-auth-secret-ით coturn იღებს მომხმარებლის სახელს, რომელიც ვადის გასვლის დროს შეიცავს, და პაროლს, რომელიც მისი HMAC-ია. მათ თქვენი ბექენდი აგენერირებს; საიდუმლო სერვერულ მხარეს არასოდეს ტოვებს. Node.js-ზე:
const crypto = require("crypto");
// დროებითი TURN მომხმარებელი/პაროლი (TURN REST API სქემა, რომელსაც coturn use-auth-secret-ით იგებს).
function turnCredentials(secret, user, ttlSeconds = 3600) {
const username = `${Math.floor(Date.now() / 1000) + ttlSeconds}:${user}`;
const credential = crypto.createHmac("sha1", secret).update(username).digest("base64");
return { username, credential };
}
console.log(JSON.stringify(turnCredentials(process.env.TURN_SECRET, "alice")));
ბრაუზერში ბექენდს ახალი წყვილი სთხოვეთ და RTCPeerConnection-ს გადაეცით:
const { username, credential } = await fetch("/api/turn-credentials").then((r) => r.json());
const pc = new RTCPeerConnection({
iceServers: [
{ urls: "stun:turn.example.com:3478" },
{
urls: ["turn:turn.example.com:3478?transport=udp", "turn:turn.example.com:3478?transport=tcp"],
username,
credential,
},
],
});
შემოწმება
თავად სერვერზე, იმავე სქემით openssl-ის გამოყენებით (ის ზუსტად იმავე პაროლს იძლევა, რასაც Node.js-ის კოდი — შევადარეთ):
U="$(( $(date +%s) + 3600 )):test"
P=$(echo -n "$U" | openssl dgst -binary -sha1 -hmac "$SECRET" | base64)
turnutils_uclient -y -n 10 -u "$U" -w "$P" YOUR_SERVER_IP
ბოლოს უნდა დაინახოთ „Total lost packets 0“. არასწორი პაროლით კლიენტი „Cannot complete Allocation“-ზე ჩერდება — ეს სერვერია, რომელიც თავის საქმეს აკეთებს.
ნამდვილი Chromium-იდანაც შევამოწმეთ: iceTransportPolicy: "relay"-ით და ახალი მონაცემებით ბრაუზერმა სერვერისგან relay კანდიდატები მიიღო; ცუდი პაროლით — არცერთი. თუ თქვენი სქემის ასე შემოწმება გინდათ, ეს ოფცია ერთი წუთით ჩართეთ — ის ყოველ ზარს TURN-ზე გავლას აიძულებს.
TLS, თუ საჭიროა
ზოგიერთი ქსელი UDP-ს ბლოკავს და ჩვეულებრივ TCP-ზე ჭირვეულია; TLS-ზე TURN მათ უმეტესობას გადის. აიღეთ სერტიფიკატი turn.example.com-ზე (certbot გამოდგება). მისი ფაილების წაკითხვა მხოლოდ root-ს შეუძლია, coturn კი turnserver მომხმარებლით მუშაობს, ამიტომ მიეცით coturn-ს საკუთარი ასლი:
mkdir -p /etc/coturn
cp /etc/letsencrypt/live/turn.example.com/fullchain.pem /etc/letsencrypt/live/turn.example.com/privkey.pem /etc/coturn/
chown turnserver: /etc/coturn/*.pem && chmod 640 /etc/coturn/privkey.pem
cat >> /etc/turnserver.conf <<'EOF'
tls-listening-port=5349
cert=/etc/coturn/fullchain.pem
pkey=/etc/coturn/privkey.pem
EOF
systemctl restart coturn && ufw allow 5349/tcp
დაამატეთ turns:turn.example.com:5349?transport=tcp სიაში urls. სერტიფიკატები ხანმოკლეა, ამიტომ კოპირება certbot-ის deploy hook-ში ჩასვით — თორემ TLS პირველივე განახლებისას ჩუმად გაფუჭდება.
სასარგებლოა იცოდეთ
- TURN ცუდ კავშირს კარგს ვერ გახდის. ის ერთ ნახტომს ამატებს, ამიტომ სერვერი იმათთან ახლოს დადგით, ვისაც სჭირდება.
- თუ SFU გაქვთ — მაგალითად, videobridge Jitsi-ში, — ეს ცალკე ნაწილია. TURN ეხმარება კლიენტებს, რომლებიც მას პირდაპირ ვერ აღწევენ.
- უსაფრთხოების მთელი მოდელი საიდუმლოზე დგას. შეინახეთ ის ფრონტენდის გარეთ და შეცვალეთ, თუ ოდესმე გაჟონავს.
დაკავშირებული
- VPS Jitsi Meet-ისთვის — ვიდეოზარები საკუთარ სერვერზე
- საკუთარი Matrix Synapse — Matrix-ში ზარებსაც სჭირდება TURN სერვერი
- VPS საიტისთვის საკუთარ IP-ზე — აპლიკაცია, რომელიც მონაცემებს გასცემს
- როგორ დავაყენოთ ufw ფაიერვოლი
კომენტარები
ჯერ არ არის კომენტარები. იყავით პირველი.