Dê uma olhada na tabela nat
com iptables -L -t nat
.
Estou aprendendo o iptables em combinação com o Docker. Eu estou descobrindo como o docker-compose host:port:port
para o encaminhamento de porta realmente funciona. Eu entendi que faz alguma magia iptables. Então fiz um pequeno teste.
Primeiro eu tive esse docker-compose.yml
:
version: "3"
services:
postgres:
image: postgres:latest
ports:
- 127.0.0.1:5432:5432
networks:
- network
network:
network:
Ao executar isso, iptables -S
fornece:
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o br-bd4b05981a0f -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-bd4b05981a0f -j DOCKER
-A FORWARD -i br-bd4b05981a0f ! -o br-bd4b05981a0f -j ACCEPT
-A FORWARD -i br-bd4b05981a0f -o br-bd4b05981a0f -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.18.0.2/32 ! -i br-bd4b05981a0f -o br-bd4b05981a0f -p tcp -m tcp --dport 5432 -j ACCEPT
-A DOCKER-ISOLATION -i docker0 -o br-bd4b05981a0f -j DROP
-A DOCKER-ISOLATION -i br-bd4b05981a0f -o docker0 -j DROP
-A DOCKER-ISOLATION -j RETURN
-A DOCKER-USER -j RETURN
Eu verifiquei que a porta 5432 era de fato não acessível pela Internet e apenas no host local. Ótimo!
Depois disso, reiniciei a janela de encaixe ( docker system prune --all --volumes --force
) e comecei com os seguintes docker-compose.yml
:
version: "3"
services:
postgres:
image: postgres:latest
ports:
- 5432:5432
networks:
- network
network:
network:
Observe que 127.0.0.1:
não está muito presente nesta configuração. Agora, ao executar iptables -S
, estou obtendo exatamente a mesma configuração:
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o br-6ada9a016213 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-6ada9a016213 -j DOCKER
-A FORWARD -i br-6ada9a016213 ! -o br-6ada9a016213 -j ACCEPT
-A FORWARD -i br-6ada9a016213 -o br-6ada9a016213 -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.18.0.2/32 ! -i br-6ada9a016213 -o br-6ada9a016213 -p tcp -m tcp --dport 5432 -j ACCEPT
-A DOCKER-ISOLATION -i docker0 -o br-6ada9a016213 -j DROP
-A DOCKER-ISOLATION -i br-6ada9a016213 -o docker0 -j DROP
-A DOCKER-ISOLATION -j RETURN
-A DOCKER-USER -j RETURN
No entanto, desta vez, o serviço é acessível via internet. Isso é planejado de acordo com o docker-compose.yml
que estou usando neste momento. No entanto, a configuração do iptables é exatamente a mesma que a acima. Estranho?
Como é possível que duas configurações exatas do iptables tenham um comportamento diferente? Acho que estou perdendo alguma informação para entender as especificidades da funcionalidade de encaminhamento de porta do Docket.