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

11

Atualmente, tenho minha cadeia OUTPUT definida como DROP. Gostaria de alterá-lo para REJECT, para ter uma pista de que é o meu firewall que me impede de chegar a algum lugar em vez de um problema com qualquer serviço que estou tentando acessar (rejeição imediata em vez de atingir o tempo limite). No entanto, o iptables parece não se importar com isso. Se eu editar manualmente meu arquivo de regras salvo e tentar restaurá-lo, recebo iptables-restore v1.4.15: Can't set policy 'REJECT' on 'OUTPUT' line 22: Bad policy namee ele se recusa a carregar as regras. Se eu tentar definir isso manualmente ( iptables -P OUTPUT REJECT), recebo, 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 ele seja carregado:

# 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 consigo encontrar afirma que REJECT é uma política / destino válido (em geral), mas não consigo encontrar nada que diga que não é válido para as cadeias INPUT, FORWARD ou OUTPUT. Meu Google-fu não está ajudando. Estou no Gentoo, se isso faz alguma diferença. Alguém aqui tem alguma ideia?

ND Geek
fonte
Você pode mostrar as iptablesregras em questão?
bahamat

Respostas:

15

REJECTé uma extensão de destino , enquanto uma política de cadeia deve ser um destino . A página de manual diz isso (embora não esteja muito claro), mas parte do que diz está totalmente errada.

A política pode ser apenas ACCEPTou DROPem cadeias internas. Se você deseja rejeitar todos os pacotes que não correspondem às regras anteriores, verifique se a última regra corresponde a tudo e adicione uma regra com uma REJECTextensão de destino. Em outras palavras, depois de adicionar todas as regras relevantes, faça iptables -t filter -A OUTPUT -j REJECT.

Consulte o tópico "quais são as possíveis políticas de cadeia" na lista netfilter para obter mais detalhes.

Shawn J. Goff
fonte
Isso faz sentido, e um REJECT genérico no final deve funcionar. Por curiosidade, a definição da extensão de destino está em algum lugar bastante óbvia e eu apenas a perdi, ou é um dos bits mal documentados?
Nd
1
Lendo a página de manual inteira, fica claro que REJECT é uma extensão de destino, mas a página de manual é muito longa, portanto "TL; DR" tende a se aplicar. Isso também implica que DROP, ACCEPT e QUEUE são alvos de política válidos; do código atual, QUEUE não é!
StarNamer
4

Não consegui encontrá-lo documentado, mas uma referência aqui indica que as únicas políticas permitidas são ACCEPT ou DROP. Isto é confirmado por olhar para a fonte 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 original sugere que a melhor coisa a fazer é adicionar REJECT no final da cadeia, o que deveria ser iptables -A OUTPUT -j REJECT.

Observe que o código imediatamente 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.

StarNamer
fonte
Esse comando no segmento está incorreto; -pé para correspondência em um protocolo; ele quis dizer -Acomo minha resposta diz.
Shawn J. Goff
Isso é bem interessante. A curiosidade em mim me pergunta se há uma razão por trás disso, ou se é assim que as coisas são, possivelmente por uma questão de simplicidade (código mais simples significa menos pontos possíveis de vulnerabilidades, afinal). Se eu fosse um desenvolvedor moderado, ficaria tentado a invadir localmente, mas como não sou, e por ser uma peça de segurança, não vou tocá-la.
ND Geek
2

REJECTon OUTPUTnão faz sentido; a REJECTretornará um pacote ICMP que precisaria atravessar uma rede.

Adicione uma nova -j LOGcomo sua última regra (portanto, antes da DROPpolítica) para ver o que chega tão longe na OUTPUTcadeia.

Aaron D. Marasco
fonte
1
O REJECTpacote ICMP não pôde retornar na interface lo? Concordo que a LOGé útil para a solução de problemas, mas o que eu realmente esperava era uma maneira de me lembrar que "Ah, sim ... isso provavelmente está sendo bloqueado pelo meu DROPpadrão do iptables" em vez de solucionar problemas por 5 minutos, pede que o colega de trabalho o servidor XYZ de acesso percebe que provavelmente é local , que é a minha abordagem mais comum, pois meu dia de trabalho típico raramente atinge coisas pelas quais ainda não abri um buraco. Claro que talvez eu precise manter isso em mente melhor, mas um apartamento REJECTé mais óbvio.
Nd
Não acho que você deseje que a ethXinterface gere tráfego na lointerface por vários motivos. Eles são muito independentes; você pode facilmente aplicar correntes a uma e não à outra.
Aaron D. Marasco