Esta é a primeira vez que eu resolvo esse "problema" de rede para resolver com o docker e preciso de algumas entradas.
Esta é a minha situação:
-
Ubuntu 14.04 executando o NginX, como firewall e contêineres docker para executar um aplicativo de backend PHP.
-
A política padrão do Ufw é definida como DROP para INPUT e OUTPUT, bem como para FORWARD.
-
regra sysctl: net.ipv4.conf.all.forwarding = 0
Minha necessidade:
- um contêiner em execução no modo daemon, com a porta 8888 / tcp que aceita conexões do lado de fora, mas SOMENTE do ip 8.8.8.8 e, também, da porta 4444 / tcp, que escutam do localhost
Meu problema:
O Ufw está configurado para aceitar conexões de entrada na porta 8888 / tcp SOMENTE no ip 8.8.8.8. Portanto, basicamente:
sudo ufw allow in from 8.8.8.8 to any port 8888 proto tcp
Em seguida, eu corro o container com:
docker run -p 8888:8888/tcp -p 127.0.0.1:4444:4444/tcp [other options ]
Em seguida, executando nmap -p 8888 45.45.45.45
de uma máquina que NÃO tenha o ip = 8.8.8.8, espero obter port filtered
.
Mas ....
Host is up (0.056s latency).
PORT STATE SERVICE
8888/tcp open unknown
Eu tentei executar o contêiner novamente sem -p 8888:8888/tcp
e, em seguida, tentei executar novamente o nmap e ...
Host is up (0.061s latency).
PORT STATE SERVICE
8888/tcp filtered unknown
Portanto, parece que, corrija-me se estiver errado, as regras do docker substituem as do ufw.
Eu pesquisei uma maneira de permitir o tráfego de entrada em um contêiner somente a partir de um endereço específico, e encontrei algo como:
iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP
E funcionou:
PORT STATE SERVICE
8888/tcp filtered unknown
Nmap done: 1 IP address (1 host up) scanned in 15.05 seconds
Minha pergunta é:
é a solução acima indicada para o meu caso? Quero dizer: agindo como acima, estou sobrescrevendo regra ufw allow in from 8.8.8.8 to any port 8888 proto tcp
com uma regra docker que diz "expor portas somente se o tráfego vem do ip 8.8.8.8" ... esta é a abordagem correta?
não seria melhor deixar o ufw fazer o "trabalho ruim" de descartar pacotes indesejados e, em seguida, apenas encaminhar o tráfego de portas filtradas para a janela de encaixe? há uma maneira de fazer isso?
Eu evitaria esta solução porque, sendo uma regra iptable da cadeia DOCKER, essa regra envolve todos os containers que eu tenho atualmente ou terei.
Obrigado.