Cuộc gọi bị ngắt ngẫu nhiên. Âm thanh một chiều mà không ai có thể tái hiện theo yêu cầu. Giọng nói bị ngắt quãng chỉ xảy ra vào giờ cao điểm. Các vấn đề VoIP rất khó chịu vì chúng liên quan đến hai giao thức riêng biệt — SIP xử lý tín hiệu trong khi RTP truyền âm thanh thực sự — và chẩn đoán chúng thường có nghĩa là lục tìm qua hàng nghìn dòng log với hy vọng bạn đã ghi lại đúng thời điểm.
Phản ứng kinh điển là chạy tcpdump -i eth0 -w voip.pcap port 5060 rồi nhìn chằm chằm vào Wireshark. Cách đó hoạt động cho việc debug một lần, nhưng không thể mở rộng và hoàn toàn vô dụng khi khách hàng gọi lúc 3 giờ sáng phàn nàn về cuộc gọi bị ngắt từ hai giờ trước.
Homer SIPCapture giải quyết vấn đề này. Nó cung cấp cho bạn cơ sở dữ liệu tập trung, có thể tìm kiếm của mọi giao dịch SIP — sơ đồ bậc thang luồng cuộc gọi, thống kê chất lượng RTP tương quan, toàn bộ bức tranh — mà không ảnh hưởng đến đường cuộc gọi hay thêm độ trễ đáng kể.
So sánh Phương pháp: Ba Cách Debug VoIP
Trước khi quyết định dùng Homer, hãy tìm hiểu những gì các phương án thay thế thực sự cung cấp.
Bắt Gói tin Thụ động (tcpdump / Wireshark)
Bạn bắt các gói tin thô trên giao diện mạng và phân tích chúng ngoại tuyến. Wireshark có bộ phân tích SIP và RTP xuất sắc, và cho việc điều tra nhanh một lần thì thường đủ dùng. Hạn chế là nó hoàn toàn mang tính phản ứng — bạn phải đang bắt gói khi sự cố xảy ra, và việc tương quan tín hiệu SIP với luồng RTP thủ công qua nhiều hop nhanh chóng trở nên tẻ nhạt.
Ghi Log Chi tiết của PBX (Asterisk / FreeSWITCH)
Cả Asterisk và FreeSWITCH đều có thể ghi lại toàn bộ tin nhắn SIP. sip set debug on trong Asterisk hoặc sofia global siptrace on trong FreeSWITCH xuất mọi gói SIP ra console hoặc file log. Vấn đề là: các log này là văn bản phi cấu trúc, không có dữ liệu chất lượng RTP, không có luồng cuộc gọi trực quan, và không có cách tìm kiếm tốt qua 100.000 dòng khi bạn đang tìm một cuộc gọi cụ thể từ thứ Năm tuần trước.
Bắt SIP Tập trung với Homer (Giao thức HEP)
HEP (Homer Encapsulation Protocol) là một gói UDP nhẹ bọc các tin nhắn SIP và gửi chúng đến một bộ thu thập trung tâm theo thời gian thực. Asterisk, FreeSWITCH, Kamailio và OpenSIPS đều hỗ trợ HEP natively. Homer nhận các gói đó và lưu chúng với chỉ mục toàn văn. Giao diện web cho phép bạn tìm kiếm theo người gọi, người nhận, call ID, mã phản hồi SIP hoặc khoảng thời gian — sau đó hiển thị sơ đồ bậc thang trực quan cho bất kỳ cuộc gọi nào trong vài giây.
Ưu và Nhược điểm của Từng Phương pháp
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| tcpdump / Wireshark | Không cần cấu hình, hoạt động trên bất kỳ máy chủ nào | Phải đang chạy tại thời điểm sự cố; tương quan RTP thủ công; không có lịch sử |
| Ghi log chi tiết PBX | Tích hợp sẵn trong mọi PBX chính; không cần công cụ thêm | Chỉ văn bản; không có thống kê RTP; khó tìm kiếm; không có trực quan hóa luồng cuộc gọi |
| Homer SIPCapture | Thời gian thực; tìm kiếm toàn văn; sơ đồ luồng cuộc gọi; thống kê RTP MOS/jitter; dữ liệu lịch sử | Yêu cầu cấu hình HEP agent trên mỗi PBX; cần máy chủ riêng |
Khi bạn xử lý nhiều hơn vài chục cuộc gọi mỗi ngày, Homer sẽ hoàn vốn về mặt thời gian. Chạy nó trên nhiều cụm FreeSWITCH trong môi trường production, xu hướng đó vẫn đúng: những gì trước đây là phiên grep log kéo dài hai giờ giờ trở thành tìm kiếm năm phút.
Cấu hình Được Khuyến nghị
Stack hiện đại của Homer có bốn thành phần:
- heplify-server — bộ thu thập HEP (Go binary); nhận bắt SIP và ghi vào cơ sở dữ liệu
- Homer App — giao diện web React để tìm kiếm và trực quan hóa
- PostgreSQL — backend lưu trữ (tốt đến ~50k cuộc gọi/ngày); chuyển sang ClickHouse cho khối lượng cao hơn
- HEP Agent — tích hợp sẵn trong Asterisk/FreeSWITCH/Kamailio, hoặc dùng agent
heplifyđộc lập để bắt thụ động
Đối với môi trường VoIP nhỏ đến vừa (dưới 200 cuộc gọi đồng thời), một VM đơn với 4 vCPU, 8 GB RAM và SSD nhanh chạy Ubuntu 22.04 là đủ. PostgreSQL xử lý tải đó mà không cần tinh chỉnh, và cơ chế xoay phân vùng của Homer mặc định xóa dữ liệu cũ hơn 30 ngày — mức sử dụng ổ đĩa duy trì ổn định.
Hướng dẫn Triển khai
Bước 1: Cài đặt heplify-server
# Tải heplify-server
wget https://github.com/sipcapture/heplify-server/releases/latest/download/heplify-server_linux_amd64.tar.gz
tar -xzf heplify-server_linux_amd64.tar.gz
sudo mv heplify-server /usr/local/bin/
sudo chmod +x /usr/local/bin/heplify-server
Bước 2: Tạo Cơ sở dữ liệu PostgreSQL
sudo -u postgres psql <<EOF
CREATE DATABASE homer_data;
CREATE DATABASE homer_config;
CREATE USER homer WITH PASSWORD 'your_secure_password';
GRANT ALL PRIVILEGES ON DATABASE homer_data TO homer;
GRANT ALL PRIVILEGES ON DATABASE homer_config TO homer;
EOF
Bước 3: Cấu hình heplify-server
Tạo /etc/heplify-server.toml:
HEPAddr = "0.0.0.0:9060"
DBDriver = "postgres"
DBAddr = "localhost:5432"
DBUser = "homer"
DBPass = "your_secure_password"
DBDataTable = "homer_data"
DBConfTable = "homer_config"
DBBulk = 200
DBWorker = 8
DBRotate = true
DBPartSip = "2h"
DBPartLog = "24h"
DBPartRaw = "2h"
DBDropDays = 30
LogLvl = "info"
LogStdout = true
# Tạo systemd service
sudo tee /etc/systemd/system/heplify-server.service <<EOF
[Unit]
Description=HEPlify Server
After=network.target postgresql.service
[Service]
ExecStart=/usr/local/bin/heplify-server -config /etc/heplify-server.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now heplify-server
Bước 4: Triển khai Homer App qua Docker
docker run -d \
--name homer-app \
--restart unless-stopped \
-p 9080:80 \
-e "DB_HOST=your-postgres-host" \
-e "DB_USER=homer" \
-e "DB_PASS=your_secure_password" \
-e "DB_NAME=homer_config" \
sipcapture/homer-app:latest
Truy cập UI tại http://your-server:9080. Thông tin đăng nhập mặc định: admin / sipcapture — thay đổi ngay lập tức.
Bước 5: Bật HEP trên FreeSWITCH
Chỉnh sửa profile SIP của bạn (ví dụ: /etc/freeswitch/sip_profiles/internal.xml):
<param name="capture-server" value="udp:YOUR_HOMER_IP:9060"/>
<param name="capture-enabled" value="true"/>
Tải lại profile mà không ngắt cuộc gọi:
fs_cli -x "sofia profile internal rescan"
Bước 6: Bật HEP trên Asterisk
Tạo /etc/asterisk/hep.conf:
[general]
enabled = yes
capture_address = YOUR_HOMER_IP
capture_port = 9060
capture_type = HEP3
uuid_type = call-id
Trong sip.conf hoặc pjsip.conf:
[general]
hep_enabled = yes
hep_capture_id = 1
Sau đó tải lại: asterisk -rx "module reload res_hep.so"
Bước 7: Thêm Bắt RTP Thụ động với heplify
HEP agent tích hợp sẵn chỉ gửi tín hiệu SIP — không phải thống kê chất lượng RTP. Để lấy dữ liệu MOS, jitter và mất gói, hãy triển khai heplify như một sniffer thụ động trên máy chủ media của bạn:
wget https://github.com/sipcapture/heplify/releases/latest/download/heplify_linux_amd64.tar.gz
tar -xzf heplify_linux_amd64.tar.gz
sudo mv heplify /usr/local/bin/
# Bắt SIP trên port 5060 và lấy thống kê RTP từ RTCP
sudo heplify \
-hs YOUR_HOMER_IP:9060 \
-i eth0 \
-m SIPRTCP \
-pr 5060-5061 \
--rtp_stats \
-sl 7
Đọc Kết quả
Khi các cuộc gọi đi qua Homer, mở màn hình Tìm kiếm và lọc theo khoảng thời gian, số người gọi hoặc mã phản hồi SIP. Nhấp vào bất kỳ cuộc gọi nào để mở chế độ xem phân tích:
- Sơ đồ bậc thang luồng cuộc gọi — INVITE → 100 Trying → 180 Ringing → 200 OK → ACK → BYE, với dấu thời gian và định tuyến từng hop hiển thị
- Tab thống kê RTP — điểm MOS, jitter (ms), mất gói (%) và gói đến muộn theo từng luồng RTP
- Tin nhắn SIP thô — toàn bộ header bao gồm SDP offer/answer, cần thiết để debug codec và NAT
Khi xem xét chất lượng RTP, hãy dùng các ngưỡng sau:
Jitter: < 20ms — trong suốt
20–50ms — có thể nhận thấy
> 50ms — gây ra nhiễu âm thanh nghe được
Packet Loss: < 1% — chấp nhận được
1–5% — chất lượng suy giảm
> 5% — ngắt quãng, không dùng được
MOS Score: > 4.0 — xuất sắc (chất lượng chuẩn)
3.5–4.0 — tốt
< 3.5 — dự kiến có khiếu nại
Chẩn đoán Các Vấn đề Phổ biến Nhất
Âm thanh Một chiều
Cuộc gọi hoàn thành (nhận được 200 OK, gửi ACK) nhưng âm thanh chỉ chảy một chiều. Mở các tin nhắn SIP thô và xem dòng c= trong SDP. Nếu bạn thấy địa chỉ RFC1918 riêng tư khi cả hai endpoint đều trên internet công cộng, PBX đang nằm sau NAT mà không có IP ngoài được cấu hình đúng. Sửa cài đặt ext-rtp-ip trong FreeSWITCH hoặc externaddr trong Asterisk.
Cuộc gọi Bị ngắt Đúng 30 Giây
Hầu như luôn được gây ra bởi SIP re-INVITE thất bại tại bộ đếm thời gian làm mới 30 giây. Luồng cuộc gọi của Homer sẽ hiển thị re-INVITE và phản hồi lỗi — thường là 403 Forbidden hoặc 488 Not Acceptable Here. Hoặc là đầu cuối từ xa không hỗ trợ re-INVITE, hoặc có sự không khớp codec trong SDP làm mới.
Âm thanh Ngắt quãng Trong Giờ Làm việc
Jitter cao tương quan với lưu lượng cao điểm là dấu hiệu của tắc nghẽn mạng. Xuất thống kê RTP từ Homer, vẽ đồ thị jitter theo thời gian và xác nhận tương quan. Sau đó xem lại cấu hình QoS của bạn — lưu lượng VoIP RTP nên nằm trong hàng đợi ưu tiên (DSCP EF / CS5) riêng biệt với lưu lượng dữ liệu thông thường.
Lỗi Đăng ký
Tìm kiếm Homer theo from_user hoặc tên người dùng xác thực và xem chuỗi REGISTER. Luồng đúng là REGISTER → 401 Unauthorized (máy chủ gửi thách thức xác thực) → REGISTER kèm thông tin đăng nhập → 200 OK. Nếu bạn thấy các phản hồi 401 lặp đi lặp lại mà không có 200 OK, mật khẩu SIP hoặc realm trong cấu hình client bị sai.
Chi phí overhead của Homer trong production thực sự rất thấp — ít hơn 1% CPU bổ sung trên một instance FreeSWITCH xử lý 50 cuộc gọi đồng thời. Các gói HEP chỉ mang văn bản SIP, không phải âm thanh RTP, vì vậy chi phí mạng là tối thiểu. Trên một cụm bận rộn, tôi đã đo khoảng 2–3 MB/giờ lưu lượng HEP. Đó là mức giá hợp lý để có thể truy xuất bất kỳ cuộc gọi nào trong 30 ngày qua trong vòng chưa đầy một phút.

