전화 음성에서 웹 자막까지 2 — Asterisk 계정 1001과 목적지 7000
endpoint·auth·aor와 dialplan을 나눠 읽으며 SIP 등록과 발신의 차이를 익힙니다. shell 설치 스크립트, PJSIP, ARI와 Python Gateway의 역할을 실제 설정으로 연결합니다.
목차(16개 항목)
SIP 전화 앱에 계정 하나를 추가했는데 Asterisk 설정에는 endpoint, auth, aor가 따로 보입니다. 게다가 로그인할 때 쓰는 1001과 전화할 때 누르는 7000도 다릅니다. 이 글은 이 둘을 분리해서 이해하는 데 집중합니다.
이 글은 저장소의 실제
pbx_gateway/pbx/install-config.sh를 읽어 설명합니다. 비밀번호와 토큰은 포함하지 않습니다. 설정을 새로 적용하거나 VM에서 통화를 실행한 기록은 이 글 작성 범위에 포함되지 않습니다.
시리즈 목차 #58 · 이전: 전화 시스템 지도 #58 · 다음: Wireshark로 SIP 읽기 #60
이번 글의 한 가지 개념: 계정과 전화 목적지는 다르다
이번 구성에서 두 숫자의 역할은 다음과 같습니다.
| 값 | 종류 | 질문으로 바꾸면 |
|---|---|---|
1001 | SIP endpoint·인증 사용자 | “누가 Asterisk에 등록하는가?” |
7000 | dialplan extension | “등록한 사용자가 어디로 전화하는가?” |
비유하면 1001은 사원증이고 7000은 사내 회의실 번호입니다. 사원증을 만들었다고 같은 번호의 회의실이 자동으로 생기지 않고, 회의실 번호를 만들었다고 로그인 계정이 자동으로 생기지도 않습니다.
정확한 기술 용어로는 1001이 PJSIP endpoint와 연결된 인증·연락처 구성이고, 7000은 extensions.conf의 dialplan이 처리하는 목적지입니다. SIP REGISTER는 단말의 현재 연락 가능한 Contact를 등록하고, INVITE는 별도로 세션 시작을 요청합니다. RFC 3261은 REGISTER를 연락처 등록, INVITE·ACK를 세션 설정, BYE를 세션 종료 메서드로 정의합니다.
endpoint, auth, aor를 한 장으로 보기
Asterisk 공식 문서는 endpoint를 SIP 단말의 동작 프로필, auth를 인증 정보, AoR(Address of Record)을 endpoint에 연락할 위치를 연결하는 객체로 설명합니다. endpoint가 다른 객체를 auth=와 aors=로 참조합니다. 자세한 관계는 PJSIP Configuration Sections and Relationships에서 확인할 수 있습니다.
| 객체 | 이 구성에서 맡는 일 | 헷갈리기 쉬운 점 |
|---|---|---|
| endpoint | transport, dialplan context, 허용 코덱, 미디어 정책 | 비밀번호나 현재 IP 자체가 아님 |
| auth | 1001의 Digest 인증 재료 | 여기의 비밀번호를 글·로그에 복사하면 안 됨 |
| aor | 등록된 Contact를 보관하고 endpoint의 도달 위치를 연결 | 전화번호 자체라기보다 연락처 집합에 가까움 |
공식 res_pjsip 설정 예제도 한 대의 SIP 전화가 Asterisk에 등록하는 경우 endpoint·auth·aor 세 객체를 연결합니다.
실제 설치 스크립트가 만드는 설정
아래는 저장소의 실제 설정을 이해하기 위한 비밀값 제거 발췌입니다. <SIP_PASSWORD>는 설명용 자리표시자이며 실제 값이 아닙니다.
현재 스크립트에서 allow 값은 고정 문자열이 아니라 AST_CODEC 환경 설정의 ulaw 또는 alaw로 생성됩니다. 위의 alaw는 현재 실습 구성을 설명하기 위한 값입니다.
bind=0.0.0.0:5060은 Asterisk가 VM의 모든 IPv4 인터페이스에서 UDP 5060을 수신한다는 뜻입니다. Linphone에 입력할 서버 주소가 0.0.0.0이라는 뜻도, 방화벽이 자동으로 열린다는 뜻도 아닙니다. Linphone에는 그때 다시 확인한 VM 주소를 넣어야 합니다.
direct_media=no는 단말끼리 RTP를 직접 보내도록 우회시키지 않고 Asterisk가 미디어 경로에 남게 하는 설정입니다. 이 실습에서는 Asterisk가 음성을 External Media 경로로 전달해야 하므로 중요한 선택입니다.
shell script와 PJSIP의 책임을 구분한다
install-config.sh는 SIP 프로토콜을 구현하지 않습니다. 이 스크립트가 하는 일은 다음과 같습니다.
- 환경 설정에 필요한 값이 있는지 검사합니다.
pjsip.conf,extensions.conf,rtp.conf같은 설정 파일을 임시 디렉터리에 만듭니다.- 파일 소유권과 권한을 지정해
/etc/asterisk에 설치합니다. - Asterisk 서비스를 재시작하고 endpoint를 조회합니다.
실제 SIP 메시지를 해석하고 응답하는 엔진은 Asterisk의 res_pjsip 계열 모듈입니다. 스크립트는 그 엔진이 읽을 설정을 자동으로 만드는 설치 도구입니다.
7000으로 전화하면 실행되는 dialplan
저장소의 실제 extensions.conf 생성 부분은 다음 흐름입니다.
데이터 흐름을 순서대로 읽으면 다음과 같습니다.
- endpoint
1001의context=from-linphone이 발신 요청을 이 문맥으로 보냅니다. - 목적지가
7000이면 해당 extension 규칙을 찾습니다. Answer()가 통화를 응답합니다.Stasis(pbx-gateway,live-call)가 채널을 ARI 애플리케이션으로 넘깁니다.- 이후 Python Gateway는 ARI의
StasisStart이벤트를 받아 RTP 처리 런타임을 시작합니다.
따라서 “Python이 SIP 전화를 받는다”는 설명은 정확하지 않습니다. SIP와 dialplan은 Asterisk가 처리하고, Python은 ARI로 넘겨진 통화 제어 이벤트와 RTP 미디어를 처리합니다.
실습 하나: 설정의 세 객체와 연락처를 읽기
이 실습은 설정을 바꾸지 않는 조회 실습입니다. 실행 위치는 Ubuntu VM입니다. 이미 Mac 터미널이라면 먼저 VM에 들어가고, 이미 VM이라면 limactl을 다시 실행하지 않습니다.
Mac에서 VM으로 들어갈 때:
VM에서 조회:
명령의 의미는 다음과 같습니다.
| 명령 | 확인하는 것 |
|---|---|
pjsip show endpoint 1001 | 1001의 context, 코덱, auth/aor 연결 |
pjsip show aor 1001 | AoR의 Contact 정책과 현재 연결 정보 |
pjsip show contacts | 실제 등록된 단말의 Contact 목록 |
dialplan show 7000@from-linphone | 7000에 연결된 실행 단계 |
설명용 예상 결과
실제 Asterisk 버전과 등록 상태에 따라 줄 순서와 문구는 달라집니다. 아래는 무엇을 찾아야 하는지 보여주는 축약 예시입니다.
Contact가 비어 있어도 endpoint 정의가 사라진 것은 아닙니다. endpoint는 서버 설정이고, Contact는 단말이 성공적으로 등록했을 때 생기는 현재 도달 정보입니다.
결과를 해석하는 순서
- endpoint가 보이는가: 설정 파일이 로드됐는지 확인합니다.
- context가
from-linphone인가: 발신 요청이 올바른 dialplan으로 가는지 확인합니다. - 허용 코덱이 의도한
alaw또는ulaw인가: 단말·Gateway 설정과 맞아야 합니다. - Contact가 있는가: Linphone 등록 성공 여부를 확인합니다.
7000@from-linphone이 보이는가: 계정 등록과 별개로 목적지 규칙이 존재하는지 확인합니다.
등록이 성공했다고 7000 통화와 RTP가 모두 성공한 것은 아닙니다. 등록, 발신, 미디어는 서로 다른 증거가 필요합니다. 다음 글에서 패킷으로 이 경계를 확인합니다.
흔한 오류
Endpoint 1001 not found
설정이 아직 적용되지 않았거나 Asterisk가 다른 설정 파일을 읽고 있을 수 있습니다. 서비스 로그와 pjsip show endpoints를 확인합니다. 비밀번호가 들어 있는 설정 파일 전체를 외부에 붙여넣지 않습니다.
endpoint는 보이는데 Contact가 없다
Linphone이 아직 등록하지 않았거나 VM 주소·UDP 5060·인증 정보가 맞지 않을 수 있습니다. 예전에 사용한 192.168.64.2는 당시 관찰값일 뿐입니다. 현재 주소는 Mac에서 다음 읽기 명령으로 다시 확인합니다.
1001로 전화했는데 원하는 동작이 없다
현재 live-call dialplan 목적지는 7000입니다. 1001 endpoint를 만들었다고 exten => 1001 규칙이 자동으로 생성되지는 않습니다.
등록은 되는데 7000 발신이 실패한다
endpoint의 context와 dialplan의 context가 일치하는지, 7000@from-linphone이 실제로 로드됐는지 확인합니다. 이후 SIP 응답 코드와 SDP는 다음 글 #60의 Wireshark 절차로 구분합니다.
단계별 과제
- 종이에
1001과7000을 각각 “신원”과 “목적지”로 적습니다. - 네 조회 명령의 결과에서 endpoint, AoR, Contact, dialplan을 한 줄씩 찾습니다.
- Contact가 없을 때와 dialplan이 없을 때 사용자 증상이 어떻게 다를지 적습니다.
- 실제 비밀번호, SIP Digest 값, 사설 IP가 포함된 출력을 공개 문서에 붙이지 않습니다.
확인 문제
1001endpoint를 만들면1001로 걸려오는 dialplan도 자동 생성될까요?aor에 Contact가 없다는 사실은 무엇을 뜻할까요?bind=0.0.0.0:5060을 Linphone의 서버 주소로 입력하면 안 되는 이유는 무엇일까요?Connected to ARI application로그만으로 SIP 등록과 전화 음성 수신까지 증명할 수 있을까요?
정답은 각각 “아니다”, “현재 등록된 도달 연락처가 없을 수 있다”, “수신 bind 주소이지 접속 목적지 주소가 아니기 때문이다”, “아니다. ARI 제어 연결의 증거일 뿐이다”입니다.