Eliminar pacotes com PREROUTING em iptables

2

A tabela de filtros é o melhor lugar para descartar pacotes, de acordo.

Mas, fora da caixa, o Docker ignora as regras de filtro INPUT com o PREROUTING para suas próprias regras FORWARD, tornando os contêineres Docker acessíveis ao mundo. Inserindo DOCKER filtro de nome nomeado, as regras INPUT / FORWARD falham porque, quando o Docker é reiniciado, elas são excluídas e inseridas (não anexadas).

Minha melhor tentativa é inserir outra cadeia PREROUTING antes do Docker e enviar pacotes indesejados de eth0 (WAN) para um buraco negro - 0.0.0.1 - porque você não pode mais DROP / REJECT em uma tabela nat .

# Route anything but TCP 80,443 and ICMP to an IPv4 black hole
iptables -t nat -N BLACKHOLE
iptables -t nat -A BLACKHOLE ! -i eth0 -j RETURN
iptables -t nat -A BLACKHOLE -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
iptables -t nat -A BLACKHOLE -p tcp --dport 80 -j RETURN
iptables -t nat -A BLACKHOLE -p tcp --dport 443 -j RETURN
iptables -t nat -A BLACKHOLE -p icmp -j RETURN
iptables -t nat -A BLACKHOLE -p all -j DNAT --to 0.0.0.1
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j BLACKHOLE

Veja como são as cadeias NAT com o Docker e um contêiner em execução:

Isso parece funcionar bem, porém, existe uma maneira de rejeitar explicitamente os pacotes antes de atingir a outra regra de pré-roteamento?

(Alpine Linux 3.6.2, Docker v17.05.0-ce)

    
por Drakes 17.11.2017 / 23:31

1 resposta

0

Eu tive um problema semelhante, que era a necessidade de "endurecer" o tráfego de rede, mesmo se alguém implantasse um contêiner que estivesse vinculando o aplicativo a qualquer endereço: 0.0.0.0:port .

O Docker fornece uma cadeia de filtro DOCKER-USER , mas parece que toda a mágica acontece na cadeia DOCKER nat que é referenciada em PREROUTING .

Portanto, não há como evitar a filtragem nat antes e não quero mexer muito nas regras do docker.

Eu não gosto da idéia de ter que mudar o pacote mais uma vez, então eu criei um esquema que retorna tudo por padrão e pula para outra cadeia no PREROUTING antes DOCKER é chamado.

Eu, então, salto seletivamente para DOCKER quando considero o tráfego bom.

Este é o código:

iptables -t nat -N DOCKER-BLOCK
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j RETURN
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j DOCKER-BLOCK

É isso aí!

O pacote vai pular para a corrente DOCKER-BLOCK , e se essa corrente estiver vazia, ela sairá da cadeia e continuará em PREROUTING pulando para RETURN e ela será bloqueada.

Quando você ativa uma porta:

iptables -t nat -I DOCKER-BLOCK -p tcp -m tcp --dport 1234 -j DOCKER

Isso fará com que o pacote retorne à cadeia DOCKER , onde ele é gerenciado por docker . O Docker deve manipular o pacote e o RETURN de PREROUTING nunca deve ser alcançado.

A melhor maneira é que você nunca mais precisará tocar na tabela PREROUTING , se quiser liberar, execute diretamente DOCKER-BLOCK .

    
por 03.04.2018 / 03:47