firewalld aceita resposta à consulta DNS multicast da porta efêmera

4

Estou tentando configurar o firewalld (Fedora 21) para que as respostas sejam enviadas para consultas MDNS enviadas de um aplicativo cliente usando uma porta de origem UDP efêmera para um destino de multicast. As respostas são unicast. A sequência é assim (capturada usando wireshark)

  1. UDP: endereço local: 45325 (efêmero) - > 224.0.0.251:5353; a consulta
  2. UDP: algum sistema: 5353 - > endereço local: 45325; a resposta
  3. ICMP: endereço local - > algum sistema: Tipo: 3 (Destino inacessível), Código: 10 (Host proibido administrativamente)

O serviço firewalld mdns, que adiciona a porta 5353 UDP, está ativado, mas isso não ajuda na resposta.

Qualquer ponteiro seria apreciado.

    
por awy 09.11.2015 / 19:34

3 respostas

2

Parabéns, você descobriu uma limitação no conceito de filtragem de pacotes. Rastreando protocolos multicast: a resposta não pode voltar do mesmo endereço, porque é absolutamente proibido enviar de um endereço multicast. O firewall não pode corresponder à resposta ao seu pedido, por isso bloqueia. Obviamente, o sistema MDNS dameon, avahi, evita isso enviando a partir da porta fixa 5353, de modo que é onde obtém respostas também. A porta 5353 é permitida especificamente por uma regra de firewall. Se você puder conseguir que o software fale com o avahi , essa é a solução que o avahi recomendaria.

Em alternativa, pode ser possível confiar na opção avahi predefinida disallow-other-stacks=no e configurar a aplicação cliente para utilizar a porta fixa 5353 . Não está claro o efeito disso na confiabilidade do Avahi. Ou você pode simplesmente desativar o Avahi se não precisar dele. É claro que se o aplicativo permitir que você escolha uma porta de origem fixa, basta adicioná-la ao firewall & vai funcionar ...

... exceto quando você diz "aplicativo cliente", você provavelmente se refere a uma classe de software que deveria, em teoria, ser capaz de executar várias instâncias ao mesmo tempo. Não está executando todas as solicitações de rede através de um único daemon. E aposto que o aplicativo não usa o hack SO_REUSEPORT que o avahi implementa para disallow-other-stacks=no , então isso permite que você execute apenas uma instância do aplicativo de uma só vez .

Muitos softwares Linux para Desktops ou caixas de rede locais dinky provavelmente não são projetados para rodar com um firewall host. O Fedora é a principal distribuição que faz isso. O Fedora Workstation mudou recentemente sua zona padrão do firewall para "FedoraWorkstation", que permite conexões a qualquer porta TCP ou UDP acima de 1024. A configuração FedoraWorkstation, ou rodando sem firewall, permitiria que seu software funcionasse inalterado.

É difícil expressar o ponto de um firewall host como o Firewalld. Não tem suporte para roteamento entre zonas como Shorewall. Ele permite que você escolha definir a zona padrão como algo mais restritivo, com configurações mais permissivas para sua rede sem fio doméstica ou uma VPN. Talvez, se você trabalhar duro com o NetworkManager, possa fazer com que ele funcione também para uma rede doméstica com fio. Mas isso é tão obscuro para algo habilitado por padrão.

É inteiramente seguro executar uma instalação padrão do Fedora (ou Ubuntu) sem um firewall. O que você desiste é uma política centralizada para as quais as portas estão abertas - no caso de você configurar um software aleatório e não perceber que deseja escutar em uma porta.

As pessoas tentam comparar os firewalls no Linux e no Windows, mas o Firewall do Windows é claramente necessário e realmente possível de ser entendido pelos mortais, ao contrário do Firewalld . O Windows tem portas abertas por padrão e depende de um firewall de host para protegê-las. Implementa zonas confiáveis / não confiáveis para redes com fio. As novas redes são padronizadas como não confiáveis e aparecem para perguntar se você deseja alterá-las. Redes cabeadas diferentes são identificadas pelo endereço MAC do servidor DHCP. Pelo menos desde o Windows 8, a primeira execução "express" também marca a rede atual como confiável, o que eu acho teoricamente irritante, mas na prática é provavelmente bastante útil.

Tecnicamente, você também pode modificar o software para conversar com o Firewalld através do dbus e solicitar que a porta efêmera vinculada seja aberta para respostas. De alguma forma, não acho que seja uma sugestão útil.

    
por 02.02.2016 / 17:30
2

Eu tive o mesmo problema com alguns dispositivos específicos conectados a um servidor. Não importa o que tentei, o firewall continuava bloqueando as solicitações.

Redhat recomenda dois métodos, de acordo com a base de conhecimento:

Solução 1:

Abra a porta UDP na qual o tráfego de entrada estará:

firewall-cmd --permanent --zone=public --add-port=12345/udp
firewall-cmd --reload

Isso provavelmente não funcionará porque o serviço mdns abre o UDP 5353 e você mencionou que isso não ajuda.

Solução 2:

Crie um serviço:

<?xml version="1.0" encoding="utf-8"?>
<service>
    <short>My Multicast Listener</short>
    <description>A service which allows traffic to a fictitious multicast listener.</description>
    <port protocol="udp" port="12345"/>
    <destination ipv4="224.0.0.251"/>
</service>

No entanto, este exemplo parece ser de saída, em vez de de entrada. Em vez disso, você pode tentar trocar o <destination> para <source address="xx.xx.xx.xx"> e ver se isso ajuda.

Solução 3:

Eu, pessoalmente, não consegui trabalhar. Acabei basicamente na lista de permissões do IP de origem para todas as portas. Algo que eu não recomendaria, mas me cansei de passar horas mexendo com o firewalld e como os clientes em questão são dispositivos Raspberry Pi em uma LAN privada, o risco é mínimo.

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'

Você desejará ajustar a zona se usar algo diferente. Eu também faria isso apenas para clientes IPv4 internos em uma LAN.

Fonte: link

    
por 02.02.2016 / 11:12
1

Já existe um modelo de serviço disponível:

firewall-cmd --add-service=mdns              # runtime
firewall-cmd --permanent --add-service=mdns  # permanent

talvez você precise instalar o firewalld-config-workstation .

Se você ainda não conseguir trabalhar. Você poderia adicionar a regra à sua pergunta? Por exemplo. com:

iptables-save | grep ' 5353 '

ou talvez tente:

firewall-cmd --remove-service=mdns
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -d 224.0.0.251/32 -p udp -m udp --dport 5353 -m conntrack --ctstate NEW,RELATED -j ACCEPT
    
por 02.02.2016 / 12:00