DEV Community

Cover image for Configurando firewall com Docker
Filipe Câncio
Filipe Câncio

Posted on

Configurando firewall com Docker

Neste post usaremos o iptables para configurar firewalls usando containers dockers.
O iptables é uma ferramenta para configurar firewalls e Nat disponível para dispositivos linux. Dentre as variadas funcionalidades, iremos configurar aqui no projeto o acesso de um container docker com outro. Para isso, precisaremos duas imagens docker: a filipecancio/kali-iptables e a filipecancio/server-iptables. Vamos fazer o pull das duas.

docker pull filipecancio/kali-iptables
docker pull filipecancio/server-iptables
Enter fullscreen mode Exit fullscreen mode

Criaremos então um máquina com o nome server com o server-iptables e outra client com o kali linux:

# Criando a maquina server
docker run -it --rm --cap-add=NET_ADMIN --cap-add=NET_RAW -d -p 8080:8080 --name server filipecancio/server-iptables

# Criando a maquina client
docker run --name client --cap-add=NET_ADMIN --cap-add=NET_RAW -i -t filipecancio/kali-iptables bash
Enter fullscreen mode Exit fullscreen mode

A máquina server não foi executada automaticamente pelo bash pois ela é uma aplicação nodeJS rodando em uma máquina alpine, então usaremos o comando abaixo para acessá-lo (o mesmo comando pode ser usado para acessar o client posteriormente.

docker exec -it --user root server sh

# caso queira acessar novamente o client via bash
docker exec -it client /bin/bash
Enter fullscreen mode Exit fullscreen mode

Note que usaremos a flag --user root para poder fazer as alterações de root na maquina

Se você usar o navegador com endereço localhost:8080 poderá ver a página inicial da aplicação com informações em JSON, se você acessar a localhost:8080/pikachu verá informações do pokemon pikachu vindas de https://pokeapi.co/. Mas não faremos interações com a máquina física nesse post. Por padrão o docker possui configurações de iptables que permitem criações de containers seguros. os comandos acima possuem algumas flags que modificam algumas regras internas do docker:

  • -p 8080:80 libera a porta 80 na porta 8080 da maquina física
  • --cap-add=NET_ADMIN --cap-add=NET_RAW permite que usemos o container como um servidor e configuremos suas próprias regras de firewall. Para simplificar o estudo do iptables nesse post, não iremos fazer configurações avançadas com o docker, apenas as interações simples da máquina client com a server.

Bloqueio de ping

Vamos identificar os ips das máquinas, para isso, com o bash das duas máquinas ligadas vamos digitar o comando ifconfig e pegar os ips no trecho inet. De modo respectivo vamo supor que temos os seguintes ips:

  • client: 172.17.0.3
  • server: 172.17.0.2

Vamos testar o ping do client para o servidor:

ping 172.17.0.2
Enter fullscreen mode Exit fullscreen mode

Ele irá normalmente pegar o ping de server.

Com isso vamos adicionar nossa primeira regra em server:

iptables -I INPUT -p ICMP -j DROP
Enter fullscreen mode Exit fullscreen mode

Instantaneamente o ping para. Se excluimos a mesma regra com o comando abaixo, automaticamente o ping volta.

iptables -D INPUT -p ICMP -j DROP
Enter fullscreen mode Exit fullscreen mode

Se usamos a flag REJECT ao inves de DROP o ping sera recusado.

iptables -I INPUT -p ICMP -j REJECT
Enter fullscreen mode Exit fullscreen mode

Bloqueio de TCP

Usando a ferramenta curl podemos acessar a máquina server via http com o comando GET:

curl -X GET "172.17.0.2:8080"
Enter fullscreen mode Exit fullscreen mode

Ele irá apresentar um html semelhante ao visto no localhost:8080. Para bloquear o acesso para client, usaremos seguinte comando em server:

iptables -I INPUT -p TCP -s 172.17.0.3 -j DROP
Enter fullscreen mode Exit fullscreen mode

Ao tentarmos novamente acessar o endereço 172.17.0.2:80 em client, não temos acesso. Para remover a regra basta executar o comando abaixo:

iptables -D INPUT -p TCP -s 172.17.0.3 -j DROP
Enter fullscreen mode Exit fullscreen mode

Bloqueando o ip do site

Lembra que o endereço localhost:8080/pikachu levava à um json com informações detalhadas do pikachu via PokeApi? vamos bloquear o acesso ao ip da PokeApi agora. Digite comando abaixo:

curl -X GET "172.17.0.2:8080/pikachu"
Enter fullscreen mode Exit fullscreen mode

Você verá todas as informações em json do pikachu. Considerando o ip 172.64.201.27 e 172.64.200.27 para o site https://pokeapi.co/. Agora ao tentar novamente, ele irá rejeitar a conexão, mas o 172.17.0.2:8080 funcionará normalmente.

iptables -I INPUT -p TCP -s 172.64.201.27 -j REJECT
iptables -I INPUT -p TCP -s 172.64.200.27 -j REJECT
Enter fullscreen mode Exit fullscreen mode

para desfazer as regras basta digitar os seguintes comandos:

iptables -D INPUT -p TCP -s 172.64.201.27 -j REJECT
iptables -D INPUT -p TCP -s 172.64.200.27 -j REJECT
Enter fullscreen mode Exit fullscreen mode

Top comments (0)