−25%

Windows-ის წლიურ გადახდაზე, 31 ოქტომბრამდე. ტარიფებზე

EQVPS
დაწყება

VPS TURN სერვერისთვის (coturn) WebRTC-ისთვის

ზარებს, რომლებიც მკაცრ NAT-ს ვერ გადიან, TURN რეტრანსლატორი შველის. coturn სერვერზე საკუთარი IPv4-ით: პორტები, დროებითი მონაცემები, შემოწმებული კონფიგი.

თქვენი 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 ეხმარება კლიენტებს, რომლებიც მას პირდაპირ ვერ აღწევენ.
  • უსაფრთხოების მთელი მოდელი საიდუმლოზე დგას. შეინახეთ ის ფრონტენდის გარეთ და შეცვალეთ, თუ ოდესმე გაჟონავს.

დაკავშირებული

მზად ხართ განთავსებისთვის? გადაიხადეთ კრიპტოთი, KYC-ის გარეშე — ჩართული დაახლოებით წუთში.

განათავსეთ ახლა →

ხდკ

საერთოდ რატომ სჭირდება WebRTC ზარებს TURN სერვერი?

WebRTC მონაწილეების პირდაპირ დაკავშირებას ცდილობს და ჩვეულებრივ ახერხებს. როცა ორივე მხარე სიმეტრიული NAT-ის ან UDP-ის მჭრელი ფაიერვოლის მიღმაა — სასტუმროს Wi-Fi, საოფისე ქსელები, ზოგიერთი მობილური ოპერატორი, — პირდაპირი გზა არ არსებობს და ზარი ჩუმად ვერ ხერხდება. TURN სერვერი მედიას სწორედ ასეთი ზარებისთვის რეტრანსლირებს; ჩვეულებრივ ასახელებენ დაახლოებით ყოველ მეათე ზარს.

შეუძლია TURN-ს NAT ტარიფზე მუშაობა?

არა. კლიენტები UDP და TCP 3478-ს და რეტრანსლაციის პორტების დიაპაზონს უკავშირდებიან, NAT ტარიფი კი გარედან მხოლოდ თქვენს SSH პორტს იღებს. საჭიროა ტარიფი საკუთარი IPv4-ით.

რამდენ ტრაფიკს ხარჯავს?

ყოველი რეტრანსლირებული ნაკადი სერვერზე ორჯერ გადის — ერთი მხრიდან შიგნით და მეორე მხარეს გარეთ. ვიდეოზარი ერთი ერთზე, თითო მიმართულებით 1–2 Mbit/s, სერვერზე რამდენიმე Mbit/s-ს შეადგენს. CPU და RAM ამას თითქმის ვერ ამჩნევენ; ნამდვილი ჭერი 1 Gbit/s პორტია.

რატომ არ ჩავწერო უბრალოდ მუდმივი სახელი და პაროლი აპლიკაციაში?

იმიტომ, რომ ბრაუზერის JavaScript-ში ყველაფერი საჯაროა, ცნობილი პაროლის მქონე TURN სერვერი კი მთელი ინტერნეტისთვის უფასო რეტრანსლატორია. use-auth-secret-ით თქვენი ბექენდი ვადიან მონაცემებს გასცემს, ხელმოწერილს საიდუმლოთი, რომელსაც ბრაუზერი ვერასოდეს ხედავს.

მჭირდება TLS 5349 პორტზე?

ეხმარება ქსელებში, რომლებიც UDP-ს ბლოკავენ და ჩვეულებრივ TCP-ზე მკაცრები არიან. დაამატეთ, როცა ჩვეულებრივი TURN უკვე მუშაობს: მიეცით coturn-ს სერტიფიკატი TURN სერვერის სახელზე და გახსენით 5349/tcp. TLS-ით რეტრანსლაციაც შევამოწმეთ.

კომენტარები

ჯერ არ არის კომენტარები. იყავით პირველი.

დატოვეთ კომენტარი

კომენტარები მოდერირდება გამოჩენამდე.