Vincular as portas do contêiner do docker somente ao endereço específico do servidor externo

2

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.

    
por sciakysystem 14.08.2015 / 19:09

2 respostas

0

No Linux, as regras do ufw e do docker são implementadas em cima do netfilter . Então é iptables . Portanto, não é possível fazer com que o ufw faça algumas coisas e obtenha as regras do docker para fazer as outras - todas essas coisas serão feitas pelo subsistema subjacente do netfilter.

O comando iptables-save é útil para descarregar tudo o que foi configurado para o netfilter, incluindo regras de docker e ufw, e então (com algum esforço) você pode seguir as correntes e ver o que está fazendo.

    
por 17.08.2015 / 15:54
0

Observe que, quando o daemon do Docker é iniciado, ele adiciona DOCKER chain às regras *filter e *nat . Se você limpar todas as regras do iptables depois, usando por exemplo ufw, você pode quebrar o comportamento esperado. Quando você inicia um contêiner, as regras FORWARD são adicionadas à DOCKER chain. O Docker está executando o comando da seguinte forma:

iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.2 --dport 8888 -j ACCEPT

No entanto, isso não abrirá nenhuma porta para o mundo, porque o Docker não está modificando INPUT regras de iptables . Então, isso significa que há algo errado com suas regras do ufw.

Se você não quiser que o Docker modifique suas regras iptables , poderá desativá-lo quando estiver na configuração do serviço Docker, adicionando --iptables=false .

    
por 31.01.2016 / 12:29