#!/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 # SIP/RTP liberados para toda a faixa RFC1918 (rede privada) na # interface LAN — necessário para softphones/ramais reais de agentes # registrarem no Asterisk, já que o OpenSIPS (que ficaria na frente, # ver docs/OPENSIPS.md) não foi implantado nesta fase. Avaliado # ANTES das regras de drop abaixo: nftables usa a primeira regra # terminante que casar. Origem fora do RFC1918 (ex.: internet # pública) continua caindo nas regras de drop — o Asterisk nunca # deve receber SIP de fora da rede privada (agente.md seção 5). ip saddr { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } iifname "ens18" udp dport 5060 accept ip saddr { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } iifname "ens18" tcp dport { 5060, 5061 } accept ip saddr { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } iifname "ens18" udp dport 10000-20000 accept # --- Serviços administrativos/telefônicos sensíveis do Asterisk --- # AMI/ARI nunca devem ser alcançáveis pela LAN (interface ens18), # mesmo de origem RFC1918 — só a aplicação (containers, via rede # Docker interna) precisa falar com eles. SIP/RTP de origem fora do # RFC1918 também caem aqui (bloqueados, ver acima). 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 } }