AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 461320
Accepted
AnyDev
AnyDev
Asked: 2018-08-09 08:34:23 +0800 CST2018-08-09 08:34:23 +0800 CST 2018-08-09 08:34:23 +0800 CST

nf_conntrack_sip não funciona AS VEZES, reiniciar o iptables GERALMENTE o corrige

  • 772

Estou tentando usar nf_conntrack_sip em caixa que está rodando Asterisk, ou seja, não roteando tráfego para outra caixa VoIP. A instalação funciona até eu reiniciar. Após a reinicialização, o nf_conntrack_sip QUASE sempre para de funcionar e o tráfego de mídia é descartado.

conntrack --dump | grep -E 'sip|helper'
# No output matching 'sip' nor 'helper' while a call is in progress (albeit no audio)

As regras do iptables são carregadas corretamente confirmadas por iptables-save.

Então eu faço systemctl restart iptablese 9/10 vezes isso corrige. Se isso não acontecer, eu reinicio, repita o reinício do iptables.

conntrack --dump | grep -E 'sip|helper'
conntrack v1.4.4 (conntrack-tools): 9 flow entries have been shown.
udp      17 3597 src=10.7.0.38 dst=10.47.1.11 sport=5063 dport=5060 src=10.47.1.11 dst=10.7.0.38 sport=5060 dport=5063 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 helper=sip use=2

Simplesmente recarregar as regras com iptables-restore < /etc/sysconfig/iptablesnão ajuda. Eu suspeito que descarregar/carregar conntrack ou alguns módulos fazem o truque.

Ocasionalmente, funciona na inicialização, mas muito raro. Asterisk iniciar rapidamente. Dar-lhe mais tempo para "terminar de começar algo" não ajuda.

Atualização: reiniciar o iptables enquanto nf_conntrack_sip está funcionando como esperado, pode, raramente, quebrá-lo.

A configuração:

Atualização: Inicialmente, o problema foi descrito como ocorrendo em uma VM, mas desde então reinstalei em hardware real (CPU i5-6500 @ 3,20 GHz com 8 Gb de RAM) com exatamente o mesmo problema ainda ocorrendo. Todos os pacotes idênticos (mesmo script de provisionamento) da VM inicial.

O sistema operacional é CentOS-7.4 Minimal + atualizações, kernel 3.10.0-693.21.1.el7.x86_64. É tudo instalado a partir de RPMs, sem kernels ou módulos personalizados. Atualização: também fiz yum updateos pacotes estáveis ​​e o kernel mais recentes disponíveis no CentOS em 2018-08-10. O problema persiste.

eu fiz yum autoremove firewallde yum install iptables-services.

Difere de /etc/sysconfig/iptables-config(outros valores são padrões por RPM)

-IPTABLES_MODULES=""
+IPTABLES_MODULES="nf_conntrack_sip"

Arquivo adicionado /etc/modprobe.d/nf_conntrack.conf:

options nf_conntrack nf_conntrack_helper=0

O todo /etc/sysconfig/iptablesé muito simples:

*raw
-A PREROUTING -p udp --dport 5060 -j CT --helper sip
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 5060 -j ACCEPT
-A INPUT -j LOG --log-level 7 --log-prefix "REJECT in filter.INPUT:"
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Atualização: Definir as opções do módulo options nf_conntrack nf_conntrack_helper=1e NÃO usar a regra iptables ... -j CT --helper sipNÃO corrige isso e o comportamento permanece não determinístico.

Não é relevante para o problema, apenas para confirmar que os pacotes foram descartados, em vez de ter problemas de NAT,/etc/rsyslog.d/kern-debug.conf

kern.=debug /var/log/kernel-debug

Testando com um telefone Cisco SPA504G que disca para o PBX e recebe música em espera. Não tentando fazer nada complicado com a mídia. A sinalização SIP e a mídia são trocadas com o mesmo endereço IPv4. A chamada de teste é apenas entre o telefone e o PBX. Nenhuma outra parte envolvida.

Minha tentativa de diagnosticá-lo:

Eu fiz um pequeno script que tenta capturar o estado de várias coisas antes e depois da correção reiniciando o iptables, para comparar por diff. O roteiro:

for f in $( find /proc/sys/net/netfilter -type f ); do
  echo f=${f}
  cat "${f}"
done

echo cat /sys/module/nf_conntrack/parameters/*
cat /sys/module/nf_conntrack/parameters/*

echo ls /sys/module/nf_conntrack/holders/
ls /sys/module/nf_conntrack/holders/

echo cat /sys/module/nf_conntrack_sip/parameters/*
cat /sys/module/nf_conntrack_sip/parameters/*
echo ls /sys/module/nf_conntrack_sip/holders/
ls /sys/module/nf_conntrack_sip/holders/

echo ls /sys/module/ip*/holders/
ls /sys/module/{ip,nf_}*/holders/

echo sysctl -a
sysctl -a

echo lsmod
lsmod

echo iptables-save
iptables-save

A única coisa que noto é que o módulo FREQUENTEMENTE nf_conntrack_netlinkESTÁ listado como carregado após a inicialização, enquanto há um problema. Às vezes, NÃO é listado lsmodAPÓS a inicialização, mas ainda há o problema. Depois de reiniciar o iptables, até onde sei, nunca é listado como carregado. Suspeito que não esteja relacionado porque não há ligação direta entre ele ser carregado e o problema se manifestar.

iptables sip
  • 1 1 respostas
  • 4935 Views

1 respostas

  • Voted
  1. Best Answer
    AnyDev
    2018-08-24T07:16:56+08:002018-08-24T07:16:56+08:00

    Solução

    A solução foi simplesmente marcar os pacotes de saída a serem tratados pelo conntrack sip helper também:

    iptables -t raw -A OUTPUT -p udp -m udp --sport 5060 -j CT --helper sip
    

    Causa

    O problema era que a regra do firewall estava marcando apenas os pacotes de entrada para o conntrack sip helper.

    iptables -t raw -A PREROUTING -p udp -m udp --dport 5060 -j CT --helper sip
    

    Quando o PBX fosse o único a enviar o primeiro pacote para o telefone, ele estabeleceria uma entrada conntrack sem o auxiliar de sip. A entrada continuou a corresponder à conversa SIP sem o envolvimento do auxiliar SIP.

    [root@test ~]# conntrack -L | grep -E '5060|sip'
    conntrack v1.4.4 (conntrack-tools): 13 flow entries have been shown.
    udp      17 159 src=10.47.1.11 dst=10.7.0.38 sport=5060 dport=1024 src=10.7.0.38 dst=10.47.1.11 sport=1024 dport=5060 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 use=1
    

    Quando o telefone fosse o único a enviar o primeiro pacote para o PBX, ele atingiria a regra com "-j CT --helper sip" listada acima e a entrada conntrack seria criada com o sip helper.

    [root@test ~]# conntrack -L | grep -E '5060|sip'
    conntrack v1.4.4 (conntrack-tools): 9 flow entries have been shown.
    udp      17 3588 src=10.7.0.38 dst=10.47.1.11 sport=1024 dport=5060 src=10.47.1.11 dst=10.7.0.38 sport=5060 dport=1024 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 helper=sip use=2
    

    Observe o "helper=sip" no final da entrada, compare com a falta dele na primeira amostra.

    O PBX e o telefone enviam pacotes SIP um para o outro para confirmar que o outro está lá, então o tempo fez com que parecesse não determinístico.

    O Asterisk preserva o estado dos peers nas reinicializações e os investiga após a reinicialização, sendo muito mais provável que envie o pacote de saída primeiro e causando a entrada não-SIP-helper no conntrack.

    Muito obrigado ao usuário AB por me apontar na direção certa nos comentários.

    Mistério restante

    O que eu não consigo explicar é porque quando eu tinha a opção modprobe

    options nf_conntrack nf_conntrack_helper=0
    

    Ele ainda estava sendo quebrado e "consertado" da mesma maneira. Eu não gastei muito tempo no helper acionando automaticamente, então talvez eu tenha feito algo errado. Posso atualizar esta resposta se descobrir mais. Não estou planejando usar o ajudante automático habilitado.

    • 3

relate perguntas

  • Uma pequena dúvida sobre MASQUERADE e SNAT/DNAT

  • iptables não filtra tráfego em ponte

  • iptables persistentes

  • Regras do Iptables para permitir que o appVM passe pelo proxyVM configurado para passar apenas por uma VPN no QubesOS

  • Como fazer todo o tráfego passar por uma interface no Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve