lavariega.com

Mi espacio de notas, hablo de Tecnología.
baresip

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:

  1. instalarlo con el gestor de paquetes si tu distro lo incluye
  2. 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:
Androidhttps://github.com/juha-h/baresip-studioJuha
Arch Linuxhttps://aur.archlinux.org/packages/baresip/Dmitrij D. Czarkoff
CentOS Stream 9dnf install epel-release, then dnf install baresipRobert Scheck
CentOS Stream 10dnf install epel-release, then dnf install baresipRobert Scheck
Debian 11.0 (Bullseye)https://packages.debian.org/bullseye/baresipDebian VoIP team
Debian 12.0 (Bookworm)https://packages.debian.org/bookworm/baresipDebian VoIP team
Fedora 42dnf install baresipRobert Scheck
Fedora 43dnf install baresipRobert Scheck
Fedora Rawhidednf install baresipRobert Scheck
FreeBSD 10.1http://www.freshports.org/audio/baresip/
iOShttps://github.com/baresip/baresip-ios
Mac OS Xbrew install baresip or port install baresip
mingw-w64https://github.com/baresip/baresip-win32sreimers
OpenBSD 5.7http://ports.su/telephony/baresip/baresipDmitrij D. Czarkoff
OpenWRThttps://github.com/openwrt/telephonyJiri Slachta
RHEL 8dnf install epel-release, then dnf install baresipRobert Scheck
RHEL 9dnf install epel-release, then dnf install baresipRobert Scheck
RHEL 10dnf install epel-release, then dnf install baresipRobert Scheck
Raspberry Pi OSAndrew Webster
Rocky Linux 8dnf install epel-release, then dnf install baresipRobert Scheck
Rocky Linux 9dnf install epel-release, then dnf install baresipRobert Scheck
Rocky Linux 10dnf install epel-release, then dnf install baresipRobert 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?

Menú Baresip
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

Etiquetas:

Deja un comentario

No se publicará tu dirección de correo electrónico. Los campos obligatorios están marcados con *.

*
*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Apasionado de las tecnologías VoIP, Linux


aprendizaje asterisk audio brew call center Centos cli codecs comandos contraseñas desarrollo de software enfermedad Firewall free GNU google grandstream gratis internet Issabel ivr lavariega libros linux mac manuales Maquina Virtual marcacion mexico networking OpenSource raspberry rtp seguridad SIP sofphone sox ssh sysadmin telefonia tips ubuntu vim VirtualBox voip