SIP x IPTables

Iniciado por arsaraiva, 20 de Agosto de 2016, 16:32

tópico anterior - próximo tópico

arsaraiva

Boa tarde amigos, estou enfrentando um problema entre o VOIP (SIP) e o IPTables.
O que está acontecendo é que quando executo a aplicação cliente VOIP (já testei o Twinkle e o Zoiper), ele consegue registrar ao serviço e quando mando chamar algum número, ele chega a chamar e fica chamando (por um tempo), mesmo que este número atenda. Ao mesmo tempo que ele inicia a chamada ele derruba a rede de tal forma que só reiniciando o roteador. Sei que é referente ao firewall pois quando liberei o INPUT, OUTPUT no IPTables (iptables -P INPUT ACCEPT) ele chegou a funcionar, porém cai na besteira de dar o comando iptables -F e -X, perdi todas as configurações e a aplicação voltou com o mesmo problema, só que agora, mesmo eu fazendo o INPUT e OUTPUT ACCEPT não funciona.

Atualmente meu iptables está assim:

#!/bin/bash
####################
# limpando tabelas #
####################
iptables -F &&
iptables -X &&
iptables -Z &&
iptables -F INPUT &&
iptables -F OUTPUT &&
iptables -F FORWARD &&
iptables -F POSTROUTING -t nat &&
iptables -F PREROUTING -t nat &&
iptables -t nat -F &&
iptables -t nat -X &&
iptables -F -t nat &&

######################
# Inicializa Modulos #
######################
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_LOG
modprobe ipt_REJECT
modprobe ipt_MASQUERADE
modprobe ip_tables
modprobe iptable_filter
modprobe nf_conntrack_ipv4
modprobe nf_nat_pptp
modprobe nf_conntrack_pptp
modprobe ip_gre
modprobe ppdev
modprobe ppp_generic
modprobe pppoatm
modprobe ppp_async
modprobe ppp_deflate

####################################
# liberando acesso interno da rede #
####################################
iptables -A INPUT -p tcp --syn -s 192.168.0.0/255.255.255.0 -j ACCEPT &&
iptables -A OUTPUT -p tcp --syn -s 192.168.0.0/255.255.255.0 -j ACCEPT &&
iptables -A FORWARD -p tcp --syn -s 192.168.0.0/255.255.255.0 -j ACCEPT &&
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --syn -s 127.0.0.1/255.0.0.0 -j ACCEPT

########################################
# compartilhando a web na rede interna #
########################################
iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o wlp2s0 -j MASQUERADE &&
echo 1 > /proc/sys/net/ipv4/ip_forward &&


#############
# Seguranca #
#############
# Protecao contra port scanners ocultos
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

#Protecoes contra ataques
iptables -A INPUT -m state --state INVALID -j DROP

# PROTEGE CONTRA SYNFLOOD.
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

# PROTEGE CONTRA ICMP BROADCASTING.
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# BLOQUEIA TRACEROUTE.
iptables -A INPUT -p udp --dport 33435:33525 -j DROP

# FECHA TODAS AS PORTAS TABELA INPUT PARA REDE EXTERNA, EXETO AS LIBERADAS ACIMA.
iptables -A INPUT -p tcp --syn -j DROP

# Protecao Contra IP Spoofing
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

# Ativando protecao contra responses bogus
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# Permite o redirecionamento seguro dos pacotes
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# Protege contra ping da morte
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# Protege contra os ataques do tipo "Syn-flood, DoS, etc"
iptables -A FORWARD -p tcp -m limit --limit 1/s -j ACCEPT

# Logar os pacotes mortos por inatividade
iptables -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG

# Protege contra pacotes que podem procurar e obter informacoes da rede interna
iptables -A FORWARD --protocol tcp --tcp-flags ALL SYN,ACK -j DROP

##############
# Regras TCP #
##############
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 3390 -j ACCEPT
iptables -A INPUT -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -p tcp --dport 445 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 81 -j ACCEPT
iptables -A INPUT -p tcp --dport 1022 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 587 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 3389 -j ACCEPT
iptables -A INPUT -p tcp --dport 1746 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 47 -j ACCEPT
iptables -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -A INPUT -p tcp --dport 993 -j ACCEPT
iptables -A INPUT -p tcp --dport 465 -j ACCEPT
iptables -A INPUT -p tcp --dport 5440 -j ACCEPT
iptables -A INPUT -p tcp --dport 9000 -j ACCEPT
iptables -A INPUT -p tcp --dport 1684 -j ACCEPT
iptables -A INPUT -p tcp --dport 1624 -j ACCEPT
iptables -A INPUT -p tcp --dport 85 -j ACCEPT
iptables -A INPUT -p tcp --dport 119 -j ACCEPT
iptables -A INPUT -p tcp --dport 5060:5070 -j ACCEPT



##############
# Regras UDP #
##############
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 137 -j ACCEPT
iptables -A INPUT -p udp --dport 138 -j ACCEPT
iptables -A INPUT -p udp --dport 139 -j ACCEPT
iptables -A INPUT -p udp --dport 30606 -j ACCEPT
iptables -A INPUT -p udp --dport 3299 -j ACCEPT
iptables -A INPUT -p udp --dport 9868 -j ACCEPT
iptables -A INPUT -p udp --dport 5060:5070 -j ACCEPT
iptables -A INPUT -p udp --dport 8766:35000 -j ACCEPT
iptables -A INPUT -p udp --dport 995 -j ACCEPT
iptables -A INPUT -p udp --dport 993 -j ACCEPT


Estas regras eu fiz manualmente e não consigui visualizar o erro.
Fico muito grato se alguém puder ajudar.

zekkerj

Olá arsaraiva,

Primeira coisa a ter em mente: no iptables, a ordem das regras é tudo. Uma vez que um pacote é aceito ou "dropado", não tem mais como mudar de ideia.

Dito isso, começo chamando a sua atenção que sua regra de DROP na cadeia INPUT está lá em cima, no script, e tem um monte de regras depois dela. Isso significa que todas as tentativas de conexão no seu computador estão sendo indevidamente bloqueadas. É essencial que essa regra fique depois das regras de liberação de TCP que vc tem mais adiante. Certo?

------------------

Agora vamos considerar o teu problema original. Eu não entendi direito se a aplicação SIP está funcionando no teu computador, ou nas máquinas de sua rede. Se fica na própria máquina, OK, estamos no caminho certo, mas se fica na sua rede, e essa máquina é teu firewall, ooooops, vc está trabalhando na cadeia errada: tem que trabalhar as liberações na cadeia FORWARD.

Outra coisa que estou vendo é que vc carregou um caminhão de módulos, mas não carregou exatamente aquele que vc precisa (nf_conntrack_sip).

Por fim, o protocolo SIP tem a característica de que, uma vez que a conexão SIP de controle está aberta, as ligações passam a chegar em conexões reversas em portas altas aleatórias (na faixa de portas dinâmicas). Então se vc não quer ter que abrir toda a faixa de portas dinâmicas (má ideia), tem que ter uma regra de liberação de tráfego relacionado, parecida com esta:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Essa regra tem que vir antes da regra de bloqueio (duh), e fica mais fácil de compreender se vc colocar logo no início do script.

-------------------

Pra fechar, por enquanto, uma dica: não confie no endereço IP do pacote pra fazer liberação de tráfego, pois nada impede que um tráfego de internet venha com IP de origem falsificado como rede privada, e bater com o endereço de sua rede. Então aquelas regras "-p tcp --syn -s 192.168.0.0/255.255.255.0 -j ACCEPT" e  -p tcp --syn -s 127.0.0.1/255.0.0.0 -j ACCEPT" não estão te dando segurança; prefira sempre fazer a liberação do tráfego pela interface de entrada, que não pode ser forjada:

iptables -A INPUT -i enp2s0 -p tcp --syn -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
<-- observe que o tráfego que entra pela loopback vem da sua própria máquina, então se vc admite que sua máquina é segura, todo o tráfego que ela gera, principalmente o que ela envia pra si mesma, é seguro também. Adicionar essa regra costuma melhorar muito o desempenho da máquina com o firewall ativo.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D