Como usar ramais SIP em um servidor asterisk por NAT
Quando queremos proteger um servidor asterisk por trás de um firewall é necessário (pelo menos em IPv4) o uso de NAT para conseguirmos acesso ao mesmo. Vou tentar explicar de uma maneira simples os procedimentos necessários para a configuração.
1 – Subindo os módulos necessários (como root):
# modprobe iptable_nat
# modprobe ip_nat_sip
# modprobe ip_conntrack_sip
Se você quiser pode acrescentar no seu script de firewall ou então:
# echo "iptable_nat" >> /etc/modules
# echo "ip_nat_sip" >> /etc/modules
# echo "ip_conntrack_sip" >> /etc/modules
2 – Configurando o firewall:
Estamos partindo do suposto que você deve ser um admin precupado com a segurança e utiliza a política padrão da Chain FORWARD como DROP
Sendo assim temos:
Porta 2727: MGCP
Porta 4569: IAX2
Porta 5036: IAX1
Portas 5004 a 5082: SIP
Portas 10000 a 20000: RTP (aqui está o segredo para quem tentou fazer nat. A ramal registrou, faz a ligação mas quando atende, fica mudo. Quem ler sobre este protocolo entenderá o porquê)
Vamos ao que interessa então, acrescente ao seu script de firewall o seguinte (na variável que aponta para o servidor asterisk, substitua o valor para o IP correto pra você):
# Habilitando forward
echo 1 > /proc/sys/net/ipv4/ip_forward
PORTAS_ASTERISK="2727,4569,5036"
SERVIDOR_ASTERISK="192.168.0.50"
# Forwarding de portas (entrada e saída)
iptables -A FORWARD -p udp -m multiport --sport $PORTAS_ASTERISK -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p udp -m multiport --dport $PORTAS_ASTERISK -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p udp --sport 5004:5082 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p udp --dport 5004:5082 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p udp --sport 10000:20000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p udp --sport 10000:20000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Encaminhamento de portas para o servidor asterisk
iptables -t nat -A POSTROUTING -p udp --dport 5004:5082 -d $SERVIDOR_ASTERISK -j MASQUERADE
iptables -t nat -A PREROUTING -p udp -i $WAN --dport 5004:5082 -j DNAT --to $SERVIDOR_ASTERISK
iptables -t nat -A POSTROUTING -p udp --dport 10000:20000 -d $SERVIDOR_ASTERISK -j MASQUERADE
iptables -t nat -A PREROUTING -p udp -i $WAN --dport 10000:20000 -j DNAT --to $SERVIDOR_ASTERISK
iptables -t nat -A POSTROUTING -p udp --dport 5036 -d $SERVIDOR_ASTERISK -j MASQUERADE
iptables -t nat -A PREROUTING -p udp -i $WAN --dport 5036 -j DNAT --to $SERVIDOR_ASTERISK
iptables -t nat -A POSTROUTING -p udp --dport 2727 -d $SERVIDOR_ASTERISK -j MASQUERADE
iptables -t nat -A PREROUTING -p udp -i $WAN --dport 2727 -j DNAT --to $SERVIDOR_ASTERISK
iptables -t nat -A POSTROUTING -p udp --dport 4569 -d $SERVIDOR_ASTERISK -j MASQUERADE
iptables -t nat -A PREROUTING -p udp -i $WAN --dport 4569 -j DNAT --to $SERVIDOR_ASTERISK
3 – Preparando o servidor asterisk para suporte a NAT.
edite o arquivo sip.conf no seu servidor:
# nano -w /etc/asterisk/sip.conf
No final do arquivo, acresente o seguinte:
nat=yes
externip=seu ip público
localnet=sua rede local/máscara de sub-rede
bindport=5060
save e feche o arquivo. Agora reinicie o serviço
# /etc/init.d/asterisk restart
Pronto! o ambiente está preparado para receber os ramais SIP via NAT. Dúvidas, críticas construtivas e sugestões sempre são bem-vindas. Espero ter ajudado.
Amigo bom dia.
O servidor com IPTABLES aqui é o mesmo com o ASTERISK?
Se não, o passo 1 é feito em qual deles?
O parâmetro localnet (passo 3) se refere à rede entre o firewall e o asterisk?
Desde já, muito obrigado.
Bom dia. O Iptables é o Gateway/firewall do seu Asterisk. o parâmetro é a rede entre o firewall e o asterisk sim. Lembrando que estamos falando de IPv4. Se for IPv6, é diferente.
Olá, bom dia. O firewall é outro servidor, geralmente o gateway do asterisk. Sim, o localnet se refere a esta rede.
Bom dia. não, o iptables é um servidor com a finalidade de firewall, no caso. O procedimento deve ser realizado neste server. Sobre o parâmetro localnet, sim. É a mesma rede.