Por que não consigo usar a política REJECT na minha cadeia OUTPUT do iptables?

9

Atualmente, tenho minha cadeia de saída definida como DROP. Eu gostaria de mudá-lo para REJECT, para que eu saiba que é o meu firewall me impedindo de chegar a algum lugar, em vez de um problema com qualquer serviço que eu esteja tentando acessar (rejeição imediata em vez de tempo limite). No entanto, o iptables não parece se importar com isso. Se eu editar manualmente meu arquivo de regras salvo e tentar restaurá-lo, receberei iptables-restore v1.4.15: Can't set policy 'REJECT' on 'OUTPUT' line 22: Bad policy name e ele se recusará a carregar as regras. Se eu tentar definir isso manualmente ( iptables -P OUTPUT REJECT ), obtenho iptables: Bad policy name. Run 'dmesg' for more information. , mas não há saída no dmesg.

Confirmei que a regra apropriada foi compilada no kernel e reiniciei para garantir que ela seja carregada:

# CONFIG_IP_NF_MATCH_TTL is not set
CONFIG_IP_NF_FILTER=y
***
CONFIG_IP_NF_TARGET_REJECT=y
***
CONFIG_IP_NF_TARGET_LOG=y
CONFIG_IP_NF_TARGET_ULOG=y

(Asteriscos adicionados para destacar a regra aplicável)

Tudo o que posso encontrar afirma que REJECT é uma política / destino válida (em geral), mas não consigo encontrar nada que diga que não seja válido para as cadeias INPUT, FORWARD ou OUTPUT. Meu Google-fu não está ajudando. Eu estou no Gentoo, se isso faz alguma diferença. Alguém aqui tem alguma ideia?

    
por ND Geek 21.08.2012 / 23:17

3 respostas

10

REJECT é uma extensão de destino , enquanto uma política de encadeamento precisa ser um destino . A página man diz que (embora não seja muito claro), mas algumas das afirmações estão erradas.

A política pode ser apenas ACCEPT ou DROP em cadeias internas. Se você quiser o efeito de rejeitar todos os pacotes que não correspondem às regras anteriores, certifique-se de que a última regra corresponda a tudo e adicione uma regra com a extensão REJECT target. Em outras palavras, depois de adicionar todas as regras relevantes, faça iptables -t filter -A OUTPUT -j REJECT .

Veja o tópico "quais são as possíveis políticas de encadeamento" na lista de filtros de rede para mais detalhes.

    
por 21.08.2012 / 23:38
4

Não consegui encontrá-lo documentado, mas uma referência aqui indica que o somente as políticas permitidas são ACCEPTor DROP. Isto é confirmado observando o source de libiptc (que é responsável por manipular as regras) em torno da linha 2429, onde o código tem

2429         if (strcmp(policy, LABEL_ACCEPT) == 0)
2430                 c->verdict = -NF_ACCEPT - 1;
2431         else if (strcmp(policy, LABEL_DROP) == 0)
2432                 c->verdict = -NF_DROP - 1;
2433         else {
2434                 errno = EINVAL;
2435                 return 0;
2436         }

O tópico sugere que a melhor coisa a fazer é adicionar REJECT no final da cadeia que deveria ser iptables -A OUTPUT -j REJECT .

Observe que o código antes disso é:

2423         if (!iptcc_is_builtin(c)) {
2424                 DEBUGP("cannot set policy of userdefinedchain '%s'\n", chain);
2425                 errno = ENOENT;
2426                 return 0;
2427         }
2428 

Portanto, você não pode definir a política em uma cadeia definida pelo usuário.

    
por 21.08.2012 / 23:52
2

REJECT on OUTPUT não faz sentido; um REJECT retornará um pacote ICMP que precisaria atravessar uma rede.

Adicione um novo -j LOG como sua última regra (portanto, antes da política DROP ) para ver o que chega tão longe na cadeia OUTPUT .

    
por 21.08.2012 / 23:50