Files
b2bcall/infrastructure/nftables/b2bcall.nft
B2BCall Bootstrap eee6d7aece feat: add asterisk pjsip integration
- infrastructure/docker/asterisk.Dockerfile: Asterisk 22.10.1 LTS compilado
  do fonte oficial (Debian trixie nao distribui mais o pacote asterisk),
  com PJSIP, AMI, ARI, res_odbc/res_config_odbc, cdr_adaptive_odbc,
  cel_odbc, app_queue
- infrastructure/asterisk/config: templates renderizados no entrypoint
  (secrets via envsubst, nunca versionados) + sorcery.conf/extconfig.conf
  para PJSIP realtime, dialplan de teste (extensao 600)
- infrastructure/postgres/init/002-asterisk-realtime.sql: tabelas
  ps_endpoints/ps_auths/ps_aors/ps_contacts/ps_endpoint_id_ips/
  ps_registrations/cdr/cel no schema 'asterisk'
- infrastructure/nftables: protege AMI/ARI/SIP contra acesso pela LAN
  (interface ens18), trazido da Fase 9 do TODO para ja, sem afetar SSH
  nem a rede interna do Docker
- docker-compose.yml: servico asterisk em network_mode: host (RTP);
  Postgres publicado em 127.0.0.1:5432 (nao 0.0.0.0) para o Asterisk
  alcanca-lo, ja que host network nao enxerga a rede Docker interna

Testado: AMI login, ARI com auth (401 sem auth), pjsip realtime
consultando Postgres sem erro, dialplan originate -> CDR e CEL gravados
corretamente, healthcheck do compose passando.
2026-08-27 10:47:28 -03:00

48 lines
2.0 KiB
Plaintext

#!/usr/sbin/nft -f
# Regras de firewall do B2BCall.
#
# IMPORTANTE: este arquivo NUNCA usa "flush ruleset" — o Docker gerencia suas
# próprias tabelas iptables-nft (visíveis como "table ip nat" / "table ip
# filter" com o aviso "managed by iptables-nft, do not touch"). Uma tabela
# separada (`inet b2bcall_fw`) convive com elas sem conflito: cada tabela
# anexada ao hook "input" é avaliada em ordem de prioridade; um veredito de
# "drop" nesta tabela encerra o processamento do pacote antes mesmo de ele
# chegar às regras do Docker, sem jamais apagar as regras do Docker.
#
# SSH (porta 22) é sempre permitido — nunca deve ficar bloqueado.
#
# Instalado/atualizado via systemd unit b2bcall-nftables.service (ver
# infrastructure/nftables/b2bcall-nftables.service), que roda:
# nft delete table inet b2bcall_fw (ignora erro se não existir)
# nft -f este arquivo
# após o docker.service subir.
table inet b2bcall_fw {
chain input_admin_protect {
type filter hook input priority filter - 1; policy accept;
# Loopback sempre liberado
iifname "lo" accept
# Conexões já estabelecidas / relacionadas sempre liberadas
ct state established,related accept
# Redes internas dos bridges Docker (comunicação entre containers e
# entre containers <-> serviços do Asterisk em host network)
ip saddr 172.16.0.0/12 accept
# SSH nunca é bloqueado
tcp dport 22 accept
# --- Serviços administrativos/telefônicos sensíveis do Asterisk ---
# Nunca devem ser alcançáveis pela LAN (interface ens18). Habilitar
# exceções pontuais aqui somente quando o IP do OpenSIPS/tronco for
# conhecido e explicitamente autorizado (ver docs/OPENSIPS.md, a
# ser criado na Fase 2 de telefonia).
iifname "ens18" tcp dport { 5038, 8088, 8089 } counter drop
iifname "ens18" tcp dport { 5060, 5061 } counter drop
iifname "ens18" udp dport 5060 counter drop
iifname "ens18" udp dport 10000-20000 counter drop
}
}