IPTABLES - Como funciona a porta Docker a: b funciona?

0

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.

    
por Dave Teezo 21.11.2017 / 14:03

1 resposta

0

Dê uma olhada na tabela nat com iptables -L -t nat .

    
por 21.11.2017 / 14:14