IPTABLES: Bloqueio de porta apenas para usuários externos

0

Eu tenho um servidor com dois contêineres docker em execução. Um deles é o frontend de um pequeno aplicativo, servido com http-server . Este aplicativo usava a API de busca de Javascript para buscar dados de um banco de dados realmente simples baseado no módulo json-server 'do Node.js, que está sendo executado no outro contêiner.

Acontece que json-server disponibiliza a porta 3000 para usuários externos, ou seja, se alguém apontar um navegador para http://example.com:3000 , meus dados estarão disponíveis sem a filtragem e a apresentação fornecidas pelo frontend. Não é isso que eu quero.

Eu gostaria de bloquear a porta 3000 para o mundo externo, enquanto permitia que meu outro contêiner do Docker buscasse dados normalmente. Eu acho que isso pode ser feito em uma base de IP, mas eu não sei como fazer isso.

Esta é minha configuração atual do Iptables, criada principalmente pelo próprio Docker como padrão.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:http-alt
ACCEPT     tcp  --  anywhere             172.17.0.3           tcp dpt:3000

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere 

Na configuração acima, o IP 172.17.0.2 é meu aplicativo de front-end, enquanto o 172.17.0.3 é o IP do meu contêiner de banco de dados.

O contêiner frontend está sendo iniciado com

docker run -p 80:8080 --name=frontend -d mtr/frontend

e o segundo com

docker run -p 3000:3000 --name=database -d mtr/database

Eu também considerei a possibilidade de ter alguma maneira do Docker para restringir este acesso, mas depois de muita pesquisa eu não consegui encontrar nada.

Alguma sugestão sobre como posso fazer isso acontecer?

    
por Ed de Almeida 27.09.2018 / 11:36

1 resposta

1

Desde que você "ACEITAR" conexões "tcp" de "qualquer lugar" para o host "172.17.0.3" na porta "tcp" "dpt: 3000" e eu acho que há também uma regra DNAT que encaminha todas as conexões de entrada para " you-public-ip-address: 3000 "para" 172.17.0.3:3000 "(veja iptables -t nat -L --line-numbers ) que é considerado normal.

Remova a regra DNAT da tabela NAT.

iptables -t nat -D PREROUTING <the-dnat-rule-number>
    
por 27.09.2018 / 13:46