Baresip en macOS y Linux: instalación, configuración SIP y panel
Si trabajas con Asterisk, OpenSIPs, Freeswitch, SIP trunks, extensiones remotas o laboratorios VoIP, Baresip es una de las herramientas más ligeras y útiles que puedes tener. Es un cliente SIP modular, de consola, con soporte para audio, video, STUN, TURN, ICE, TLS, HTTP y múltiples cuentas, y sigue siendo una opción muy práctica para pruebas de telefonía IP, diagnóstico de señalización y validación de audio RTP.

En esta guía te explico qué es Baresip, cómo instalarlo en macOS y Linux, cómo generar su configuración inicial y cómo usar un panel Bash para controlarlo por HTTP. La idea es que te sirva como base para un blog técnico de telefonía y luego tú puedas agregar capturas, diagramas o screenshots de CLI.
Guía completa de Baresip: instalación, configuración SIP y control HTTP en macOS y Linux
Baresip es un SIP User-Agent modular. En pocas palabras, funciona como un softphone técnico orientado a laboratorio, troubleshooting e integración. Soporta SIP, SDP, RTP/RTCP, STUN/TURN/ICE, IPv4/IPv6, múltiples codecs y un enfoque muy flexible basado en módulos. El proyecto también documenta que genera automáticamente sus archivos de configuración en el primer arranque.
En un entorno de telefonía IP, nos sirve muy bien para:
- Registrar extensiones SIP
- Hacer pruebas contra Asterisk
- Validar NAT y audio bidireccional
- Revisar trazas SIP
- Probar DTMF, codecs y transfers
- Automatizar llamadas desde scripts
- Crear un softphone técnico o un panel web local sobre el cliente
Ventajas de usar Baresip en laboratorios SIP
A diferencia de otros softphones más “visuales”, Baresip destaca por ser ligero, scriptable y modular. Además, el proyecto lista soporte para CoreAudio en macOS y drivers comunes de Linux, junto con módulos de NAT traversal y un servidor HTTP embebido.
Eso lo vuelve ideal para perfiles como:
- Ingenieros VoIP
- Administradores de PBX
- Integradores SIP
- Equipos de QA en telefonía
- Desarrolladores que quieran construir un softphone o una UI encima de este motor.
Cómo instalar Baresip en macOS

En macOS, la forma más rápida y estable es usar Homebrew (En caso de que no uses howbrew en mac, busca como instalarlo en google, hay mucha documentación). La fórmula oficial de Homebrew existe y actualmente lista soporte de botella para macOS Apple Silicon e Intel, además de depender de libre y openssl@3.
Instalación en Mac con Homebrew
brew install baresip
Verificar la instalación
baresip --version
Primer arranque
baresip
La primera vez que lo ejecutes, Baresip generará su estructura base de configuración dentro de tu home, normalmente en:
cd ~/.baresip
Ahí verás archivos como:
- config
- accounts
- contacts
- uuid
Ese comportamiento está documentado en el repositorio oficial.
Cómo instalar Baresip en Linux

En Linux hay dos caminos comunes:
- instalarlo con el gestor de paquetes si tu distro lo incluye
- compilarlo desde fuente usando CMake, que es el camino que el proyecto documenta de forma más estable para releases
La wiki oficial de instalación describe el flujo de compilación usando CMake, y el README del proyecto indica que se construye con dependencias base como libre y openssl.
Opción recomendada: compilar release estable
1) Descargar el release estable
Descarga el release más reciente desde GitHub Releases.
2) Pasos para Compilar
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
sudo cmake --install build
Primer arranque en Linux
Validamos que se crearon los archivos, y después ejecutamos.
ls -la ~/.baresip
baresip
Otros Linux
Esta tabla nos muestra las plataformas soportadas, asi como en algunos casos la instalación de una manera de paquete.
| Platform/OS: | Package: | Maintainer: |
|---|---|---|
| Android | https://github.com/juha-h/baresip-studio | Juha |
| Arch Linux | https://aur.archlinux.org/packages/baresip/ | Dmitrij D. Czarkoff |
| CentOS Stream 9 | dnf install epel-release, then dnf install baresip | Robert Scheck |
| CentOS Stream 10 | dnf install epel-release, then dnf install baresip | Robert Scheck |
| Debian 11.0 (Bullseye) | https://packages.debian.org/bullseye/baresip | Debian VoIP team |
| Debian 12.0 (Bookworm) | https://packages.debian.org/bookworm/baresip | Debian VoIP team |
| Fedora 42 | dnf install baresip | Robert Scheck |
| Fedora 43 | dnf install baresip | Robert Scheck |
| Fedora Rawhide | dnf install baresip | Robert Scheck |
| FreeBSD 10.1 | http://www.freshports.org/audio/baresip/ | |
| iOS | https://github.com/baresip/baresip-ios | |
| Mac OS X | brew install baresip or port install baresip | |
| mingw-w64 | https://github.com/baresip/baresip-win32 | sreimers |
| OpenBSD 5.7 | http://ports.su/telephony/baresip/baresip | Dmitrij D. Czarkoff |
| OpenWRT | https://github.com/openwrt/telephony | Jiri Slachta |
| RHEL 8 | dnf install epel-release, then dnf install baresip | Robert Scheck |
| RHEL 9 | dnf install epel-release, then dnf install baresip | Robert Scheck |
| RHEL 10 | dnf install epel-release, then dnf install baresip | Robert Scheck |
| Raspberry Pi OS | Andrew Webster | |
| Rocky Linux 8 | dnf install epel-release, then dnf install baresip | Robert Scheck |
| Rocky Linux 9 | dnf install epel-release, then dnf install baresip | Robert Scheck |
| Rocky Linux 10 | dnf install epel-release, then dnf install baresip | Robert Scheck |
| Ubuntu 18.04 (Bionic) | https://packages.ubuntu.com/bionic/baresip | |
| Ubuntu 20.04 (Focal) | https://packages.ubuntu.com/focal/baresip |
En el caso de Windows no lo puede probar, pero dejo el link de la referencia donde indican como se puede usar.

Configuración inicial de Baresip
Después de instalarlo, el flujo básico es siempre el mismo, Arrancar por primera vez, revisar la carpeta de configuración, editar las cuentas.
baresip
ls -la ~/.baresip
cat ~/.baresip/accounts
Ejemplo de una cuenta del archivo de configuración.
<sip:1003@test10.lavariega.com>;auth_user=1003;auth_pass=TU_PASSWORD
Si estás detrás de NAT y quieres mejorar el manejo de media, puedes agregar STUN:
<sip:1003@test10.lavariega.com>;auth_user=1003;auth_pass=TU_PASSWORD;medianat=stun;stunserver="stun:stun.l.google.com:19302"
El proyecto documenta soporte para módulos de STUN, TURN e ICE, y su wiki de configuración explica la estructura general de archivos y parámetros.
Comandos básicos útiles para telefonía SIP
Una vez registrado, estos comandos son los más usados a mi consideración:
/uastat
/reginfo
/siptrace
/dial 1001
/accept
/hangup
/listcalls
Para troubleshooting SIP los más importantes suelen ser:
- /uastat para revisar la cuenta
- /reginfo para confirmar registro
- /siptrace para ver señalización
- /listcalls para llamadas activas
Crea tu propio sofphone en linea de comandos.
Me di a la tarea de usar baresip para tener usarlo de motor como cliente sip y le agregue un pequeño script en bash para controlarlo. Si te interesa tenerlo como herramienta te dejo los pasos.
Primero necesitamos habilitar el http de baresip. Una de las funciones más interesantes para laboratorio es el módulo httpd.so, que expone un servidor HTTP embebido para controlar Baresip desde navegador o curl. En ~/.baresip/config (Para seguridad, lo mejor es dejarlo en 127.0.0.1 si solo lo vas a usar localmente.):
module httpd.so
http_listen 127.0.0.1:8000
Volvemos a ejecutar baresip, despues probamos en otra pestaña. Los 3 curl ejecutan acciones de baresip (1: valida el servicio, 2: muestra el menú de ayuda, 3: marca a la extension 1001)
baresip
curl "http://127.0.0.1:8000/"
curl "http://127.0.0.1:8000/?h"
curl "http://127.0.0.1:8000/?d1001"
Bash UI para controlar Baresip por HTTP
Cree un pequeño scrip para controlar las funciones de baresip desde un menú. Me gustaría en un futuro hacer un sotphone pero por ahora no. Guarda el script y ejecutalo. ¿Apoco no quedo bonito?

nano baresip_http_ui.sh
chmod +x baresip_http_ui.sh
./baresip_http_ui.sh
Contenido del scrip baresip_http_ui.sh
#!/usr/bin/env bash
BASE_URL="${BARESIP_URL:-http://127.0.0.1:8000}"
CURL_BIN="$(command -v curl)"
TIMEOUT=3
MONITOR_INTERVAL="${MONITOR_INTERVAL:-3}"
# Colores
RED='\033[0;31m'
GRN='\033[0;32m'
YLW='\033[1;33m'
BLU='\033[0;34m'
CYN='\033[0;36m'
MAG='\033[0;35m'
WHT='\033[1;37m'
DIM='\033[2m'
NC='\033[0m'
trap 'echo; echo -e "${YLW}Saliendo...${NC}"; exit 0' INT TERM
LAST_HTTP_STATUS="UNKNOWN"
LAST_REG_STATUS="DESCONOCIDO"
LAST_CALL_STATUS="DESCONOCIDO"
require_curl() {
if [ -z "$CURL_BIN" ]; then
echo -e "${RED}Error:${NC} curl no está instalado."
exit 1
fi
}
pause() {
echo
read -r -p "Presiona Enter para continuar..." _
}
strip_html() {
awk '
/<pre>/ {inpre=1; sub(/.*<pre>/,""); print; next}
/<\/pre>/ {sub(/<\/pre>.*/,""); print; inpre=0; next}
inpre {print}
' \
| sed '/^[[:space:]]*$/d'
}
clean_output() {
sed '/^err: Undefined error: 0 \[0\]$/d'
}
show_baresip_down() {
echo -e "${RED}Baresip está caído o el servicio HTTP no responde.${NC}"
echo -e "${YLW}Debes iniciar baresip para usar este panel.${NC}"
echo
echo "Ejemplo:"
echo " baresip"
}
http_raw() {
local query="$1"
"$CURL_BIN" -fsS --max-time "$TIMEOUT" "${BASE_URL}/?${query}" 2>&1
}
http_root() {
"$CURL_BIN" -fsS --max-time "$TIMEOUT" "${BASE_URL}/" 2>&1
}
http_call() {
local query="$1"
local url="${BASE_URL}/?${query}"
echo -e "${DIM}GET ${url}${NC}"
echo
local response
response="$(http_raw "$query")"
local rc=$?
if [ $rc -ne 0 ]; then
show_baresip_down
echo -e "${DIM}${response}${NC}"
return 1
fi
local cleaned
cleaned="$(printf '%s\n' "$response" | strip_html | clean_output)"
if [ -n "$cleaned" ]; then
printf '%s\n' "$cleaned"
else
echo -e "${YLW}Sin contenido devuelto.${NC}"
fi
return 0
}
get_clean_response() {
local query="$1"
local response
response="$(http_raw "$query")" || return 1
printf '%s\n' "$response" | strip_html | clean_output
}
refresh_status_cache() {
local out reg calls active_count
out="$(http_root)"
if [ $? -ne 0 ]; then
LAST_HTTP_STATUS="DOWN"
LAST_REG_STATUS="NO DISPONIBLE"
LAST_CALL_STATUS="NO DISPONIBLE"
return 1
fi
LAST_HTTP_STATUS="OK"
reg="$(get_clean_response "r" 2>/dev/null)"
if printf '%s\n' "$reg" | grep -Eqi 'No User Agents|No SIP accounts|0 user agents|empty'; then
LAST_REG_STATUS="SIN REGISTRO"
elif printf '%s\n' "$reg" | grep -Eq '^[[:space:]]*[0-9]+[[:space:]]*-[[:space:]].*[[:space:]]OK([[:space:]]|$)'; then
LAST_REG_STATUS="REGISTRADO"
elif printf '%s\n' "$reg" | grep -Eqi 'Expires[[:space:]]+[0-9]+s'; then
LAST_REG_STATUS="REGISTRADO"
elif printf '%s\n' "$reg" | grep -Eqi 'fail|error|forbidden|unauthorized|timeout|unreachable|denied'; then
LAST_REG_STATUS="ERROR"
else
LAST_REG_STATUS="SIN REGISTRO"
fi
calls="$(get_clean_response "l" 2>/dev/null)"
active_count="$(printf '%s\n' "$calls" | sed -n 's/.*Active calls (\([0-9][0-9]*\)).*/\1/p' | head -n 1)"
if [ -n "$active_count" ]; then
if [ "$active_count" -gt 0 ]; then
LAST_CALL_STATUS="EN LLAMADA"
else
LAST_CALL_STATUS="SIN LLAMADA"
fi
else
LAST_CALL_STATUS="SIN LLAMADA"
fi
return 0
}
color_http_status() {
case "$LAST_HTTP_STATUS" in
OK) echo -e "${GRN}${LAST_HTTP_STATUS}${NC}" ;;
DOWN) echo -e "${RED}${LAST_HTTP_STATUS}${NC}" ;;
*) echo -e "${YLW}${LAST_HTTP_STATUS}${NC}" ;;
esac
}
color_reg_status() {
case "$LAST_REG_STATUS" in
REGISTRADO) echo -e "${GRN}${LAST_REG_STATUS}${NC}" ;;
ERROR) echo -e "${RED}${LAST_REG_STATUS}${NC}" ;;
*) echo -e "${YLW}${LAST_REG_STATUS}${NC}" ;;
esac
}
color_call_status() {
case "$LAST_CALL_STATUS" in
"EN LLAMADA") echo -e "${GRN}${LAST_CALL_STATUS}${NC}" ;;
"SIN LLAMADA") echo -e "${YLW}${LAST_CALL_STATUS}${NC}" ;;
*) echo -e "${MAG}${LAST_CALL_STATUS}${NC}" ;;
esac
}
print_header() {
clear
refresh_status_cache >/dev/null 2>&1
echo -e "${CYN}====================================================${NC}"
echo -e "${WHT} BARESIP HTTP CONTROL PANEL v2${NC}"
echo -e "${CYN}====================================================${NC}"
echo -e "${DIM}Endpoint:${NC} ${BASE_URL}"
echo -e "${DIM}HTTP:${NC} $(color_http_status) ${DIM}Registro:${NC} $(color_reg_status) ${DIM}Llamada:${NC} $(color_call_status)"
echo
}
print_menu() {
echo -e "${BLU}[1]${NC} Ver ayuda"
echo -e "${BLU}[2]${NC} Ver estado UA"
echo -e "${BLU}[3]${NC} Ver registro SIP"
echo -e "${BLU}[4]${NC} Listar llamadas"
echo -e "${BLU}[5]${NC} Marcar número/extensión"
echo -e "${BLU}[6]${NC} Contestar llamada"
echo -e "${BLU}[7]${NC} Colgar llamada"
echo -e "${BLU}[8]${NC} Estado SIP"
echo -e "${BLU}[9]${NC} Estado de red"
echo -e "${BLU}[10]${NC} Probar conectividad HTTP"
echo -e "${BLU}[11]${NC} Cambiar endpoint"
echo -e "${BLU}[12]${NC} Monitor en vivo"
echo -e "${BLU}[0]${NC} Salir"
echo
echo -e "${DIM}Atajos:${NC} h ayuda | u UA | r registro | l llamadas | a aceptar | b colgar | q salir"
echo
}
check_server() {
local out
out="$(http_root)"
local rc=$?
if [ $rc -eq 0 ]; then
echo -e "${GRN}OK:${NC} servidor HTTP de baresip accesible."
return 0
fi
show_baresip_down
echo -e "${DIM}${out}${NC}"
return 1
}
is_valid_dial_string() {
local s="$1"
[[ "$s" =~ ^[A-Za-z0-9+*#@._:-]+$ ]]
}
prompt_endpoint() {
echo -ne "${MAG}Nuevo endpoint${NC} ${DIM}(ej. http://127.0.0.1:8000)${NC}: "
read -r new_url
if [ -z "$new_url" ]; then
echo -e "${YLW}No se hizo ningún cambio.${NC}"
return
fi
if [[ ! "$new_url" =~ ^https?://[^[:space:]]+$ ]]; then
echo -e "${RED}URL inválida.${NC}"
return
fi
BASE_URL="$new_url"
echo -e "${GRN}Endpoint actualizado:${NC} $BASE_URL"
}
dial_action() {
local dest
echo -ne "${MAG}Número, extensión o SIP URI${NC}: "
read -r dest
if [ -z "$dest" ]; then
echo -e "${YLW}Cancelado.${NC}"
return
fi
if ! is_valid_dial_string "$dest"; then
echo -e "${RED}Destino inválido.${NC}"
echo "Ejemplos válidos:"
echo " 1001"
echo " 3317030866"
echo " sip:1001@callcenter5.lavariega.com"
return
fi
echo -e "${GRN}Marcando:${NC} $dest"
http_call "d${dest}"
}
monitor_view() {
while true; do
clear
echo -e "${CYN}====================================================${NC}"
echo -e "${WHT} BARESIP LIVE MONITOR${NC}"
echo -e "${CYN}====================================================${NC}"
echo -e "${DIM}Endpoint:${NC} ${BASE_URL}"
echo -e "${DIM}Refresco:${NC} ${MONITOR_INTERVAL}s"
echo
if ! refresh_status_cache >/dev/null 2>&1; then
echo -e "${RED}HTTP: DOWN${NC}"
echo -e "${YLW}Baresip no responde. Inícialo y vuelve a intentar.${NC}"
echo
echo "Presiona q para salir del monitor."
else
echo -e "${DIM}HTTP:${NC} $(color_http_status)"
echo -e "${DIM}Registro:${NC} $(color_reg_status)"
echo -e "${DIM}Llamada:${NC} $(color_call_status)"
echo
echo -e "${BLU}--- Registro SIP ---${NC}"
get_clean_response "r" 2>/dev/null || true
echo
echo -e "${BLU}--- Llamadas ---${NC}"
get_clean_response "l" 2>/dev/null || true
echo
echo -e "${BLU}--- UA ---${NC}"
get_clean_response "u" 2>/dev/null || true
echo
echo -e "${DIM}Presiona q para salir del monitor.${NC}"
fi
read -r -t "$MONITOR_INTERVAL" -n 1 key
if [ $? -eq 0 ] && [ "$key" = "q" ]; then
break
fi
done
}
main_loop() {
require_curl
while true; do
print_header
print_menu
echo -ne "${WHT}Selecciona una opción:${NC} "
read -r opt
echo
case "$opt" in
1|h)
http_call "h"
pause
;;
2|u)
http_call "u"
pause
;;
3|r)
http_call "r"
pause
;;
4|l)
http_call "l"
pause
;;
5|d)
dial_action
pause
;;
6|a)
echo -e "${GRN}Contestando llamada...${NC}"
http_call "a"
pause
;;
7|b)
echo -e "${YLW}Colgando llamada...${NC}"
http_call "b"
pause
;;
8|i)
http_call "i"
pause
;;
9|n)
http_call "n"
pause
;;
10)
check_server
pause
;;
11)
prompt_endpoint
pause
;;
12|m)
monitor_view
;;
0|q)
echo -e "${YLW}Hasta luego.${NC}"
exit 0
;;
*)
echo -e "${RED}Opción inválida.${NC}"
pause
;;
esac
done
}
main_loop
Si buscas un cliente SIP técnico para pruebas con Asterisk, laboratorio VoIP y automatización, Baresip sigue siendo una opción muy potente. En macOS la instalación por Homebrew es muy cómoda, en Linux la compilación desde release estable es el camino más sólido.
Además, su arquitectura modular y su interfaz HTTP lo convierten en una base muy interesante para construir:
- un panel Bash
- una UI local
- un softphone técnico
- automatizaciones SIP
- laboratorios de QA en telefonía

