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
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
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
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áquinaclient
com aserver
.
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
Ele irá normalmente pegar o ping de server
.
Com isso vamos adicionar nossa primeira regra em server
:
iptables -I INPUT -p ICMP -j DROP
Instantaneamente o ping para. Se excluimos a mesma regra com o comando abaixo, automaticamente o ping volta.
iptables -D INPUT -p ICMP -j DROP
Se usamos a flag REJECT ao inves de DROP o ping sera recusado.
iptables -I INPUT -p ICMP -j REJECT
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"
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
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
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"
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
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
Top comments (0)