Asterisk 및 FreePBX 자체 호스팅 서버 구축 가이드
VPS에서 Asterisk와 FreePBX를 직접 운영하는 방법을 설명합니다. SIP 트렁크 설정과 RTP 포트 범위 지정은 물론, 외부 공격을 차단하기 위한 방화벽 규칙과 통신 요금 사기를 방지하는 보안 필수 항목을 상세히 다룹니다.
자체 호스팅 VoIP 서버란 무엇인가
자체 호스팅 VoIP 서버는 사용자가 제어하는 VPS에서 실행되는 SIP 서버를 의미합니다. 따라서 통화는 호스팅된 전화 서비스가 아닌 사용자의 장비를 통해 라우팅됩니다. VoIP(voice over IP)는 음성을 UDP 패킷 형태로 전송합니다. SIP(session initiation protocol)는 통화를 설정하고 종료하는 신호 체계입니다. 오디오 데이터는 SIP를 통해 전달되지 않으며, 이 사실이 아래에서 다룰 대부분의 문제 원인이 됩니다.
작동하는 시스템은 네 가지 요소로 구성됩니다.
- PBX(private branch exchange) 소프트웨어: Asterisk가 주로 사용됩니다. 내선 번호와 다이얼 플랜을 관리합니다.
- 엔드포인트: 사용자 이름과 비밀번호를 사용하여 PBX에 등록하는 데스크폰 또는 소프트폰입니다.
- SIP 트렁크: 공중 전화망에 연결하고 실제 전화번호를 임대해 주는 서비스 제공업체의 유료 계정입니다.
- 미디어 경로: 별도의 UDP 포트를 통해 오디오를 전달하는 RTP(real-time transport protocol) 흐름입니다.
PBX를 자체 호스팅한다고 해서 전화번호까지 직접 호스팅하는 것은 아닙니다. 번호는 통신사로부터 제공받으며, 여전히 번호당 비용과 분당 통화료를 지불해야 합니다. 사용자가 소유하는 것은 통화 라우팅, 음성 사서함, 녹음 파일, 내선 목록입니다. 또한 금전적 이득을 노리는 공격 대상이 되는 서비스의 보안 책임도 사용자가 직접 집니다.
자체 호스팅 VoIP 서버에는 어떤 포트가 필요한가?
SIP 시그널링은 UDP와 TCP에서 5060 포트를 사용하며, TLS(transport layer security)를 통한 SIP에는 5061 포트를 사용합니다. 이 포트들은 통화 설정만 담당합니다. 각 통화의 오디오는 별도의 UDP 흐름이며, RTP 범위에서 할당된 포트로 전송됩니다. Asterisk는 rtp.conf 샘플을 제공하며, 여기에서 rtpstart=10000 및 rtpend=20000을 설정합니다. 컴파일 시 기본값은 5000과 31000입니다. 각 통화는 해당 범위에서 두 개의 포트를 사용하는데, 하나는 RTP용이고 다른 하나는 RTCP(RTP control protocol)용입니다.
이러한 분리 구조 때문에 초기 설정 시 많은 실패가 발생합니다. 통화는 연결되고 양쪽 전화기 모두 응답 상태로 표시되지만, 방화벽이 5060 포트는 허용하고 모든 RTP 패킷은 차단하기 때문에 양쪽 모두 아무 소리도 들을 수 없습니다. 시그널링과 미디어는 별도의 흐름이므로 각각 다른 방화벽 규칙이 필요합니다. 이 구분이 생소하다면 포트를 개방하기 전에 Linux에서 포트와 리스닝 소켓이 작동하는 방식을 먼저 읽어보는 것이 좋습니다.
포트를 개방하기 전에 범위를 축소하십시오. 20,000개의 포트는 소규모 시스템이 필요로 하는 것보다 훨씬 많습니다. 통화당 2개의 포트를 사용하므로 200개의 포트 범위면 동시에 100건의 통화를 처리할 수 있습니다.
[general]
rtpstart=10000
rtpend=10200sudo asterisk -rx "core reload"을 사용하여 적용하십시오.
Asterisk와 FreePBX 중 무엇을 설치해야 합니까?
Asterisk는 엔진입니다. /etc/asterisk에 있는 텍스트 파일로 설정을 구성하고 다이얼플랜을 직접 작성해야 합니다. FreePBX는 Asterisk 위에서 동작하는 PHP 및 JavaScript 기반의 웹 인터페이스로, 해당 파일들을 자동으로 생성하며 음성 사서함 및 통화 대기열을 위한 모듈을 추가합니다.
VPS 환경에서 중요한 차이점은 서버의 소유권입니다. 2026년 8월 기준으로 공식 FreePBX 17 설치 프로그램은 순정 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를 제공하지만, 전화 시스템의 로그인 페이지를 공용 인터넷에 노출합니다. 반면 순수 Asterisk는 웹 인터페이스가 전혀 없으며, 모든 설정은 파일 내에 문서화된 지시어로 존재하므로 git으로 관리할 수 있습니다. FreePBX를 설치한다면 웹 포트를 본인의 IP 주소로 제한하거나 VPN을 통해서만 접근하도록 하십시오. PBX 관리자 GUI는 금전적 이득과 직결되는 공격 대상이기 때문입니다.
버전 참고 사항(2026년 8월 기준): Asterisk 22는 현재 장기 지원(LTS) 릴리스이며, 2024년 10월에 출시되어 2028년 10월까지 보안 패치를 지원받습니다. 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"소스 코드를 직접 빌드하면 최신 장기 지원(LTS) 릴리스를 사용할 수 있습니다.
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은 배포판에 필요한 빌드 의존성을 가져오며, 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를 사용할 수 있습니다. CLI에서 core show version을 실행하면 실제로 설치된 항목을 확인할 수 있습니다.
SIP 트렁크 및 내선 1개 설정
PJSIP는 현재 Asterisk에서 사용하는 SIP 채널 드라이버입니다. 설정은 /etc/asterisk/pjsip.conf에 위치하며, 서로 이름을 참조하는 작은 유형별 섹션들로 구성됩니다. 서로 다른 유형의 섹션이라도 같은 이름을 공유할 수 있으므로, 아래의 모든 블록을 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.comregistration 객체는 공급자에게 통화를 전달할 위치를 알리는 REGISTER를 전송합니다. identify 객체는 공급자로부터 도착한 통화를 소스 주소를 통해 이 엔드포인트와 매칭하는 방식이며, 공급자는 일반적으로 여기에 나열할 여러 주소를 공개합니다. 아웃바운드 등록과 엔드포인트가 별도의 객체로 분리된 이유는, 하나는 공급자에게 귀하의 위치를 알리고 다른 하나는 통화 처리 방식을 결정하기 때문입니다.
데스크폰에는 세 가지 객체가 더 필요합니다.
[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은 Asterisk를 미디어 경로에 유지합니다. 이 설정을 생략하면 Asterisk는 두 엔드포인트가 서로 직접 RTP를 전송하도록 시도하는데, 전화기가 가정용 라우터의 NAT(네트워크 주소 변환) 뒤에 있을 경우 이 과정은 실패합니다. 비밀번호가 내선 번호와 일치하지 않도록 하십시오. 업스트림 예제에서는 가독성을 위해 내선 6001번에 password=6001를 사용하지만, 스캐너는 정확히 그 패턴을 가장 먼저 시도합니다.
/etc/asterisk/extensions.conf의 다이얼플랜은 각 컨텍스트가 수행할 수 있는 작업을 결정합니다.
[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()이 두 컨텍스트는 보안 경계입니다. from-trunk은 공급자로부터 도착한 통화를 처리하며 내선 6001번으로만 연결할 수 있습니다. 이 컨텍스트는 _9X. 패턴에 도달할 수 없으므로, 외부에서 걸려온 통화가 트렁크를 통해 다시 외부로 전화를 걸 수 없습니다. 컨텍스트를 병합하면 전형적인 통신 사기 경로가 만들어집니다. 즉, 낯선 사람이 귀하의 번호로 전화를 걸고, 귀하의 다이얼플랜이 귀하의 계정으로 외부 전화를 걸게 되어 비용을 부담하게 됩니다.
설정을 적용하고 확인하십시오.
sudo asterisk -rx "pjsip reload"
sudo asterisk -rx "pjsip show registrations"
sudo asterisk -rx "pjsip show endpoints"pjsip show registrations은 상태 Registered와 함께 mytrunk를 나열해야 합니다. Rejected은 공급자가 귀하의 자격 증명을 거부했음을 의미합니다. Unregistered은 REGISTER에 응답이 없음을 의미하므로, 다음으로 방화벽을 확인하십시오.
SIP 및 RTP를 위한 방화벽 규칙
시그널링과 미디어는 서로 다른 위험을 내포하므로 각각 다르게 처리해야 합니다. 5060 포트는 서비스 제공업체가 실제로 사용하는 주소와 전화기가 위치한 네트워크로만 접근을 제한하십시오.
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 verboseRTP 범위는 시그널링과 다른 주소에서 미디어가 전송되는 경우가 많아 범위를 좁히기가 어렵습니다. 서비스 제공업체에 미디어 서브넷을 문의하고, 해당 정보를 제공한다면 그 범위 내로 제한하십시오. 범위는 가장 트래픽이 많은 시간대에 필요한 만큼만 유지해야 합니다. 기본 정책, 규칙 순서 및 기타 ufw 모델에 관한 내용은 VPS를 위한 ufw 방화벽 기초 가이드에서 다룹니다.
IPv6도 확인하십시오. /etc/default/ufw 파일에서 IPV6=no이 설정되어 있으면 ufw는 IPv6를 전혀 필터링하지 않으므로, ::에 바인딩된 데몬은 위 규칙이 적용되지 않은 상태로 IPv6를 통해 접근할 수 있습니다. ufw를 사용하여 IPv6 포트 열기에서는 두 프로토콜 계열의 차이점을 설명합니다. 대부분의 제공업체는 제어판에서 별도의 네트워크 방화벽을 제공하며, 이 방화벽은 패킷이 VPS에 도달하기 전에 적용되므로 포트는 양쪽 모두에서 열려 있어야 합니다.
SIP 무차별 대입 공격과 통신 요금 사기는 선택적인 문제가 아닙니다
공인 IP 주소에 5060 포트를 열어두면 즉시 스캔이 시작됩니다. 패턴은 일정합니다. 여러 소스 주소에서 REGISTER 및 INVITE 요청이 들어오며, 흔히 쓰이는 내선 번호와 비밀번호를 대입합니다. Asterisk는 각 실패 사례를 로그에 기록하며, 해당 라인은 다음과 같은 형태를 띱니다.
Request 'REGISTER' from '<sip:1000@198.51.100.20>' failed for '198.51.100.20:5060' (callid: 5f1a5c0d) - No matching endpoint found이 문제에 실질적인 노력을 기울여야 하는 이유는 금전적 피해 때문입니다. 탈취된 내선 번호는 고가의 국제 전화를 거는 데 사용되며, 종종 공격자에게 수익이 배분되는 프리미엄 요금 번호로 연결됩니다. 귀하의 자격 증명을 사용하여 통화가 이루어지므로 요금은 귀하에게 청구됩니다. 이 공격은 기계적인 속도로 진행되며 보통 야간에 발생합니다.
다음 6가지 통제 항목은 선택 사항이 아닌 필수적인 강화 조치입니다.
- 내선 번호와 동일하거나 짧은 단어를 비밀번호로 설정하지 마십시오.
openssl rand -base64 24을 사용하여 비밀번호를 생성하고 붙여넣으십시오. - 익명 인바운드 통화를 허용하지 마십시오. PJSIP는 기본적으로 식별되지 않은 통화를 거부하며,
anonymous라는 이름의 엔드포인트를 생성해야만 수락합니다. 해당 엔드포인트를 생성하지 마십시오. - 위에서 설명한 바와 같이, 트렁크 컨텍스트를 외부 발신이 가능한 컨텍스트와 분리하십시오.
- ufw 및 제공업체의 네트워크 방화벽을 통해 소스 주소별로 시그널링을 제한하십시오.
- SIP 트렁크 제공업체에 지출 한도를 설정하고, 사용하지 않는 국제 전화 목적지를 비활성화하십시오. 이는 다른 통제 수단이 실패했을 때 손실을 제한할 수 있는 유일한 방법입니다.
- Asterisk 로그를 대상으로 fail2ban을 실행하십시오.
Asterisk는 또한 특정 주소에서 일치하지 않는 요청이 반복될 경우 보안 이벤트를 발생시킬 수 있습니다. pjsip.conf의 [global] 섹션은 unidentified_request_count(기본값 5)와 unidentified_request_period(기본값 5초) 설정을 사용합니다. 이 설정은 5초 이내에 동일한 주소에서 5번의 일치하지 않는 요청이 발생하면 fail2ban이 대응할 수 있는 보안 이벤트를 생성함을 의미합니다.
fail2ban으로 스캐너 차단하기
fail2ban은 이미 작성된 asterisk jail을 제공합니다. 이 설정은 5060 및 5061 포트를 다루며, /var/log/asterisk/messages을 읽고, 기본값으로 maxretry = 10를 사용합니다. /etc/fail2ban/jail.local에서 활성화하기 전까지는 jail이 작동하지 않습니다.
[asterisk]
enabled = true
maxretry = 5
findtime = 600
bantime = 86400sudo systemctl restart fail2ban
sudo fail2ban-client status asterisk정상적으로 작동하면 jail의 로그 파일과 현재 차단된 주소의 수가 표시됩니다. 공개된 5060 포트의 경우 하루 안에 차단된 주소 수가 0이 아니게 됩니다. 제공된 필터는 위의 No matching endpoint found 알림과 일치하며, Asterisk의 구조화된 SecurityEvent 라인과도 일치합니다. 이러한 이벤트는 /etc/asterisk/logger.conf에서 주석 처리된 별도의 로그 채널로 전송되므로, 해당 이벤트를 사용하려면 그곳에서 활성화하고 jail의 logpath에 파일을 추가하십시오.
[logfiles]
console => notice,warning,error
messages.log => notice,warning,error
security.log => securitysudo asterisk -rx "logger reload"를 사용하여 로거를 다시 로드하십시오. 이 필터는 asterisk.service을 위한 journalmatch도 포함하고 있으므로, 로그 파일을 유지하고 싶지 않다면 journal 백엔드를 사용할 수 있습니다. 설치, jail.local 구조, 그리고 실수로 차단한 주소를 해제하는 방법은 Ubuntu 24.04용 fail2ban 가이드에서 다룹니다.
원거리 VPS에서의 지연 시간과 코덱 선택
지연 시간은 지리적 요인에 의해 결정되며 설정으로 해결할 수 없습니다. ITU-T G.114는 일반적인 대화 시 단방향 지연 시간을 150 ms 미만으로 유지할 것을 권장하며, 최대 400 ms까지는 사용 가능한 수준으로 간주합니다. 전화기에서 발생한 오디오는 VPS를 거쳐 트렁크 제공업체로 전달되므로, VPS가 잘못된 지역에 있으면 이 경로를 두 번 왕복하게 됩니다. 전화기와 제공업체 중 가까운 곳에 VPS를 배치하십시오. 두 지점이 서로 멀다면 전화기 쪽에 가깝게 배치하는 것이 좋습니다. 전화기 쪽 구간은 일반적으로 지터가 가장 심한 일반 소비자용 인터넷을 통과하기 때문입니다.
코덱 선택은 통화당 대역폭을 결정합니다. 여기서 다루는 각 코덱은 20 ms마다 패킷을 전송하며, 이는 초당 50개의 패킷에 해당합니다. 각 패킷은 오디오 페이로드 외에 IP, UDP, RTP 헤더로 40바이트를 추가로 포함합니다.
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 프레이밍을 사용하면 회선상에서 약간의 오버헤드가 추가됩니다.
트랜스코딩은 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의 공인 IP가 인터페이스에 직접 할당되어 있다면 NAT 처리가 필요 없습니다. 만약 제공업체가 VPS에 사설 IP를 할당하고 1:1 공인 IP 매핑을 사용하는 경우, transport 설정에 공인 IP를 지정하고 local_net에 사설 IP 대역을 기재하십시오.
[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는 기본적으로 notice 레벨 이상의 메시지만 messages.log에 기록합니다. 문제를 재현하는 동안 core set verbose 4와 pjsip set logger on을 사용하여 로그 레벨을 높이십시오. SIP 로거는 모든 패킷을 기록하므로 작업이 끝나면 반드시 두 설정을 다시 끄십시오.
공개하기 전에
PBX는 직접 호스팅하는 다른 서비스와는 다릅니다. 웹 애플리케이션이 고장 나면 페이지 하나가 보이지 않을 뿐이지만, PBX가 고장 나면 잠든 사이 몇 시간 만에 막대한 전화 요금이 청구될 수 있습니다. PBX는 다른 작업을 수행하지 않는 전용 VPS에서 운영하십시오. 5060 포트는 알려진 주소로만 접근을 제한하고, 모든 내선 번호에는 무작위 비밀번호를 설정하며, 트렁크 계정에는 지출 한도를 지정해야 합니다. 서버의 나머지 부분은 다른 공개 서버와 동일한 기본 보안 수준을 유지해야 하며, VPS 호스팅의 실제 안전성에 대한 이 분석에서 그 내용을 확인할 수 있습니다.
FAQ
자체 호스팅 VoIP 서버를 위해 열어야 하는 포트는 무엇입니까?
UDP 및 TCP를 통한 SIP 시그널링에는 5060 포트가 필요하며, SIP over TLS를 사용하는 경우 5061 포트가 필요합니다. 또한 RTP 미디어를 위해 UDP 포트 범위를 열어야 합니다. Asterisk의 샘플 rtp.conf는 10000에서 20000까지를 사용하며, 컴파일된 기본값은 5000에서 31000까지입니다. 각 통화는 해당 범위에서 2개의 포트를 점유하므로, 200개의 포트 범위는 100개의 동시 통화를 처리할 수 있습니다. RTP 범위는 UDP로 열고, 5060 포트는 모든 사람에게 개방하는 대신 서비스 제공업체의 주소와 본인의 네트워크로 제한하십시오.
Asterisk를 단독으로 설치해야 합니까, 아니면 FreePBX를 사용해야 합니까?
공격 표면을 작게 유지하고 설정 파일을 git으로 관리하며 직접 다이얼플랜을 작성할 의향이 있다면 순수 Asterisk를 설치하십시오. 내선 번호, 음성 사서함, 통화 대기열을 위한 GUI가 필요하다면 FreePBX를 설치하십시오. 2026년 8월 기준, FreePBX 17 설치 프로그램은 기본 Debian 12 환경을 요구하며 Asterisk, 웹 서버, 데이터베이스 서버, PHP를 함께 설치하므로 전용 VPS를 할당하는 것이 좋습니다. FreePBX는 관리하는 설정 파일을 자동으로 재생성하므로, 직접 수정해야 하는 내용은 _custom 파일에 작성해야 합니다.
통화 연결 후 왜 오디오가 들리지 않습니까?
시그널링은 성공했으나 미디어 연결이 실패한 경우입니다. SIP는 5060 포트에서 통화를 설정하지만, 오디오는 RTP 범위 내의 별도 UDP 흐름으로 전송되는데 이 과정에서 패킷이 차단되고 있을 가능성이 큽니다. rtp.conf에 설정된 범위가 방화벽에 열려 있는 범위와 일치하는지 확인하고, 서버 방화벽뿐만 아니라 서비스 제공업체의 네트워크 방화벽도 점검하십시오. 통화 중에 sudo tcpdump -ni any udp portrange 10000-10200을 실행해 보십시오. 패킷이 전혀 보이지 않는다면 서버에 도착하기 전에 차단되고 있는 것입니다.
SIP 무차별 대입 공격과 통신 사기를 어떻게 막을 수 있습니까?
모든 내선 번호에 길고 무작위인 비밀번호를 부여하십시오. 내선 번호와 동일한 비밀번호는 절대 사용하지 마십시오. 트렁크에서 사용하는 컨텍스트와 외부 발신이 가능한 컨텍스트를 분리하여, 수신 통화가 계정을 통해 외부로 다시 발신되지 않도록 하십시오. 5060 포트는 서비스 제공업체의 주소로만 제한하십시오. fail2ban에서 asterisk 감옥(jail)을 활성화하십시오. 이 기능은 /var/log/asterisk/messages를 읽고 No matching endpoint found 실패를 유발하는 주소를 차단합니다. 마지막으로, 서비스 제공업체 측에서 지출 한도를 설정하고 사용하지 않는 국제 목적지를 차단하십시오. 다른 모든 보안 조치가 실패했을 때 손실을 막을 수 있는 유일한 방법입니다.
먼 지역의 VPS를 사용하면 통화 품질이 떨어집니까?
그렇습니다. 오디오는 '전화기에서 VPS', 'VPS에서 트렁크 제공업체'라는 두 구간을 거치기 때문입니다. ITU-T G.114는 단방향 지연 시간을 150 ms 미만으로 권장하는데, 위치가 좋지 않은 VPS는 거리만으로도 이 예산의 대부분을 소모할 수 있습니다. 지터가 가장 심한 일반 소비자용 인터넷을 거치는 구간을 고려하여, 전화기와 가까운 지역을 선택하십시오. 코덱 선택은 지연 시간을 해결하지 못하고 대역폭만 변경합니다. G.729는 데이터 용량을 줄여주지만 200 ms가 넘는 경로를 구제할 수는 없습니다.