O Firewall Descomplicado (UFW) não está bloqueando nada ao usar o Docker

27

Esta é minha primeira vez configurando um servidor Ubuntu (14.04 LTS) e estou tendo problemas para configurar o firewall (UFW).

Eu só preciso de ssh e http , então estou fazendo isso:

sudo ufw disable

sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp

sudo ufw enable
sudo reboot

Mas ainda posso me conectar a bancos de dados em outras portas desta máquina . Alguma ideia sobre o que estou fazendo errado?

EDITAR : esses bancos de dados estão em contêineres do Docker. Isso poderia estar relacionado? está sobrescrevendo minha configuração do ufw?

EDIT2 : saída de sudo ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
    
por ESala 25.07.2015 / 12:00

7 respostas

41

O problema foi usar o sinalizador -p nos contêineres.

Acontece que o Docker faz alterações diretamente no seu iptables , que não são mostradas com ufw status .

Possíveis soluções são:

  1. Pare de usar o sinalizador -p . Use a janela de encaixe ou redes de encaixe em vez disso.

  2. Vincule os contêineres localmente para que eles não sejam expostos fora da sua máquina:

    docker run -p 127.0.0.1:8080:8080 ...

  3. Se você insistir em usar o sinalizador -p , diga ao docker para não tocar em seu iptables desativando-o em /etc/docker/daemon.json e reiniciando:

    { "iptables" : false }

Eu recomendo a opção 1 ou 2. Cuidado com a opção 3 tem efeitos colaterais , como recipientes se tornando incapazes de se conectar à internet.

    
por ESala 25.07.2015 / 12:50
9

16.04 apresenta novos desafios. Eu fiz todos os passos, como mostrado Executando o Docker atrás do firewall ufw MAS NÃO consegui obter o docker mais o UFW para trabalhar em 16.04. Em outras palavras, não importa o que eu fiz, todas as portas docker se tornaram globalmente expostas à Internet. Até que encontrei isto: Como configurar o Docker 1.12+ para NÃO interferir com IPTABLES / FirewallD

Eu tive que criar o arquivo /etc/docker/daemon.json e colocar o seguinte em:

{
    "iptables": false
}

Em seguida, emiti sudo service docker stop , em seguida, sudo service docker start FINALMENTE, a janela de encaixe simplesmente segue as regras apropriadas no UFW.

Dados adicionais: O Docker ignora o UFW!

    
por Hal Jordan 06.12.2016 / 22:50
5

Se você estiver usando o sistema init do systemd (Ubuntu 15.10 e posterior) edite o /etc/docker/daemon.json (pode ser necessário criá-lo se ele não existir), verifique se ele possui a chave iptables configurada:

{   "iptables" : false }

EDITAR : isso pode fazer com que você perca a conexão com a Internet de dentro dos contêineres

Se você tiver o UFW ativado, verifique se você pode acessar a Internet de dentro de contêineres. caso contrário, você deve definir DEFAULT_FORWARD_POLICY como ACCEPT on /etc/default/ufw e aplicar o truque descrito aqui: link

    
por Or Shachar 05.10.2016 / 14:11
4

Uso de /etc/docker/daemon.json com conteúdo

{
  "iptables": false
}

pode soar como uma solução , mas só funciona até a próxima reinicialização . Depois disso, você pode perceber que nenhum de seus contêineres tem acesso à Internet, portanto, você não pode, por exemplo, fazer ping em nenhum site. Pode ser um comportamento indesejado.

O mesmo se aplica à vinculação de um contêiner a um IP específico. Você pode não querer fazer isso. A melhor opção é criar um contêiner e tê-lo por trás do UFW, não importa o que aconteça e como você cria esse contêiner, então há uma solução:

Depois de criar o arquivo /etc/docker/daemon.json , invoque:

sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload

para que você configure a política de encaminhamento padrão no UFW para aceitar e usar:

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

Se você estiver prestes a usar o docker-compose, o IP do comando acima deve ser substituído pelo IP da rede docker-compose criado ao executá-lo com docker-compose up .

Eu descrevi o problema e a solução de forma mais abrangente neste artigo

Espero que ajude!

    
por mkubaczyk 08.09.2017 / 21:47
1

Uma solução rápida é ao executar o Docker e fazer o mapeamento de portas. Você sempre pode fazer

docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...

para evitar que o Docker seja acessado de fora.

    
por kimy82 16.08.2017 / 16:01
0

Use --network = host ao iniciar o contêiner para que o docker mapeie a porta para a rede somente host isolada, em vez da rede bridge padrão. Não vejo formas legais de bloquear a rede de ponte. Como alternativa, você pode usar uma rede personalizada definida pelo usuário com isolamento.

    
por thecoder 11.03.2017 / 22:10
0
  1. Faça login no seu console do docker:

    sudo docker exec -i -t docker_image_name /bin/bash

  2. E, em seguida, dentro do seu console de encaixe:

    sudo apt-get update
    sudo apt-get install ufw
    sudo ufw allow 22
    
  3. Adicione suas regras do ufw e ative o ufw

    sudo ufw enable

    • Sua imagem do Docker precisa ser iniciada com --cap-add = NET_ADMIN

Para ativar a opção "NET_ADMIN" do Docker:

1. Contêiner:

docker stop yourcontainer; Identificação do recipiente 2.Get:

janela de encaixe inspecione seu contêiner; 3.Modify hostconfig.json (caminho padrão do docker: / var / lib / docker, você pode alterar o seu)

vim /var/lib/docker/containers/containerid/hostconfig.json

4.Procure "CapAdd" e modifique null para ["NET_ADMIN"];

...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5.Restart docker na máquina host;

reinicialização do docker de serviço; 6.Inicie seuconconinerador;

docker start yourcontainer;

    
por Stefan 03.04.2018 / 15:03