Esta é a primeira vez que configuro um servidor Ubuntu (14.04 LTS) e estou tendo problemas para configurar o firewall (UFW).
Eu só preciso ssh
e http
, portanto, estou fazendo o seguinte:
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 conectar-me aos bancos de dados em outras portas desta máquina . Alguma idéia do que estou fazendo de errado?
EDIT : esses bancos de dados estão em contêineres do Docker. Isso pode estar relacionado? está substituindo minha configuração ufw?
EDIT2 : saída desudo 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)
ufw status
8083
e8086
. Eu adicionei aufw status verbose
saída na pergunta. Obrigado.Respostas:
O problema estava usando a
-p
bandeira em contêineres.Acontece que o Docker faz alterações diretamente no seu
iptables
, que não são mostradas comufw status
.As soluções possíveis são:
Pare de usar a
-p
bandeira. Use a ligação docker ou redes docker .Vincule recipientes localmente para que não fiquem expostos fora da sua máquina:
docker run -p 127.0.0.1:8080:8080 ...
Se você insistir em usar o
-p
sinalizador, diga ao docker para não tocar no seuiptables
, desativando-o/etc/docker/daemon.json
e reiniciando:{ "iptables" : false }
Eu recomendo as opções 1 ou 2. Observe que a opção 3 tem efeitos colaterais , como os contêineres que não conseguem se conectar à Internet.
fonte
-p
o máximo possível. Por exemplo, no caso de um proxy reverso, não mapeio nenhuma porta para os contêineres de trabalho e, em seguida, coloco nginx em seu próprio contêiner com-p 80:80
e a--link
para os outros. Dessa forma, não pode haver nenhum conflito de porta e o único ponto de acesso é através do nginx./etc/default/docker
é um arquivo de configuração usado pela configuração inicial. Se você passou do iniciante para o systemd, esse arquivo não será usado.16.04 apresenta novos desafios. Executei todas as etapas conforme mostrado Executando o Docker por trás do firewall ufw, MAS NÃO POSSO fazer o docker plus UFW funcionar no 16.04. Em outras palavras, não importa o que eu fiz, todas as portas do docker ficaram expostas globalmente à Internet. Até encontrar o seguinte: Como configurar o Docker 1.12+ para NÃO interferir no IPTABLES / FirewallD
Eu tive que criar o arquivo
/etc/docker/daemon.json
e colocar o seguinte em:Em seguida, emiti
sudo service docker stop
esudo service docker start
finalmente o docker está simplesmente seguindo as regras apropriadas no UFW.Dados adicionais: o Docker substitui o UFW!
fonte
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 aiptables
chave configurada:EDIT : isso pode fazer com que você perca a conexão com a Internet a partir de contêineres
Se o UFW estiver ativado, verifique se você pode acessar a Internet a partir de contêineres. Não se - você deve definir
DEFAULT_FORWARD_POLICY
comoACCEPT
sobre/etc/default/ufw
e aplicar o truque descrito aqui: https://stackoverflow.com/a/17498195/507564fonte
Uma solução rápida é executar o Docker e fazer o mapeamento de portas. Você sempre pode fazer
para impedir que seu Docker seja acessado de fora.
fonte
Uso de
/etc/docker/daemon.json
com conteúdopode parecer uma solução, mas só funciona até a próxima reinicialização . Depois disso, você poderá perceber que nenhum dos seus contêineres tem acesso à Internet; portanto, você não pode, por exemplo, executar ping em qualquer site. Pode ser um comportamento indesejado.
O mesmo se aplica à ligaçã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 colocá-lo atrás da UFW, independentemente do que aconteça e como você o cria, então há uma solução:
Depois de criar o
/etc/docker/daemon.json
arquivo, chame:então você configura a política de encaminhamento padrão no UFW para aceitação e usa:
Se você estiver prestes a usar o docker-compose, o IP a partir do comando acima deve ser substituído pelo IP da rede que o docker-compose cria ao executá-lo
docker-compose up
.Descrevi o problema e a solução de maneira mais abrangente neste artigo
Espero que ajude!
fonte
No meu caso, acabei modificando o iptables para permitir o acesso ao Docker apenas a partir de IPs específicos.
Conforme resposta da ESala :
Exemplo de registros adicionados ao iptables pelo Docker
Roteamento para a cadeia 'DOCKER':
Encaminhando pacotes da cadeia 'DOCKER' para o contêiner:
Você pode modificar o iptables para permitir o acesso à cadeia DOCKER apenas a partir do IP de origem especificado (por exemplo
1.1.1.1
):Você pode usar
iptables-save > /tmp/iptables.conf
eiptables-restore < /tmp/iptables.conf
despejar, editar e restaurar regras do iptables.fonte
Use --network = host ao iniciar o contêiner, para que o docker mapeie a porta para uma rede isolada somente para host, em vez da rede de ponte padrão. Não vejo maneiras legais de bloquear a rede em ponte. Como alternativa, você pode usar uma rede definida pelo usuário personalizada com isolamento.
fonte
Faça login no console do docker:
E depois dentro do seu docker console:
Adicione suas regras de ufw e ative o ufw
Para habilitar a opção do Docker "NET_ADMIN":
1. Stop Container:
docker para seu contêiner; 2.Get ID do recipiente:
a janela de encaixe inspeciona seu contêiner; 3.Modifique o hostconfig.json (caminho padrão do docker: / var / lib / docker, você pode alterar o seu)
4. Procure "CapAdd" e modifique null para ["NET_ADMIN"];
...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5.Reinicie a janela de encaixe na máquina host;
reinicialização do docker de serviço; 6.Start yourconatiner;
docker iniciar seu contêiner;
fonte
Eu costumava
docker-compose
iniciar vários contêineres e também tinha o problema de que uma porta estava exposta ao mundo ignorando as regras do ufw.A correção para disponibilizar apenas a porta para meus contêineres de docker foi essa alteração no meu
docker-compose.yml
arquivo:para isso:
Agora os outros docker-containers ainda podem usar a porta, mas não consigo acessá-la de fora.
fonte