SSD Nodes Learn 🎉 VPS $5.50/माह से
गाइड Matt Connorलेखक: Matt Connor

अपना Self-hosted VoIP सर्वर: Asterisk और FreePBX सेटअप

अपने VPS पर Asterisk या FreePBX सेटअप करने का तरीका जानें। SIP ट्रंक कॉन्फ़िगरेशन, RTP पोर्ट रेंज और फायरवॉल नियमों के साथ टोल फ्रॉड से बचने की पूरी जानकारी यहाँ उपलब्ध है।

Self-hosted VoIP सर्वर क्या है

Self-hosted VoIP सर्वर एक SIP सर्वर है जो आपके द्वारा नियंत्रित VPS पर चलता है। इसमें आपकी कॉल किसी होस्टेड फोन सेवा के बजाय आपकी अपनी मशीन द्वारा रूट की जाती हैं। VoIP (voice over IP) आवाज को UDP packets के रूप में ले जाता है। SIP (session initiation protocol) वह सिग्नलिंग है जो कॉल को शुरू और समाप्त करती है। ऑडियो SIP के माध्यम से यात्रा नहीं करता है, और यही एक तथ्य नीचे दी गई अधिकांश समस्याओं का कारण बनता है।

एक कार्यशील सिस्टम चार भागों से बनता है।

  • PBX (private branch exchange) सॉफ्टवेयर। Asterisk इसके लिए सामान्य विकल्प है। यह एक्सटेंशन और डायलप्लान को संभालता है।
  • एंडपॉइंट्स। डेस्क फोन या सॉफ्टफोन जो यूजरनेम और सीक्रेट के साथ PBX पर रजिस्टर होते हैं।
  • SIP ट्रंक। एक प्रदाता के साथ भुगतान किया गया खाता जो आपको सार्वजनिक टेलीफोन नेटवर्क से जोड़ता है और आपको वास्तविक फोन नंबर किराए पर देता है।
  • मीडिया पाथ। RTP (real-time transport protocol) फ्लो जो ऑडियो को उनके अपने UDP पोर्ट्स पर ले जाते हैं।

PBX को self-host करने का मतलब फोन नंबरों को self-host करना नहीं है। नंबर एक कैरियर से आते हैं, और आप अभी भी प्रति नंबर और प्रति मिनट भुगतान करते हैं। आप कॉल रूटिंग, वॉइसमेल, रिकॉर्डिंग और एक्सटेंशन सूची के मालिक हैं। आप उस सेवा की सुरक्षा के भी मालिक हैं जिस पर लोग पैसे के लिए हमला करते हैं।

एक self-hosted VoIP सर्वर को किन ports की आवश्यकता होती है?

SIP signalling UDP और TCP के लिए port 5060 का उपयोग करती है, और SIP over TLS (transport layer security) के लिए port 5061 का उपयोग करती है। ये ports केवल call setup का कार्य करते हैं। प्रत्येक call का audio एक अलग UDP flow होता है, जिसे RTP range से लिए गए एक port पर भेजा जाता है। Asterisk एक sample rtp.conf के साथ आता है जो rtpstart=10000 और rtpend=20000 को सेट करता है, और compiled-in defaults 5000 और 31000 हैं। प्रत्येक call उस range से दो ports लेती है, एक RTP के लिए और एक RTCP (RTP control protocol) के लिए।

यह विभाजन वह जगह है जहाँ अधिकांश शुरुआती प्रयास विफल हो जाते हैं। Call connect हो जाती है, दोनों phones इसे answered दिखाते हैं, लेकिन किसी भी तरफ कुछ सुनाई नहीं देता, क्योंकि firewall 5060 को अनुमति देता है और हर RTP packet को drop कर देता है। Signalling और media अलग-अलग flows हैं, इसलिए उन्हें अलग firewall rules की आवश्यकता होती है। यदि यह अंतर आपके लिए नया है, तो कुछ भी open करने से पहले Linux पर ports और listening sockets कैसे काम करते हैं पढ़ना उपयोगी होगा।

Range को open करने से पहले उसे छोटा करें। बीस हजार ports एक छोटे सिस्टम की आवश्यकता से कहीं अधिक हैं। प्रति call दो ports का मतलब है कि दो सौ की range एक साथ सौ calls को कवर कर सकती है।

[general]
rtpstart=10000
rtpend=10200

इसे sudo asterisk -rx "core reload" के साथ लागू करें।

क्या आपको Asterisk इंस्टॉल करना चाहिए या FreePBX?

Asterisk एक इंजन है। आप इसे /etc/asterisk में टेक्स्ट फाइलों के माध्यम से कॉन्फ़िगर करते हैं और dialplan खुद लिखते हैं। FreePBX एक PHP और JavaScript में लिखा गया वेब इंटरफ़ेस है जो Asterisk के ऊपर काम करता है, आपके लिए वे फाइलें जेनरेट करता है, और voicemail तथा call queues के लिए मॉड्यूल जोड़ता है।

VPS पर जो अंतर मायने रखता है, वह मशीन का स्वामित्व है। अगस्त 2026 तक, आधिकारिक FreePBX 17 इंस्टॉलर एक vanilla Debian 12 सिस्टम की अपेक्षा करता है, और यह Asterisk, एक वेब सर्वर, एक डेटाबेस सर्वर और PHP इंस्टॉल करता है। यदि आप इसे ऐसी मशीन पर चलाएंगे जहाँ पहले से अन्य सेवाएं चल रही हैं, तो परिणाम संतोषजनक नहीं होगा। FreePBX को अपना अलग VPS दें।

wget https://github.com/FreePBX/sng_freepbx_debian_install/raw/master/sng_freepbx_debian_install.sh -O /tmp/sng_freepbx_debian_install.sh
sudo bash /tmp/sng_freepbx_debian_install.sh

इंस्टॉल लॉग /var/log/pbx/freepbx17-install.log में सेव होता है, जो स्क्रिप्ट के बीच में रुकने पर सबसे पहले देखने वाली जगह है।

FreePBX उन कॉन्फ़िगरेशन फाइलों का मालिक है जिन्हें वह जेनरेट करता है। यदि आप FreePBX बॉक्स पर pjsip.conf को मैन्युअल रूप से एडिट करते हैं, तो अगली बार जब GUI उस फाइल को लिखेगा, तो आपका बदलाव गायब हो जाएगा। FreePBX हाथ से लिखी गई कॉन्फ़िगरेशन के लिए _custom नाम वाली अलग फाइलें पढ़ता है, और उन्हें वह नहीं छेड़ता।

इसका सीधा और ईमानदार समझौता यह है: FreePBX आपको एक GUI देता है, और यह आपके फोन सिस्टम के लिए पब्लिक इंटरनेट पर एक लॉगिन पेज बना देता है। Raw Asterisk में कोई वेब इंटरफेस नहीं होता है, और हर सेटिंग एक documented directive है जिसे आप फाइल में पढ़ सकते हैं और git में रख सकते हैं। यदि आप FreePBX इंस्टॉल करते हैं, तो इसके वेब पोर्ट को अपने पते तक सीमित रखें या इसे VPN के माध्यम से एक्सेस करें, क्योंकि PBX का एडमिन GUI सीधे पैसों से जुड़ा एक लक्ष्य होता है।

वर्जन नोट, अगस्त 2026 के अनुसार सही: Asterisk 22 वर्तमान long term support रिलीज है, जिसे अक्टूबर 2024 में प्रकाशित किया गया था और यह अक्टूबर 2028 तक सुरक्षा फिक्स प्राप्त करेगा। Asterisk 23 स्टैंडर्ड रिलीज है। Ubuntu 24.04 अपने universe रिपॉजिटरी में Asterisk 20.6.0 प्रदान करता है।

Ubuntu 24.04 पर Asterisk इंस्टॉल करना

डिस्ट्रिब्यूशन पैकेज सबसे आसान तरीका है। Ubuntu इसे पैच करता है और यह अपने आप systemd के अंतर्गत शुरू हो जाता है।

sudo apt update
sudo apt install -y asterisk
sudo asterisk -rx "core show version"

सोर्स से बिल्ड करने पर आपको वर्तमान long term support रिलीज़ मिलती है।

sudo apt update
sudo apt install -y build-essential wget
cd /usr/local/src
sudo wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gz
sudo tar -xzf asterisk-22-current.tar.gz
cd asterisk-22.*
sudo contrib/scripts/install_prereq install
sudo ./configure
sudo make menuselect
sudo make -j"$(nproc)"
sudo make install
sudo make samples
sudo make config
sudo ldconfig

install_prereq install आपके डिस्ट्रिब्यूशन के लिए बिल्ड डिपेंडेंसीज़ को पुल करता है, और install_prereq test उन कमांड्स को प्रिंट करता है जिन्हें यह बिना किसी बदलाव के चलाएगा। make menuselect मॉड्यूल पिकर को खोलता है, जहाँ आप Codec Translators के अंतर्गत codec_opus को इनेबल करते हैं। make samples को केवल फ्रेश इंस्टॉल पर चलाएं, क्योंकि यह /etc/asterisk में सैंपल कॉन्फ़िगरेशन लिखता है। make config इनिट स्क्रिप्ट को /etc/init.d/asterisk पर इंस्टॉल करता है, और systemd इसे अपनी SysV कम्पैटिबिलिटी लेयर के माध्यम से चलाता है, इसलिए बाद में sudo systemctl enable --now asterisk काम करता है।

आपने जो भी तरीका अपनाया हो, sudo asterisk -rvvv रनिंग डेमन से जुड़ता है और आपको CLI देता है। वहाँ core show version चलाने पर आपको पता चलेगा कि आपने वास्तव में क्या इंस्टॉल किया है।

SIP trunk और एक extension को कॉन्फ़िगर करें

PJSIP वर्तमान Asterisk में SIP चैनल ड्राइवर है। इसका कॉन्फ़िगरेशन /etc/asterisk/pjsip.conf में रहता है और यह छोटे typed sections से बना होता है जो नाम के आधार पर एक-दूसरे को reference करते हैं। अलग-अलग प्रकार के sections का नाम एक हो सकता है, इसीलिए नीचे दिए गए प्रत्येक ब्लॉक को mytrunk कहा गया है।

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0

[mytrunk]
type=registration
outbound_auth=mytrunk
server_uri=sip:sip.example.com
client_uri=sip:1234567890@sip.example.com
retry_interval=60

[mytrunk]
type=auth
auth_type=userpass
username=1234567890
password=REPLACE_WITH_A_LONG_RANDOM_SECRET

[mytrunk]
type=aor
contact=sip:sip.example.com:5060

[mytrunk]
type=endpoint
context=from-trunk
disallow=all
allow=ulaw
outbound_auth=mytrunk
aors=mytrunk

[mytrunk]
type=identify
endpoint=mytrunk
match=sip.example.com

registration ऑब्जेक्ट REGISTER भेजता है जो आपके प्रदाता को बताता है कि कॉल कहाँ डिलीवर करनी है। identify ऑब्जेक्ट वह तरीका है जिससे प्रदाता से आने वाली कॉल को source address द्वारा इस endpoint से मिलाया जाता है, और एक प्रदाता आमतौर पर वहाँ लिस्ट करने के लिए कई पते प्रकाशित करता है। आउटबाउंड रजिस्ट्रेशन और endpoint जानबूझकर अलग-अलग ऑब्जेक्ट हैं: एक प्रदाता को बताता है कि आप कहाँ हैं, दूसरा यह तय करता है कि कॉल का क्या होगा।

एक डेस्क फोन को तीन और ऑब्जेक्ट की आवश्यकता होती है।

[6001]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=auth6001
aors=6001
direct_media=no

[auth6001]
type=auth
auth_type=userpass
username=6001
password=REPLACE_WITH_A_LONG_RANDOM_SECRET

[6001]
type=aor
max_contacts=1

direct_media=no Asterisk को मीडिया पाथ में रखता है। यदि आप इसे हटा देते हैं, तो Asterisk दोनों endpoints को सीधे एक-दूसरे को RTP भेजने के लिए कहेगा, जो तब विफल हो जाता है जब फोन होम राउटर पर NAT (network address translation) के पीछे होता है। secret को कभी भी extension नंबर के समान न रखें। अपस्ट्रीम सैंपल extension 6001 के लिए password=6001 का उपयोग करता है ताकि उदाहरण पढ़ने योग्य रहे, और स्कैनर्स सबसे पहले उसी पैटर्न को आज़माते हैं।

/etc/asterisk/extensions.conf में dialplan यह तय करता है कि प्रत्येक context को क्या करने की अनुमति है।

[internal]
exten => 6001,1,Dial(PJSIP/6001,20)
exten => _9X.,1,Dial(PJSIP/${EXTEN:1}@mytrunk,60)

[from-trunk]
exten => 1234567890,1,Dial(PJSIP/6001,20)
same => n,Hangup()

ये दो contexts एक सुरक्षा सीमा हैं। from-trunk प्रदाता से आने वाली कॉलों को संभालता है और केवल extension 6001 को रिंग कर सकता है। यह _9X. पैटर्न तक नहीं पहुँच सकता, इसलिए बाहर से आने वाली कॉल आपके ट्रंक के माध्यम से वापस बाहर डायल नहीं कर सकती। यदि आप contexts को मिला देते हैं, तो आप toll fraud का क्लासिक रास्ता बना लेंगे: एक अजनबी आपके नंबर पर कॉल करता है, आपका dialplan आपके अकाउंट पर बाहर डायल करता है, और आप उसका भुगतान करते हैं।

कॉन्फ़िगरेशन लागू करें और इसकी जाँच करें।

sudo asterisk -rx "pjsip reload"
sudo asterisk -rx "pjsip show registrations"
sudo asterisk -rx "pjsip show endpoints"

pjsip show registrations में mytrunk को Registered स्टेटस के साथ लिस्ट होना चाहिए। Rejected का मतलब है कि प्रदाता ने आपके क्रेडेंशियल्स को अस्वीकार कर दिया है। Unregistered का मतलब है कि आपका REGISTER अनुत्तरित जा रहा है, इसलिए इसके बाद firewall की जाँच करें।

SIP और RTP के लिए Firewall rules

Signalling और media को अलग-अलग तरीके से हैंडल करना आवश्यक है क्योंकि दोनों का जोखिम अलग होता है। port 5060 को केवल उन addresses तक सीमित रखें जिनका उपयोग आपका provider वास्तव में करता है और उन networks तक जहाँ आपके phones स्थित हैं।

sudo ufw allow proto udp from 203.0.113.10 to any port 5060
sudo ufw allow proto tcp from 203.0.113.10 to any port 5060
sudo ufw allow 10000:10200/udp
sudo ufw status verbose

RTP range को आप उतना सीमित नहीं कर सकते, क्योंकि media अक्सर signalling से अलग address से आता है। अपने provider से उनके media subnets के बारे में पूछें और यदि वे उन्हें प्रकाशित करते हैं, तो access को केवल उन्हीं तक सीमित रखें। range को केवल उतना ही बड़ा रखें जितनी आपके व्यस्ततम घंटे (busiest hour) के लिए आवश्यकता हो। Default policies, rule order और ufw model के अन्य पहलुओं को VPS के लिए ufw firewall basics guide में कवर किया गया है।

IPv6 की भी जाँच करें। यदि IPV6=no को /etc/default/ufw में set किया गया है, तो ufw IPv6 को बिल्कुल भी filter नहीं करता है। इस स्थिति में, :: पर bound daemon तक IPv6 के माध्यम से पहुँचा जा सकता है, जबकि ऊपर दिए गए नियम लागू नहीं होते। ufw के साथ IPv6 के लिए ports खोलना यह बताता है कि दोनों families में क्या अंतर है। अधिकांश providers आपको control panel में एक अलग network firewall भी देते हैं। वह firewall आपके packets के VPS तक पहुँचने से पहले लागू होता है, इसलिए एक port को दोनों स्थानों पर खुला होना चाहिए।

SIP brute force और toll fraud वैकल्पिक समस्याएँ नहीं हैं

यदि आप 5060 port को public address पर खोलते हैं, तो scans तुरंत शुरू हो जाते हैं। इसका पैटर्न स्थिर है: कई source addresses से REGISTER और INVITE requests आती हैं, जो सामान्य extension numbers और common secrets का उपयोग करके प्रयास करती हैं। Asterisk प्रत्येक विफलता को log करता है, और वह line इस आकार की होती है।

Request 'REGISTER' from '<sip:1000@198.51.100.20>' failed for '198.51.100.20:5060' (callid: 5f1a5c0d) - No matching endpoint found

यह विषय वास्तविक प्रयास के योग्य है क्योंकि इसमें पैसों का नुकसान होता है। एक चोरी हुए extension का उपयोग महंगे international calls करने के लिए किया जाता है, अक्सर premium rate numbers पर, जो attacker को उसका हिस्सा देते हैं। इसका बिल आपको चुकाना पड़ता है क्योंकि calls आपके credentials का उपयोग करके की गई थीं। यह प्रक्रिया machine speed पर चलती है और आमतौर पर रात भर चलती है।

छह controls वैकल्पिक नहीं, बल्कि अनिवार्य hardening हैं।

  • कभी भी ऐसा extension न बनाएँ जिसका secret उसका अपना number या कोई छोटा शब्द हो। openssl rand -base64 24 का उपयोग करके एक secret generate करें और उसे paste करें।
  • Anonymous inbound calls को बंद रखें। PJSIP डिफ़ॉल्ट रूप से अपरिचित calls को अस्वीकार करता है और उन्हें केवल तभी स्वीकार करता है यदि आप anonymous नाम का endpoint बनाएँ। ऐसा न करें।
  • Trunk context को किसी भी ऐसे context से अलग रखें जहाँ से dial out किया जा सकता है, जैसा कि ऊपर दिखाया गया है।
  • Signalling को source address के आधार पर सीमित करें, ufw और अपने provider के network firewall दोनों में।
  • अपने SIP trunk provider के साथ spending cap सेट करें और उन international destinations को disable करें जिन पर आप कभी call नहीं करते। यदि अन्य controls विफल हो जाते हैं, तो केवल यही control नुकसान को सीमित कर सकता है।
  • Asterisk log के विरुद्ध fail2ban चलाएँ।

Asterisk एक ही address से बार-बार unmatched requests आने पर security event भी उत्पन्न कर सकता है। pjsip.conf का [global] section unidentified_request_count लेता है, जो डिफ़ॉल्ट रूप से 5 है, और unidentified_request_period, जो डिफ़ॉल्ट रूप से 5 seconds है। साथ में, इनका अर्थ है कि पाँच seconds के भीतर एक ही address से पाँच unmatched requests आने पर एक security event उत्पन्न होता है, जिस पर fail2ban कार्रवाई कर सकता है।

fail2ban के साथ स्कैनर्स को बैन करें

fail2ban में पहले से ही एक asterisk जेल मौजूद है। यह 5060 और 5061 पोर्ट्स को कवर करता है, /var/log/asterisk/messages को पढ़ता है, और डिफ़ॉल्ट रूप से maxretry = 10 पर सेट रहता है। जब तक आप इसे /etc/fail2ban/jail.local में इनेबल नहीं करते, तब तक यह जेल बंद रहती है।

[asterisk]
enabled = true
maxretry = 5
findtime = 600
bantime = 86400
sudo systemctl restart fail2ban
sudo fail2ban-client status asterisk

एक सही परिणाम जेल की लॉग फ़ाइल और वर्तमान में बैन किए गए पतों की संख्या दिखाता है। एक पब्लिक 5060 पोर्ट पर, एक दिन के भीतर ही यह संख्या शून्य से ऊपर चली जाती है। दिया गया फ़िल्टर ऊपर बताए गए No matching endpoint found नोटिसों से मेल खाता है, और यह Asterisk की स्ट्रक्चर्ड SecurityEvent लाइनों को भी पहचानता है। ये इवेंट्स एक अलग लॉग चैनल पर जाते हैं जो /etc/asterisk/logger.conf में कमेंट आउट (commented out) किए गए हैं, इसलिए यदि आप उन्हें इस्तेमाल करना चाहते हैं तो उन्हें वहाँ इनेबल करें और फ़ाइल को जेल के logpath में जोड़ें।

[logfiles]
console => notice,warning,error
messages.log => notice,warning,error
security.log => security

लॉगर को sudo asterisk -rx "logger reload" के साथ रीलोड करें। फ़िल्टर में asterisk.service के लिए एक journalmatch भी शामिल है, इसलिए यदि आप लॉग फ़ाइलें नहीं रखना चाहते हैं तो journal बैकएंड भी काम करता है। इंस्टॉलेशन, jail.local संरचना और आपके द्वारा लॉक किए गए पते को अनबैन करने की प्रक्रिया Ubuntu 24.04 के लिए fail2ban गाइड में दी गई है।

दूरस्थ VPS पर लेटेंसी और कोडेक का चयन

विलंब (delay) भूगोल द्वारा निर्धारित होता है और आप इसे कॉन्फ़िगरेशन के माध्यम से समाप्त नहीं कर सकते। ITU-T G.114 सामान्य बातचीत के लिए एकतरफा विलंब को 150 ms से कम रखने की सलाह देता है और 400 ms तक के विलंब को अभी भी उपयोग योग्य मानता है। फोन से ऑडियो आपके VPS पर जाता है और फिर आपके ट्रंक प्रदाता (trunk provider) तक, इसलिए गलत क्षेत्र में स्थित VPS को यह यात्रा दो बार तय करनी पड़ती है। इसे फोन के पास या प्रदाता के पास रखें, और जब ये दोनों अलग-अलग दिशाओं में हों तो फोन के पास रखना बेहतर होता है, क्योंकि वह हिस्सा आमतौर पर कंज्यूमर इंटरनेट पर चलता है जहाँ जिटर (jitter) सबसे अधिक होता है।

कोडेक का चयन प्रति कॉल बैंडविड्थ निर्धारित करता है। यहाँ प्रत्येक कोडेक हर 20 ms में एक पैकेट भेजता है, जो प्रति सेकंड 50 पैकेट होते हैं, और प्रत्येक पैकेट ऑडियो पेलोड के ऊपर IP, UDP और RTP हेडर के 40 बाइट्स ले जाता है।

ChartBandwidth per concurrent call, one direction, 20 ms packets
The data behind this chart
[
  {
    "label": "G.711 ulaw",
    "payload_kbps": 64,
    "ip_kbps": 80
  },
  {
    "label": "G.722",
    "payload_kbps": 64,
    "ip_kbps": 80
  },
  {
    "label": "Opus at 24 kbps",
    "payload_kbps": 24,
    "ip_kbps": 40
  },
  {
    "label": "G.729",
    "payload_kbps": 8,
    "ip_kbps": 24
  }
]

G.711 ulaw अधिकांश ट्रंक पर डिफ़ॉल्ट होता है। इसका पेलोड 64 kbps है, और हेडर के साथ एक सक्रिय कॉल की लागत प्रत्येक दिशा में 80 kbps होती है। 24 kbps पर Opus की दर 40 kbps होती है, और G.729 ऑडियो गुणवत्ता और CPU समय की कीमत पर घटकर 24 kbps हो जाती है। ये आंकड़े मापन के बजाय हेडर गणना हैं: पेलोड दर प्लस प्रति सेकंड 50 पैकेट की दर से 40 बाइट प्रति पैकेट। ईथरनेट या VLAN फ्रेमिंग वायर पर थोड़ा और भार जोड़ते हैं।

ट्रांसकोडिंग (transcoding) में CPU खर्च होता है। यदि आपके फोन और आपका ट्रंक दोनों ulaw का उपयोग करते हैं, तो केवल ulaw की अनुमति दें और Asterisk ऑडियो को बिना किसी बदलाव के पास कर देगा। Opus लॉस-युक्त लिंक पर अच्छा प्रदर्शन करता है, लेकिन Opus और G.711 के बीच ट्रांसकोडिंग के लिए बाहरी codec_opus मॉड्यूल की आवश्यकता होती है, जिसे आप make menuselect में चुनते हैं और जो डिफ़ॉल्ट रूप से बिल्ड नहीं होता है।

क्या खराब होता है और आपको कौन सी स्ट्रिंग दिखाई देगी

कॉल कनेक्ट हो जाती है लेकिन किसी को कुछ सुनाई नहीं देता। RTP नहीं पहुँच रहा है। पुष्टि करें कि rtp.conf में दी गई रेंज वही है जिसे आपने फायरवॉल में खोला है, फिर कॉल करते समय sudo tcpdump -ni any udp portrange 10000-10200 के साथ पैकेट की निगरानी करें। यदि कोई पैकेट नहीं दिख रहा है, तो इसका मतलब है कि आपका फायरवॉल या आपके प्रदाता का नेटवर्क फायरवॉल उन्हें ड्रॉप कर रहा है।

ऑडियो केवल एक दिशा में है। एक पक्ष RTP को ऐसे पते पर भेज रहा है जो उसे प्राप्त नहीं कर सकता, यह पोर्ट की समस्या के बजाय पते की समस्या है। यदि आपके VPS का सार्वजनिक पता सीधे उसके इंटरफेस पर है, तो NAT हैंडलिंग की आवश्यकता नहीं है। यदि प्रदाता VPS को वन-टू-वन पब्लिक मैपिंग के साथ एक निजी पता देता है, तो ट्रांसपोर्ट पर सार्वजनिक पता सेट करें और local_net में अपनी निजी रेंज को सूचीबद्ध करें।

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
local_net=10.0.0.0/8
external_media_address=198.51.100.5
external_signaling_address=198.51.100.5

लॉग में No matching endpoint found अनुरोध IP पते या उपयोगकर्ता नाम द्वारा किसी एंडपॉइंट से मेल नहीं खाया। स्कैनर की ओर से यह सामान्य है और fail2ban इसे संभाल लेगा। अपने स्वयं के प्रदाता की ओर से इसका मतलब है कि identify अनुभाग में वह पता सूचीबद्ध नहीं है जहाँ से वे आपको कॉल करते हैं।

रजिस्ट्रेशन की स्थिति Rejected है। प्रदाता ने आपके auth अनुभाग में दिए गए क्रेडेंशियल्स को अस्वीकार कर दिया है। CLI पर pjsip set logger on चलाएँ, एक REGISTER और उसके उत्तर को देखें, फिर client_uri और username की तुलना प्रदाता द्वारा आपको जारी किए गए विवरण से करें।

लॉग में कुछ भी उपयोगी नहीं है। Asterisk डिफ़ॉल्ट रूप से नोटिस स्तर और उससे ऊपर की जानकारी messages.log में लिखता है। समस्या को दोहराते समय इसे core set verbose 4 और pjsip set logger on के साथ बढ़ाएं, फिर दोनों को बंद कर दें, क्योंकि SIP लॉगर हर पैकेट को लिखता है।

इसे expose करने से पहले

एक PBX अन्य self-hosted सेवाओं जैसा नहीं है। एक खराब web app का मतलब केवल एक पेज का न चलना है। एक खराब PBX का मतलब है कि आपके सोते समय घंटों के भीतर भारी फोन बिल बन जाना। इसे ऐसे VPS पर चलाएं जो कोई अन्य कार्य न करता हो, 5060 port को केवल ज्ञात IP addresses तक सीमित रखें, प्रत्येक extension को एक random secret दें, और trunk account पर खर्च की सीमा (spending cap) निर्धारित करें। सर्वर के बाकी हिस्से को भी किसी अन्य exposed सर्वर के समान ही सुरक्षित रखना आवश्यक है, जिसे VPS hosting वास्तव में कितनी सुरक्षित है, इस पर यह विश्लेषण स्पष्ट करता है।

FAQ

मुझे self-hosted VoIP server के लिए कौन से ports खोलने होंगे?

SIP signalling के लिए UDP और TCP पर port 5060, यदि आप SIP over TLS का उपयोग करते हैं तो port 5061, और RTP media के लिए UDP ports की एक range। Asterisk का sample rtp.conf 10000 से 20000 तक की range का उपयोग करता है, और compiled-in defaults 5000 से 31000 तक हैं। प्रत्येक call इस range से दो ports का उपयोग करती है, इसलिए दो सौ ports की range एक सौ simultaneous calls को संभाल सकती है। RTP range को UDP के रूप में खोलें, और port 5060 को सभी के लिए खुला छोड़ने के बजाय केवल अपने provider के addresses और अपने स्वयं के networks तक सीमित रखें।

क्या मुझे Asterisk को अकेले install करना चाहिए या FreePBX का उपयोग करना चाहिए?

जब आप एक छोटा attack surface चाहते हैं और ऐसी configuration files रखना चाहते हैं जिन्हें आप git में रख सकें, और आप dialplan लिखने के लिए तैयार हैं, तो raw Asterisk install करें। जब आप extensions, voicemail और call queues के लिए GUI चाहते हैं, तो FreePBX install करें। अगस्त 2026 तक, FreePBX 17 installer एक vanilla Debian 12 machine की अपेक्षा करता है और Asterisk, एक web server, एक database server और PHP install करता है, इसलिए इसे अपना एक अलग VPS दें। FreePBX उन config files को regenerate करता है जिन्हें वह manage करता है, इसलिए manual edits इसके _custom files में ही किए जाने चाहिए।

call connect होने के बाद audio क्यों नहीं आता है?

Signalling काम कर गई लेकिन media नहीं पहुँचा। SIP ने port 5060 पर call setup किया, और audio RTP range के एक port पर जाने वाला एक अलग UDP flow है जिसे कोई चीज़ block कर रही है। जाँचें कि rtp.conf में दी गई range आपके firewall में खुली range से मेल खाती है, और server के firewall के साथ-साथ अपने provider के network firewall की भी जाँच करें। Call के दौरान sudo tcpdump -ni any udp portrange 10000-10200 चलाएँ: यदि कोई packets नहीं दिखते हैं, तो इसका मतलब है कि वे पहुँचने से पहले ही block हो रहे हैं।

मैं SIP brute force attacks और toll fraud को कैसे रोकूँ?

प्रत्येक extension को एक लंबा random secret दें, कभी भी ऐसा नहीं जो उसके extension number से मेल खाता हो। Trunk द्वारा उपयोग किए जाने वाले context को किसी भी ऐसे context से अलग रखें जो बाहर call कर सके, ताकि एक inbound call आपके account पर वापस बाहर call न कर सके। Port 5060 को केवल अपने provider के addresses तक सीमित रखें। Fail2ban में asterisk jail को enable करें, जो /var/log/asterisk/messages को read करता है और No matching endpoint found failures उत्पन्न करने वाले addresses को ban कर देता है। इसके बाद, अपने provider के साथ spending cap सेट करें और unused international destinations को block करें, क्योंकि यदि बाकी सब विफल हो जाता है, तो केवल यही नियंत्रण नुकसान को सीमित कर सकता है।

क्या दूर के क्षेत्र में VPS होने से call quality खराब होती है?

हाँ, क्योंकि audio दो चरणों में यात्रा करता है: phone से VPS, फिर VPS से trunk provider तक। ITU-T G.114 एक-तरफा delay को 150 ms से कम रखने की सलाह देता है, और एक गलत जगह स्थित VPS उस बजट का अधिकांश हिस्सा केवल दूरी में ही खर्च कर सकता है। Phones के करीब का क्षेत्र चुनें, क्योंकि वह चरण आमतौर पर consumer internet पर चलता है जहाँ jitter सबसे अधिक होता है। Codec का चुनाव delay को ठीक नहीं करता, यह केवल bandwidth बदलता है, इसलिए G.729 bytes तो बचाता है लेकिन 200 ms के path को ठीक नहीं करेगा।