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 .