Esse é o problema com o multicast: o netfilter nunca pode ter certeza se está relacionado ou não.
A única maneira de permitir o UPnP SSDP será:
-A INPUT -p udp --sport 1900 -j ACCEPT
Além da regra ESTABLISHED,RELATED
existente.
Uma parte central da minha configuração de firewall é:
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Parece que RELATED
não funciona para respostas multicast: quando o host envia para um grupo multicast (no meu caso uma descoberta UPnP SSDP, para 239.255.255.250:1900), as respostas correspondentes de um endereço IP específico voltar a porta selecionada aleatoriamente do remetente são descartadas.
Qual é a maneira correta de preservar a semântica de --state ESTABLISHED,RELATED
, mas fazer a correspondência de resposta funcionar para multicast?
Com os kernels recentes do Linux (> = 2.6.39), você pode usar o ipset do kernel para limitar o controle de conexão. Você não precisa escrever nenhum espaço de usuário ou auxiliar de kernel. Para UPnP SSDP, pode ser escrito como:
$ ipset create upnp hash:ip,port timeout 3
$ iptables -A OUTPUT -d 239.255.255.250/32 -p udp -m udp --dport 1900 -j SET --add-set upnp src,src --exist
$ iptables -A INPUT -p udp -m set --match-set upnp dst,dst -j ACCEPT
O primeiro comando cria um novo ipset chamado upnp que armazena tuplas (endereço ip, protocolo ip, porta ip) e cada registro inserido expira em 3 segundos.
O segundo comando corresponde ao pacote UPnP SSDP de saída (o destino é o endereço multicast 239.255.255.250 na porta udp 1900) e armazena endereço IP de origem e origem da porta udp do pacote no ipset upnp A primeira palavra-chave src significa endereço IP de origem e segunda palavra-chave src significa porta de origem como ipset do tipo hash : ip, port sempre precisa desse par. A palavra-chave - exists significa que, para o registro existente, o temporizador é redefinido. Este registro armazenado é automaticamente removido em 3 segundos.
O terceiro comando corresponde ao pacote udp de entrada e, se o endereço de destino e a porta de destino corresponderem a algum registro no ipset upnp , este pacote será aceito. Sintaxe dst, dst significa endereço IP de destino e porta de destino .
Os clientes UPnP normalmente enviam o pacote udp para 239.255.255.250:1090 e aguardam apenas 2 segundos pela resposta. Portanto, a autoexpiração em 3 segundos no ipset é suficiente.
Eu não encontrei na internet nenhuma configuração funcional de firewall / iptables para clientes UPnP que não seja muito relaxada (por exemplo, aceitar todos os pacotes UDP de entrada) ou sem algum rastreamento de espaço de usuário ou necessidade de corrigir o kernel. Portanto, espero que este exemplo ajude você.