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

Do your career a big favor. Join DEV. (The website you're on right now)

It takes one minute, it's free, and is worth it for your career.

Get started

Community matters

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay