Configure o iptables para o Docker manualmente e permita o acesso à Internet para contêineres

1

Eu estava muito insatisfeito com o comportamento do Docker em modificar minhas regras de firewall, pois ele apenas abre todas as portas do meu servidor.
Portanto, instalei iptables-persistent e configurei algumas regras de firewall que bloqueiam todo o tráfego de entrada, exceto as portas 22, 80 e 443, e assegurei que o Docker parasse de mexer nessas regras criando /etc/systemd/system/docker.service.d/noiptables.conf com o seguinte conteúdo:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --iptables=false -H "fd://"

e, em seguida, reinicie o servidor.

Agora, meu problema é que meus contêineres do Docker não podem mais acessar a Internet (interface: ens3).

Estas são as minhas regras:

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens3 -j MASQUERADE
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Allow localhost
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

# ICMP
-A INPUT -p icmp -j ACCEPT

# Docker
-A FORWARD -i docker0 -o ens3 -j ACCEPT
-A FORWARD -i ens3 -o docker0 -j ACCEPT


# Incoming
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -j DROP

# Outgoing
-A OUTPUT -j ACCEPT

# Routing
-A FORWARD -j DROP


COMMIT

Eu os armazenei em /etc/iptables/rules.v4 e /etc/iptables/rules.v6 e verifiquei se eles estavam carregados executando sudo netfilter-persistent reload .

De acordo com este guia: link A seção *nat faria o trabalho, mas isso não acontece.

Meu sistema:

$ sudo iptables --version
iptables v1.6.1

$ uname -r
4.11.0-1-amd64

$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux testing (buster)
Release:        testing
Codename:       buster
    
por Forivin 16.08.2017 / 12:24

1 resposta

0

Primeiro, você nunca mencionou net.ipv4.ip_forward net.ipv4.ip_forward . Ative isso se você não tiver.

Garanta que você possa acessar a internet. curl httpbin.org/ip é uma maneira boa e fácil de verificar isso.

Se você fez isso, verifique se suas regras estão ativas, verificando a saída de iptables-save

Se estiverem, depure-o, aqui estão os pseudo-passos:

  1. Dentro da janela de encaixe, execute ping em um IP externo, diga 8.8.8.8 e garanta que você não receba nenhuma resposta. Não use um nome de host. Vamos manter os problemas de DNS fora do nosso cenário. Continue correndo para a próxima etapa.

  2. Dentro do container, verifique todas as interfaces uma a uma com o tcpdump e procure por pacotes destinados a 8.8.8.8. Deve ser o docker0 de acordo com as regras que você colou em sua pergunta.

  3. Verifique a tabela de roteamento do seu host e certifique-se de que a rota padrão, 0.0.0.0, esteja na interface ens3

Você deve obter informações suficientes para resolver o problema.

    
por 24.08.2017 / 13:39