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:80libera a porta 80 na porta 8080 da maquina física -
--cap-add=NET_ADMIN --cap-add=NET_RAWpermite 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áquinaclientcom 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)