nftables bloqueava incondicionalmente SIP (5060/udp) e RTP (10000-20000) vindos da interface LAN — impedia qualquer softphone real de registrar, já que o OpenSIPS que ficaria na frente (docs/OPENSIPS.md) não foi implantado. Liberado para toda a faixa RFC1918 (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), mantendo AMI/ARI bloqueados incondicionalmente. Aplicado ao vivo no servidor. Ramais: agora dá para ver e trocar a senha SIP diretamente no formulário de edição (GET /extensions/:id/password, decifra sob demanda — diferente da senha de login, a senha SIP é cifrada, não hasheada, porque o próprio Asterisk precisa dela em texto puro para autenticar; expor sob permissão extensions.update e auditado é razoável). Evita ter que redefinir toda vez que o operador esquece a senha configurada num softphone.
60 lines
2.9 KiB
Plaintext
60 lines
2.9 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
|
|
|
|
# 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
|
|
}
|
|
}
|