Configurando firewall com Docker
Tags: doker, iptables, linux, firewall
Published: 2023-12-05 16:04:16

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](https://hub.docker.com/r/filipecancio/kali-iptables) e a [filipecancio/server-iptables](https://hub.docker.com/r/filipecancio/server-iptables). Vamos fazer o pull das duas.

```bash
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:

```bash
# 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. 

```bash
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á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:
```bash
ping 172.17.0.2
```
Ele irá normalmente pegar o ping de `server`.

Com isso vamos adicionar nossa primeira regra em `server`:

```bash
iptables -I INPUT -p ICMP -j DROP
```
Instantaneamente o ping para. Se excluimos a mesma regra com o comando abaixo, automaticamente o ping volta. 
```bash
iptables -D INPUT -p ICMP -j DROP
```

Se usamos a flag REJECT ao inves de DROP o ping sera recusado. 
```bash
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:
```bash
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`:

```bash
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:

```bash
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:

```bash
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.

```bash
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:

```bash
iptables -D INPUT -p TCP -s 172.64.201.27 -j REJECT
iptables -D INPUT -p TCP -s 172.64.200.27 -j REJECT
```