Hướng dẫn tự host VoIP server với Asterisk và FreePBX
Tự host Asterisk hoặc FreePBX trên VPS. Hướng dẫn cấu hình SIP trunk, dải cổng RTP, thiết lập firewall chặn quét lỗ hổng và cách phòng tránh rủi ro gian lận cước viễn thông.
VoIP server tự host là gì
VoIP server tự host là một SIP server chạy trên VPS do bạn kiểm soát, nhờ đó các cuộc gọi được định tuyến qua máy chủ của chính bạn thay vì thông qua một dịch vụ điện thoại bên thứ ba. VoIP (voice over IP) truyền tải giọng nói dưới dạng các gói tin UDP. SIP (session initiation protocol) là giao thức báo hiệu dùng để thiết lập và kết thúc cuộc gọi. Âm thanh không truyền qua SIP, và chính thực tế này gây ra hầu hết các vấn đề dưới đây.
Một hệ thống hoạt động hoàn chỉnh bao gồm bốn phần.
- Phần mềm PBX (private branch exchange). Asterisk là lựa chọn phổ biến nhất. Nó quản lý các extension và dialplan.
- Các endpoint. Điện thoại bàn hoặc softphone đăng ký vào PBX bằng username và secret.
- SIP trunk. Một tài khoản trả phí với nhà cung cấp để kết nối bạn với mạng điện thoại công cộng và cho thuê số điện thoại thực.
- Đường truyền media. Các luồng RTP (real-time transport protocol) mang âm thanh trên các cổng UDP riêng biệt.
Tự host PBX không có nghĩa là tự host số điện thoại. Số điện thoại đến từ nhà mạng, và bạn vẫn phải trả phí theo số và theo phút. Những gì bạn sở hữu là quyền định tuyến cuộc gọi, hộp thư thoại, các bản ghi âm và danh sách extension. Bạn cũng chịu trách nhiệm về bảo mật cho một dịch vụ mà kẻ xấu thường xuyên tấn công để trục lợi.
Máy chủ VoIP tự host cần những cổng nào?
SIP signalling sử dụng cổng 5060 cho UDP và TCP, và cổng 5061 cho SIP qua TLS (transport layer security). Các cổng này chỉ thực hiện việc thiết lập cuộc gọi. Âm thanh của mỗi cuộc gọi là một luồng UDP riêng biệt, được gửi đến một cổng lấy từ dải RTP. Asterisk phát hành một mẫu rtp.conf thiết lập rtpstart=10000 và rtpend=20000, và các giá trị mặc định được biên dịch sẵn là 5000 và 31000. Mỗi cuộc gọi chiếm hai cổng từ dải này, một cho RTP và một cho RTCP (RTP control protocol).
Sự phân tách này là nơi hầu hết các nỗ lực đầu tiên thất bại. Cuộc gọi kết nối, cả hai điện thoại đều hiển thị đã trả lời, nhưng cả hai bên đều không nghe thấy gì vì firewall cho phép cổng 5060 nhưng lại drop mọi gói tin RTP. Signalling và media là các luồng riêng biệt, vì vậy chúng cần các quy tắc firewall riêng. Nếu sự khác biệt này còn mới mẻ với bạn, cách các cổng và socket lắng nghe hoạt động trên Linux là tài liệu đáng đọc trước khi bạn mở bất kỳ cổng nào.
Hãy thu hẹp dải cổng trước khi mở. Hai mươi nghìn cổng là quá nhiều so với nhu cầu của một hệ thống nhỏ. Hai cổng cho mỗi cuộc gọi nghĩa là dải hai trăm cổng là đủ cho một trăm cuộc gọi cùng lúc.
[general]
rtpstart=10000
rtpend=10200Áp dụng nó với sudo asterisk -rx "core reload".
Bạn nên cài đặt Asterisk hay FreePBX?
Asterisk là engine. Bạn cấu hình nó bằng các file văn bản trong /etc/asterisk và tự viết dialplan. FreePBX là giao diện web viết bằng PHP và JavaScript chạy trên nền Asterisk, tự động tạo các file đó cho bạn và bổ sung các module cho voicemail và hàng đợi cuộc gọi.
Sự khác biệt quan trọng trên VPS là quyền kiểm soát máy chủ. Tính đến tháng 8 năm 2026, trình cài đặt chính thức của FreePBX 17 yêu cầu một hệ thống Debian 12 sạch, và nó sẽ tự cài đặt Asterisk, web server, database server và PHP. Nếu bạn chạy nó trên một máy chủ đang có các dịch vụ khác, kết quả sẽ không như ý muốn. Hãy dành riêng một VPS cho FreePBX.
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.shLog cài đặt được lưu tại /var/log/pbx/freepbx17-install.log, đây là nơi đầu tiên cần kiểm tra khi script dừng đột ngột.
FreePBX nắm quyền kiểm soát các file cấu hình mà nó tạo ra. Nếu bạn tự sửa pjsip.conf trên một máy FreePBX, thay đổi của bạn sẽ biến mất ngay khi GUI ghi đè file đó. FreePBX đọc các file riêng biệt có chứa _custom trong tên để lưu cấu hình thủ công, và nó sẽ không can thiệp vào các file này.
Sự đánh đổi ở đây rất rõ ràng. FreePBX cung cấp cho bạn một GUI, đồng thời đặt một trang đăng nhập cho hệ thống điện thoại của bạn lên Internet công cộng. Asterisk thuần túy không có giao diện web, mọi thiết lập đều là các chỉ thị có tài liệu hướng dẫn mà bạn có thể đọc trong file và quản lý bằng git. Nếu bạn cài đặt FreePBX, hãy giới hạn cổng web của nó chỉ cho địa chỉ IP của bạn hoặc truy cập qua VPN, vì một GUI quản trị PBX là mục tiêu tấn công có đường dẫn trực tiếp đến tiền bạc.
Ghi chú về phiên bản, chính xác tính đến tháng 8 năm 2026: Asterisk 22 là bản phát hành hỗ trợ dài hạn (LTS) hiện tại, được công bố vào tháng 10 năm 2024 và nhận các bản vá bảo mật cho đến tháng 10 năm 2028. Asterisk 23 là bản phát hành tiêu chuẩn. Ubuntu 24.04 cung cấp Asterisk 20.6.0 trong kho lưu trữ universe.
Cài đặt Asterisk trên Ubuntu 24.04
Sử dụng gói từ distribution là cách nhanh nhất. Ubuntu đã vá lỗi và dịch vụ sẽ tự khởi động dưới sự quản lý của systemd.
sudo apt update
sudo apt install -y asterisk
sudo asterisk -rx "core show version"Biên dịch từ source code giúp bạn có được bản phát hành hỗ trợ dài hạn (LTS) mới nhất.
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 ldconfiginstall_prereq install tải các dependency cần thiết để build cho distribution của bạn, còn install_prereq test in ra các lệnh sẽ được thực thi mà không thay đổi bất kỳ file nào. make menuselect mở trình chọn module, đây là nơi bạn bật codec_opus trong mục Codec Translators. Chỉ chạy make samples trên bản cài đặt mới, vì lệnh này sẽ ghi các file cấu hình mẫu vào /etc/asterisk. make config cài đặt init script tại /etc/init.d/asterisk, và systemd sẽ điều khiển nó thông qua lớp tương thích SysV, nhờ đó sudo systemctl enable --now asterisk sẽ hoạt động sau đó.
Dù bạn chọn cách nào, sudo asterisk -rvvv sẽ kết nối vào daemon đang chạy và đưa bạn vào CLI. Chạy core show version tại đó để in ra thông tin phiên bản bạn đã cài đặt.
Cấu hình SIP trunk và một extension
PJSIP là driver kênh SIP trong các phiên bản Asterisk hiện tại. Cấu hình của nó nằm trong /etc/asterisk/pjsip.conf và được xây dựng từ các section nhỏ có kiểu dữ liệu, tham chiếu đến nhau bằng tên. Các section thuộc kiểu khác nhau có thể trùng tên, đó là lý do tại sao mọi block bên dưới đều được gọi là 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Đối tượng registration gửi bản tin REGISTER để thông báo cho nhà cung cấp nơi chuyển tiếp cuộc gọi của bạn. Đối tượng identify là cách để một cuộc gọi đến từ nhà cung cấp được khớp với endpoint này dựa trên địa chỉ nguồn; nhà cung cấp thường công bố nhiều địa chỉ để liệt kê tại đây. Việc đăng ký outbound và endpoint là các đối tượng riêng biệt theo thiết kế: một cái thông báo cho nhà cung cấp vị trí của bạn, cái còn lại quyết định điều gì sẽ xảy ra với các cuộc gọi.
Một điện thoại bàn cần thêm ba đối tượng nữa.
[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=1direct_media=no giữ Asterisk nằm trong đường truyền media. Nếu bỏ qua, Asterisk sẽ cố gắng để hai endpoint gửi RTP trực tiếp cho nhau, điều này sẽ thất bại khi điện thoại nằm sau NAT (network address translation) trên router gia đình. Đừng bao giờ đặt mật khẩu trùng với số extension. Ví dụ phía trên sử dụng password=6001 cho extension 6001 để dễ đọc, nhưng các trình quét thường thử đúng mẫu đó đầu tiên.
Dialplan trong /etc/asterisk/extensions.conf quyết định những gì mỗi context được phép thực hiện.
[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()Hai context đó là một ranh giới bảo mật. from-trunk xử lý các cuộc gọi đến từ nhà cung cấp và chỉ có thể đổ chuông extension 6001. Nó không thể truy cập mẫu _9X., vì vậy một cuộc gọi từ bên ngoài không thể quay số ngược ra ngoài thông qua trunk của bạn. Nếu gộp các context lại, bạn đã tạo ra con đường gian lận cước phí kinh điển: một người lạ gọi vào số của bạn, dialplan của bạn quay số ra ngoài bằng tài khoản của bạn, và bạn là người trả tiền.
Áp dụng cấu hình và kiểm tra lại.
sudo asterisk -rx "pjsip reload"
sudo asterisk -rx "pjsip show registrations"
sudo asterisk -rx "pjsip show endpoints"pjsip show registrations sẽ liệt kê mytrunk với trạng thái Registered. Rejected nghĩa là nhà cung cấp từ chối thông tin xác thực của bạn. Unregistered nghĩa là bản tin REGISTER của bạn không nhận được phản hồi, hãy kiểm tra firewall tiếp theo.
Quy tắc firewall cho SIP và RTP
Signalling và media cần được xử lý khác nhau vì mức độ rủi ro của chúng không giống nhau. Hãy giới hạn cổng 5060 chỉ cho các địa chỉ mà nhà cung cấp thực sự sử dụng và các mạng nơi điện thoại của bạn đang hoạt động.
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 verboseDải RTP là phần bạn không thể thu hẹp quá mức, vì media thường đến từ một địa chỉ khác với signalling. Hãy hỏi nhà cung cấp về các subnet media của họ và giới hạn ở đó nếu họ công bố. Chỉ giữ dải này đủ rộng cho nhu cầu vào giờ cao điểm nhất. Các chính sách mặc định, thứ tự quy tắc và các phần còn lại của mô hình ufw đã được đề cập trong hướng dẫn cơ bản về ufw firewall cho VPS.
Kiểm tra cả IPv6. Nếu IPV6=no được thiết lập trong /etc/default/ufw, ufw sẽ không lọc IPv6, vì vậy một daemon bind vào :: có thể truy cập được qua IPv6 mà không áp dụng bất kỳ quy tắc nào ở trên. Mở cổng cho IPv6 với ufw giải thích sự khác biệt giữa hai họ giao thức này. Hầu hết các nhà cung cấp cũng cung cấp một firewall mạng riêng trong bảng điều khiển, và firewall đó được thực thi trước khi gói tin đến được VPS, vì vậy một cổng phải được mở ở cả hai nơi.
SIP brute force và gian lận cước phí không phải là vấn đề tùy chọn
Đặt cổng 5060 trên một địa chỉ public và các đợt quét sẽ bắt đầu. Mô hình này rất ổn định: các yêu cầu REGISTER và INVITE từ nhiều địa chỉ nguồn, thử các số máy nhánh phổ biến với các mật khẩu thông dụng. Asterisk ghi log lại mỗi lần thất bại, và dòng log có dạng như sau.
Request 'REGISTER' from '<sip:1000@198.51.100.20>' failed for '198.51.100.20:5060' (callid: 5f1a5c0d) - No matching endpoint foundLý do vấn đề này cần nỗ lực thực sự là vì tiền. Một máy nhánh bị đánh cắp sẽ được dùng để thực hiện các cuộc gọi quốc tế đắt đỏ, thường là đến các số dịch vụ giá trị gia tăng mà kẻ tấn công được chia hoa hồng, và hóa đơn sẽ do bạn chi trả vì các cuộc gọi đó sử dụng thông tin xác thực của bạn. Nó chạy với tốc độ máy và thường diễn ra vào ban đêm.
Sáu biện pháp kiểm soát sau đây là bắt buộc thay vì là các tùy chọn tăng cường bảo mật.
- Không bao giờ tạo máy nhánh có mật khẩu trùng với số máy nhánh hoặc là một từ ngắn. Hãy tạo mật khẩu bằng
openssl rand -base64 24và dán nó vào. - Tắt các cuộc gọi đến ẩn danh. PJSIP mặc định từ chối các cuộc gọi không xác định và chỉ chấp nhận nếu bạn tạo một endpoint có tên là
anonymous. Đừng tạo endpoint này. - Giữ context của trunk tách biệt với bất kỳ context nào có thể gọi ra ngoài, như đã trình bày ở trên.
- Hạn chế tín hiệu theo địa chỉ nguồn, cả trong ufw và trong firewall mạng của nhà cung cấp.
- Thiết lập hạn mức chi tiêu với nhà cung cấp SIP trunk và vô hiệu hóa các điểm đến quốc tế mà bạn không bao giờ gọi. Đây là biện pháp kiểm soát duy nhất giới hạn tổn thất khi các biện pháp khác thất bại.
- Chạy fail2ban dựa trên log của Asterisk.
Asterisk cũng có thể tạo ra một sự kiện bảo mật sau khi nhận các yêu cầu không khớp liên tục từ một địa chỉ. Phần [global] của pjsip.conf sử dụng unidentified_request_count, mặc định là 5, và unidentified_request_period, mặc định là 5 giây. Tổng hợp lại, điều này có nghĩa là năm yêu cầu không khớp từ một địa chỉ trong vòng năm giây sẽ tạo ra một sự kiện bảo mật mà fail2ban có thể xử lý.
Chặn các trình quét bằng fail2ban
fail2ban đã có sẵn một asterisk jail được viết sẵn. Nó bao phủ các cổng 5060 và 5061, đọc file /var/log/asterisk/messages, và mặc định sử dụng maxretry = 10. Jail này sẽ ở trạng thái tắt cho đến khi bạn kích hoạt nó trong /etc/fail2ban/jail.local.
[asterisk]
enabled = true
maxretry = 5
findtime = 600
bantime = 86400sudo systemctl restart fail2ban
sudo fail2ban-client status asteriskMột kết quả kiểm tra thành công sẽ liệt kê file log của jail và số lượng địa chỉ đang bị cấm. Trên một cổng 5060 công khai, con số đó sẽ không còn là 0 chỉ sau một ngày. Bộ lọc đi kèm khớp với các thông báo No matching endpoint found ở trên, và nó cũng khớp với các dòng SecurityEvent có cấu trúc của Asterisk. Các sự kiện đó được ghi vào một kênh log riêng biệt vốn đang bị comment trong /etc/asterisk/logger.conf, vì vậy hãy bỏ comment tại đó và thêm file này vào mục logpath của jail nếu bạn muốn sử dụng chúng.
[logfiles]
console => notice,warning,error
messages.log => notice,warning,error
security.log => securityTải lại logger bằng lệnh sudo asterisk -rx "logger reload". Bộ lọc này cũng hỗ trợ journalmatch cho asterisk.service, vì vậy bạn có thể dùng backend journal nếu không muốn lưu file log. Việc cài đặt, cấu trúc jail.local và cách gỡ cấm một địa chỉ mà bạn đã khóa đều được đề cập trong hướng dẫn fail2ban cho Ubuntu 24.04.
Độ trễ và lựa chọn codec trên VPS ở xa
Độ trễ được quyết định bởi khoảng cách địa lý và bạn không thể cấu hình để loại bỏ nó. ITU-T G.114 khuyến nghị giữ độ trễ một chiều dưới 150 ms cho hội thoại thông thường và coi mức tối đa khoảng 400 ms vẫn có thể sử dụng được. Âm thanh từ điện thoại đi đến VPS của bạn rồi mới ra nhà cung cấp trunk, vì vậy một VPS đặt sai khu vực sẽ phải chịu hành trình này hai lần. Hãy đặt VPS gần điện thoại hoặc gần nhà cung cấp, và ưu tiên gần điện thoại hơn khi hai vị trí này khác biệt, vì chặng đó thường chạy qua mạng internet dân dụng nơi jitter là tệ nhất.
Lựa chọn codec quyết định băng thông cho mỗi cuộc gọi. Mỗi codec ở đây gửi một gói tin mỗi 20 ms, tương đương 50 gói tin mỗi giây, và mỗi gói tin mang theo 40 byte header IP, UDP và RTP bên trên payload âm thanh.
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 là mặc định trên hầu hết các trunk. Payload của nó là 64 kbps, và tính cả header, một cuộc gọi đang thực hiện tốn 80 kbps cho mỗi chiều. Opus ở mức 24 kbps sẽ tốn 40 kbps, và G.729 giảm xuống còn 24 kbps với cái giá phải trả là chất lượng âm thanh và tài nguyên CPU. Những con số này là kết quả tính toán header thay vì đo đạc thực tế: tốc độ payload cộng với 40 byte mỗi gói tin ở tần suất 50 gói tin mỗi giây. Framing Ethernet hoặc VLAN sẽ cộng thêm một chút trên đường truyền.
Transcoding tốn CPU. Nếu điện thoại và trunk của bạn đều dùng ulaw, hãy chỉ cho phép ulaw và Asterisk sẽ chuyển tiếp âm thanh mà không cần can thiệp. Opus hoạt động tốt trên các đường truyền bị mất gói, nhưng việc transcoding giữa Opus và G.711 cần module codec_opus bên ngoài, bạn chọn module này trong make menuselect và nó không được build mặc định.
Các lỗi thường gặp và thông báo bạn sẽ thấy
Cuộc gọi kết nối được nhưng không ai nghe thấy gì. RTP không đến được đích. Hãy xác nhận dải port trong rtp.conf trùng với dải port bạn đã mở trên firewall, sau đó dùng sudo tcpdump -ni any udp portrange 10000-10200 để theo dõi gói tin trong khi thực hiện cuộc gọi. Nếu không có gói tin nào, firewall của bạn hoặc firewall mạng của nhà cung cấp đang chặn chúng.
Âm thanh chỉ có một chiều. Một bên đang gửi RTP đến một địa chỉ không thể nhận, đây là vấn đề về địa chỉ thay vì vấn đề về port. Nếu VPS của bạn có địa chỉ public trực tiếp trên interface, bạn không cần xử lý NAT. Nếu nhà cung cấp cấp cho VPS một địa chỉ private với ánh xạ public 1-1, hãy thiết lập địa chỉ public trong phần transport và liệt kê dải private của bạn trong 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.5No matching endpoint found trong log. Yêu cầu không khớp với bất kỳ endpoint nào theo địa chỉ IP hoặc username. Nếu đến từ một trình quét (scanner), đây là điều bình thường và fail2ban sẽ xử lý nó. Nếu đến từ chính nhà cung cấp của bạn, điều đó có nghĩa là phần identify chưa liệt kê địa chỉ mà họ dùng để gọi cho bạn.
Trạng thái đăng ký là Rejected. Nhà cung cấp từ chối thông tin xác thực trong phần auth của bạn. Chạy pjsip set logger on tại CLI, theo dõi một gói REGISTER và phản hồi của nó, sau đó so sánh client_uri và username với thông tin nhà cung cấp đã cấp cho bạn.
Không có thông tin hữu ích trong log. Theo mặc định, Asterisk chỉ ghi log từ mức notice trở lên vào messages.log. Hãy tăng mức log bằng core set verbose 4 và pjsip set logger on trong khi bạn tái hiện vấn đề, sau đó tắt cả hai đi, vì trình ghi log SIP sẽ ghi lại mọi gói tin.
Trước khi bạn public nó
Một PBX không giống như các ứng dụng khác mà bạn tự host. Một web app bị lỗi chỉ khiến trang web không truy cập được. Một PBX bị lỗi sẽ biến thành hóa đơn điện thoại khổng lồ chỉ trong vài giờ, ngay cả khi bạn đang ngủ. Hãy chạy nó trên một VPS chuyên dụng không chạy dịch vụ nào khác, giới hạn cổng 5060 chỉ cho các địa chỉ IP tin cậy, đặt mật khẩu ngẫu nhiên cho mọi extension và thiết lập hạn mức chi tiêu cho tài khoản trunk. Các thành phần còn lại của hệ thống cần tuân thủ các tiêu chuẩn bảo mật cơ bản như bất kỳ server nào được public, điều này đã được trình bày trong bài phân tích về mức độ an toàn thực sự của VPS hosting.
FAQ
Tôi cần mở những cổng nào cho máy chủ VoIP tự host?
Cổng 5060 cho tín hiệu SIP qua UDP và TCP, cổng 5061 nếu bạn dùng SIP qua TLS, và một dải cổng UDP cho luồng media RTP. File mẫu rtp.conf của Asterisk sử dụng dải từ 10000 đến 20000, và mặc định được biên dịch sẵn là 5000 đến 31000. Mỗi cuộc gọi tiêu tốn hai cổng trong dải này, vì vậy dải hai trăm cổng sẽ xử lý được một trăm cuộc gọi đồng thời. Hãy mở dải RTP dưới dạng UDP, và giới hạn cổng 5060 chỉ cho các địa chỉ của nhà cung cấp và mạng nội bộ của bạn thay vì để mở cho tất cả mọi người.
Tôi nên cài đặt Asterisk độc lập hay dùng FreePBX?
Hãy cài đặt Asterisk thuần khi bạn muốn bề mặt tấn công nhỏ, muốn quản lý file cấu hình bằng git và sẵn sàng tự viết dialplan. Hãy cài đặt FreePBX khi bạn cần giao diện đồ họa (GUI) để quản lý extension, hộp thư thoại và hàng đợi cuộc gọi. Tính đến tháng 8 năm 2026, trình cài đặt FreePBX 17 yêu cầu một máy Debian 12 sạch và sẽ tự cài đặt Asterisk, web server, database server và PHP, vì vậy hãy cấp cho nó một VPS riêng. FreePBX sẽ tự tạo lại các file cấu hình mà nó quản lý, vì vậy các thay đổi thủ công phải được thực hiện trong các file _custom của nó.
Tại sao không có âm thanh sau khi cuộc gọi đã kết nối?
Tín hiệu đã hoạt động nhưng luồng media thì không. SIP đã thiết lập cuộc gọi trên cổng 5060, còn âm thanh là một luồng UDP riêng biệt đi đến một cổng trong dải RTP mà có thiết bị nào đó đang chặn. Hãy kiểm tra xem dải cổng trong rtp.conf có khớp với dải đã mở trong firewall của bạn không, đồng thời kiểm tra cả firewall mạng của nhà cung cấp và firewall trên máy chủ. Chạy sudo tcpdump -ni any udp portrange 10000-10200 trong khi đang gọi: nếu không có gói tin nào, nghĩa là chúng đã bị chặn trước khi đến nơi.
Làm thế nào để ngăn chặn các cuộc tấn công SIP brute force và gian lận cước phí?
Hãy đặt cho mỗi extension một mật khẩu dài và ngẫu nhiên, không bao giờ để trùng với số extension. Giữ context dùng cho trunk tách biệt với bất kỳ context nào có quyền gọi ra ngoài, để một cuộc gọi đến không thể gọi ngược ra ngoài bằng tài khoản của bạn. Giới hạn cổng 5060 chỉ cho các địa chỉ của nhà cung cấp. Kích hoạt jail asterisk trong fail2ban, jail này sẽ đọc /var/log/asterisk/messages và cấm các địa chỉ gây ra lỗi No matching endpoint found. Sau đó, hãy đặt hạn mức chi tiêu và chặn các điểm đến quốc tế không sử dụng với nhà cung cấp, vì đó là biện pháp kiểm soát duy nhất giúp giới hạn thiệt hại nếu các biện pháp khác thất bại.
VPS ở khu vực xa có làm giảm chất lượng cuộc gọi không?
Có, vì âm thanh phải đi qua hai chặng: từ điện thoại đến VPS, rồi từ VPS đến nhà cung cấp trunk. Tiêu chuẩn ITU-T G.114 khuyến nghị độ trễ một chiều dưới 150 ms, và một VPS đặt sai vị trí có thể tiêu tốn phần lớn ngân sách độ trễ đó chỉ vì khoảng cách. Hãy chọn khu vực gần với các điện thoại, vì chặng đó thường chạy qua mạng internet dân dụng, nơi jitter thường tệ nhất. Việc chọn codec không khắc phục được độ trễ, nó chỉ thay đổi băng thông, vì vậy G.729 giúp tiết kiệm dung lượng nhưng không thể cứu vãn một đường truyền có độ trễ 200 ms.