Configurando firewall com Docker

cancio

Filipe Câncio

Posted on December 5, 2023

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
💖 💪 🙅 🚩
cancio
Filipe Câncio

Posted on December 5, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Configurando firewall com Docker
doker Configurando firewall com Docker

December 5, 2023