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
.