−25%

Windows-এর বার্ষিক পেমেন্টে, ৩১ অক্টোবর পর্যন্ত। প্ল্যান দেখুন

EQVPS
শুরু করুন

WebRTC-এর জন্য TURN সার্ভার (coturn)-এর VPS

কড়া NAT-এর পেছনে ব্যর্থ কলের জন্য TURN রিলে দরকার। নিজস্ব IPv4-সহ সার্ভারে coturn: পোর্ট, মেয়াদি ক্রেডেনশিয়াল, পরীক্ষিত কনফিগ আর মানানসই প্ল্যান।

আপনার 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)
আরও বেশি, বা অ্যাপ সার্ভারের পাশে TURNSmall-IP: 4 vCPU, 4 GB, 35 GB (মাসে $16)

প্ল্যানটা নিজস্ব IPv4-সহ হতেই হবে — TURN পুরোটাই বহু পোর্টে আসা সংযোগের ব্যাপার, আর NAT প্ল্যান বাইরে থেকে কেবল SSH গ্রহণ করে। আমাদের নিজস্ব IP-র প্ল্যানে পাবলিক ঠিকানা সরাসরি সার্ভারের ইন্টারফেসে থাকে, তাই coturn external-ip লাইন ছাড়াই সেটা খুঁজে পায়। সার্ভার আপনার ব্যবহারকারীদের কাছে রাখুন: জার্মানি বা ফিনল্যান্ড, অর্ডারের সময় প্রাপ্যতা দেখা যায়। আপনার কাছে গুরুত্বপূর্ণ হলে ক্রিপ্টোতে পেমেন্ট, KYC ছাড়া।

যেসব পোর্ট খুলতে হবে: 3478 UDP ও TCP, রিলে মিডিয়ার জন্য 49152–65535 UDP, আর TLS যোগ করলে 5349 TCP।

ইনস্টল ও কনফিগার

Ubuntu 24.04 বা Debian 12-এ root হিসেবে:

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

urls তালিকায় turns:turn.example.com:5349?transport=tcp যোগ করুন। সার্টিফিকেট স্বল্পমেয়াদি, তাই কপি করার ধাপটি certbot-এর deploy hook-এ রাখুন — নইলে প্রথম নবায়নেই TLS নিঃশব্দে ভেঙে যাবে।

জেনে রাখা ভালো

  • TURN খারাপ সংযোগকে ভালো করে না। এটা একটা হপ যোগ করে, তাই যাদের দরকার তাদের কাছে সার্ভার রাখুন।
  • আপনি SFU চালালে — যেমন Jitsi-র videobridge — সেটা আলাদা অংশ। TURN সেই ক্লায়েন্টদের সাহায্য করে যারা সরাসরি সেখানে পৌঁছাতে পারে না।
  • পুরো নিরাপত্তা ব্যবস্থা সিক্রেটের ওপর দাঁড়িয়ে। এটাকে ফ্রন্টএন্ড থেকে দূরে রাখুন, আর কখনো ফাঁস হলে বদলে দিন।

সম্পর্কিত

স্থাপন করতে প্রস্তুত? ক্রিপ্টোতে পরিশোধ করুন, KYC ছাড়াই — প্রায় এক মিনিটে লাইভ।

এখনই ডেপ্লয় করুন →

সাধারণ প্রশ্ন

WebRTC কলের TURN সার্ভার আদৌ লাগে কেন?

WebRTC অংশগ্রহণকারীদের সরাসরি যুক্ত করার চেষ্টা করে, আর সাধারণত সফল হয়। দুই দিকই যখন symmetric 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 দিয়ে আপনার ব্যাকএন্ড মেয়াদ ফুরোনো ক্রেডেনশিয়াল দেয়, এমন সিক্রেট দিয়ে স্বাক্ষর করা যা ব্রাউজার কখনো দেখে না।

পোর্ট 5349-এ কি TLS লাগবে?

যেসব নেটওয়ার্ক UDP আটকায় আর সাধারণ TCP-তে কড়া, সেখানে কাজে দেয়। সাধারণ TURN চালু হলে তারপর যোগ করুন: coturn-কে TURN হোস্টনেমের সার্টিফিকেট দিন আর 5349/tcp খুলুন। আমরা TLS-এর ওপর রিলেও পরীক্ষা করেছি।

মন্তব্য

এখনো কোনো মন্তব্য নেই। প্রথম হোন।

একটি মন্তব্য দিন

মন্তব্য প্রকাশের আগে মডারেট করা হয়।